可能最大的优势是共享内存,特别是处理广播对象。因为这些对象被认为是只读可以有多个线程之间共享。
在方案中,当你使用一个单一的任务/执行你需要的副本每个JVM所以用N个任务有N份。对于大型对象,这会是一个严重的开销。
相同的逻辑可被应用于其他共享对象。
因为它已经说过广播变量是一回事。
另一种是与并发问题。看看这个代码:
var counter = 0
var rdd = sc.parallelize(data)
rdd.foreach(x => counter += x)
println(counter)
结果可以是根据不同的,不管是本地的或在部署于簇火花执行(具有不同的JVM)。在后一种情况下,parallelize
方法拆分执行人之间的计算。封闭件(需要为每个节点执行其任务环境)被计算,这意味着,每一个执行接收counter
的副本。每个执行器看到其自己的变量的副本,从而计算的结果为0,因为没有执行程序的引用的权利对象。在另一方面counter
一个JVM是每一个工人可见。
当然,有一种方法,以避免 - 使用Acumulator
s(see here)。
最后但并非最不重要的内存持续RDD
s时(默认cache
方法保存级别MEMORY_ONLY
),这将是一个JVM中可见。这也可以通过使用克服OFF_HEAP
(这是在实验2.4.0)。更多here。