在我的计算中,我
bc
,val shared = f(bc)
为了避免计算所有RDD项目的shared
数据,我可以使用.mapPartitions
但是我有更多的分区而不是执行程序。因此,它运行共享数据的计算次数超过了必要的时间。
我找到了一个简单的方法来计算每个执行器只有一次共享数据(我理解的是实际运行spark任务的JVM):在广播数据上使用lazy val
。
// class to be Broadcast
case class BC(input: WhatEver){
lazy val shared = f(input)
}
// in the spark code
val sc = ... // init SparkContext
val bc = sc.broadcast(BC(...))
val initRdd = sc.parallelize(1 to 10000, numSlices = 10000)
initRDD.map{ i =>
val shared = bc.value.shared
... // run computation using shared data
}
我认为这符合我的要求,但
shared
失败,我认为它将重新计算所有可能重试的RDD项目,而不是简单地用一个唯一错误停止整个作业。那么,有更好的方法吗?