假设我有一个对象,我需要对该对象的成员进行一些操作:arr
。
object A {
val arr = (0 to 1000000).toList
def main(args: Array[String]): Unit = {
//...init spark context
val rdd: RDD[Int] = ...
rdd.map(arr.contains(_)).saveAsTextFile...
}
}
广播的arr
和没有广播的有什么区别?即
val arrBr = sc.broadcast(arr)
rdd.map(arrBr.value.contains(_))
和
rdd.map(arr.contains(_))
在我看来,对象A
是一个单例对象,因此它将通过Spark中的节点传输。
在这种情况下是否有必要使用广播?
在这种情况下
rdd.map(arr.contains(_))
arr
针对每项任务进行了序列化
而在
val arrBr = sc.broadcast(arr)
rdd.map(arrBr.value.contains(_))
这只是每个遗嘱执行人一次。
因此,在处理大型数据结构时应使用广播。