8

使用spark时,有时需要在每个任务中发送不可序列化的对象。使用或不使用@transient序列化lazy val时的区别

一个常见的模式是@transient lazy val,e.g

class A(val a: Int) 

def compute(rdd: RDD[Int]) = { 
    // lazy val instance = { 
    @transient lazy val instance = { 
    println("in lazy object") 
    new A(1) 
    } 
    val res = rdd.map(instance.a + _).count() 
    println(res) 
} 

compute(sc.makeRDD(1 to 100, 8)) 

我发现@transient是没有必要在这里。 lazy val已经可以在每个任务执行时创建不可序列化。但人们建议使用@transient

  1. 什么优势,如果我们设定@transient未初始化序列化时,它lazy val

  2. 是否有意义的做一个非初始化的val瞬态序列化,知道没有什么会被序列化,就像上面的例子?

  3. @transient lazy val如何连载?它被视为一种方法或别的东西吗?

关于序列化@transient lazy val和编译的java字节码的一些细节很棒。

回答

相关问题