理解Spark的闭包
对 Spark 来说, 最困难的事情之一就是在跨集群执行代码时了解变量和方法的范围和生命周期。RDD 在其范围之外修改变量的操作可能会经常引起混淆。在下面的示例中, 我们将查看使用 foreach () 递增计数器的代码, 但其他操作也可能发生类似的问题。
举例
考虑下面简单的RDD元素和,它的行为可能会有所不同,这取决于是否在同一个 JVM 中执行。这方面的一个常见示例是在本地模式下运行 spark (--master=local[n])与将 spark 应用程序部署到集群(例如,通过 spark-submit 提交到yarn):
var counter = 0
var rdd = sc.parallelize(data)
// 这是错误的做法
rdd.foreach(x => counter += x)
println("Counter value: " + counter)