【发布时间】:2016-04-18 13:50:30
【问题描述】:
在spark上工作,有时我需要在每个任务中发送一个不可序列化的对象。
一个常见的模式是@transient lazy val,例如
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字节码很棒。
【问题讨论】:
标签: scala serialization apache-spark lazy-initialization transient