From 824008752199f165f9bd879dfc71dea724ee5412 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BD=97=E7=A5=A5?= <1366971433@qq.com> Date: Tue, 4 Jun 2019 15:07:11 +0800 Subject: [PATCH] =?UTF-8?q?Spark=E7=B4=AF=E5=8A=A0=E5=99=A8=E4=B8=8E?= =?UTF-8?q?=E5=B9=BF=E6=92=AD=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/Spark累加器与广播变量.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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聚合后得到最终值,并更新原始变量。