var counter = 0
val data = Seq(1,2,3)
var rdd = sc.parallelize(data)
rdd.foreach(x=>counter+=x)
println(counter)
这是为什么呢?所有对RDD的函数调用,虽然代码上看起来在Driver程序中运行的,但实际计算都不在本地。即使单机本地模式运行,也是在单独的执行器进程上运行。每个job的执行,都会经历序列化、网络传输、反序列化和运行的过程。
在执行过程中,只是计算节点上的counter会自增,而Driver程序的counter不会发生变化。执行完成后,结果返回到Driver程序中(示例中的foreach没有返回值),而Driver中的counter依然还是当初的那个Driver,值为0.