diff --git a/notes/Spark累加器与广播变量.md b/notes/Spark累加器与广播变量.md index 6cc3bb8..14bcaea 100644 --- a/notes/Spark累加器与广播变量.md +++ b/notes/Spark累加器与广播变量.md @@ -12,8 +12,8 @@ 在Spark中,提供了两种类型的共享变量:累加器(accumulator)与广播变量(broadcast variable): -+ 累加器:用来对信息进行聚合,主要用于累计计数等场景; -+ 广播变量:主要用于在节点间高效分发大对象。 ++ **累加器**:用来对信息进行聚合,主要用于累计计数等场景; ++ **广播变量**:主要用于在节点间高效分发大对象。 ## 二、累加器 @@ -52,9 +52,9 @@ val addMore = (x: Int) => x + more **2. Spark中的闭包** -在实际计算时,Spark会将对RDD操作分解为Task,Task运行在Worker Node上。在执行之前,Spark会对任务进行闭包,如果闭包内涉及到自由变量,则程序会进行拷贝,并将副本变量放在闭包中,之后闭包被序列化并发送给每个执行者。因此,当在foreach函数中引用`counter`时,它将不再是Driver节点上的`counter`,而是闭包中的副本`counter`,默认情况下,副本`counter`更新后的值不会回传到Driver,所以计数器的最终值仍然为零。 +在实际计算时,Spark会将对RDD操作分解为Task,Task运行在Worker Node上。在执行之前,Spark会对任务进行闭包,如果闭包内涉及到自由变量,则程序会进行拷贝,并将副本变量放在闭包中,之后闭包被序列化并发送给每个执行者。因此,当在foreach函数中引用`counter`时,它将不再是Driver节点上的`counter`,而是闭包中的副本`counter`,默认情况下,副本`counter`更新后的值不会回传到Driver,所以`counter`的最终值仍然为零。 -需要注意的是:在Local模式下,**有可能**执行foreach的Worker Node与Diver处在相同的JVM,并引用相同的原始`counter`,这时候更新可能是正确的,但是在集群模式下却不行。所以在遇到此类问题时应优先使用累加器。 +需要注意的是:在Local模式下,有可能执行`foreach`的Worker Node与Diver处在相同的JVM,并引用相同的原始`counter`,这时候更新可能是正确的,但是在集群模式下一定不正确。所以在遇到此类问题时应优先使用累加器。 累加器的原理实际上很简单:就是将每个副本变量的最终值传回Driver,由Driver聚合后得到最终值,并更新原始变量。