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
。
什么优势,如果我们设定
@transient
未初始化序列化时,它lazy val
?是否有意义的做一个非初始化的
val
瞬态序列化,知道没有什么会被序列化,就像上面的例子?@transient lazy val
如何连载?它被视为一种方法或别的东西吗?
关于序列化@transient lazy val
和编译的java字节码的一些细节很棒。