This commit is contained in:
罗祥
2019-05-27 18:01:20 +08:00
parent ec5c799eb1
commit 334493f7cb
3 changed files with 130 additions and 1 deletions

View File

@ -52,7 +52,7 @@ val addMore = (x: Int) => x + more
**2. Spark中的闭包**
在实际计算时Spark会将对RDD操作分解为TaskTask运行在Worker Noode上。在执行之前Spark会对任务进行闭包如果闭包内涉及到自由变量则程序会进行拷贝并将副本变量放在闭包中之后闭包被序列化并发送给每个执行者。因此当在foreach函数中引用`counter`它将不再是Driver节点上的`counter`,而是闭包中的副本`counter`,默认情况下,副本`counter`更新后的值不会回传到Driver所以计数器的最终值仍然为零。
在实际计算时Spark会将对RDD操作分解为TaskTask运行在Worker Node上。在执行之前Spark会对任务进行闭包如果闭包内涉及到自由变量则程序会进行拷贝并将副本变量放在闭包中之后闭包被序列化并发送给每个执行者。因此当在foreach函数中引用`counter`它将不再是Driver节点上的`counter`,而是闭包中的副本`counter`,默认情况下,副本`counter`更新后的值不会回传到Driver所以计数器的最终值仍然为零。
需要注意的是在Local模式下**有可能**执行foreach的Worker Node与Diver处在相同的JVM并引用相同的原始`counter`,这时候更新可能是正确的,但是在集群模式下却不行。所以在遇到此类问题时应优先使用累加器。