关于大数据:大数据开发Spark共享变量之累加器和广播变量

42次阅读

共计 1820 个字符,预计需要花费 5 分钟才能阅读完成。

Spark 累加器与播送变量

一、简介

在 Spark 中,提供了两种类型的共享变量:累加器 (accumulator) 与播送变量 (broadcast variable):

  • 累加器 :用来对信息进行聚合,次要用于累计计数等场景;
  • 播送变量 :次要用于在节点间高效散发大对象。

二、累加器

这里先看一个具体的场景,对于失常的累计求和,如果在集群模式中应用上面的代码进行计算,会发现执行后果并非预期:

var counter = 0
val data = Array(1, 2, 3, 4, 5)
sc.parallelize(data).foreach(x => counter += x)
 println(counter)

counter 最初的后果是 0,导致这个问题的次要起因是闭包。

2.1 了解闭包

1. Scala 中闭包的概念

这里先介绍一下 Scala 中对于闭包的概念:

var more = 10
val addMore = (x: Int) => x + more

如上函数 addMore 中有两个变量 x 和 more:

  • x : 是一个绑定变量 (bound variable),因为其是该函数的入参,在函数的上下文中有明确的定义;
  • more : 是一个自在变量 (free variable),因为函数字面量本生并没有给 more 赋予任何含意。

依照定义:在创立函数时,如果须要捕捉自在变量,那么蕴含指向被捕捉变量的援用的函数就被称为闭包函数。

2. Spark 中的闭包

也能够参考:https://blog.csdn.net/hu_lichao/article/details/112451982

在理论计算时,Spark 会将对 RDD 操作合成为 Task,Task 运行在 Worker Node 上。在执行之前,Spark 会对工作进行闭包,如果闭包内波及到自在变量,则程序会进行拷贝,并将正本变量放在闭包中,之后闭包被序列化并发送给每个执行者。因而,当在 foreach 函数中援用 counter 时,它将不再是 Driver 节点上的 counter,而是闭包中的正本 counter,默认状况下,正本 counter 更新后的值不会回传到 Driver,所以 counter 的最终值依然为零。

须要留神的是:在 Local 模式下,有可能执行 foreach 的 Worker Node 与 Diver 处在雷同的 JVM,并援用雷同的原始 counter,这时候更新可能是正确的,然而在集群模式下肯定不正确。所以在遇到此类问题时应优先应用累加器。

累加器的原理实际上很简略:就是将每个正本变量的最终值传回 Driver,由 Driver 聚合后失去最终值,并更新原始变量。

2.2 应用累加器

SparkContext 中定义了所有创立累加器的办法,须要留神的是:被中横线划掉的累加器办法在 Spark 2.0.0 之后被标识为废除。

应用示例和执行后果别离如下:

val data = Array(1, 2, 3, 4, 5)
// 定义累加器
val accum = sc.longAccumulator("My Accumulator")
sc.parallelize(data).foreach(x => accum.add(x))
// 获取累加器的值
accum.value

三、播送变量

在下面介绍中闭包的过程中咱们说道每个 Task 工作的闭包都会持有自在变量的正本,如果变量很大且 Task 工作很多的状况下,这必然会对网络 IO 造成压力,为了解决这个状况,Spark 提供了播送变量。

播送变量的做法很简略:就是不把正本变量散发到每个 Task 中,而是将其散发到每个 Executor,Executor 中的所有 Task 共享一个正本变量。

// 把一个数组定义为一个播送变量
val broadcastVar = sc.broadcast(Array(1, 2, 3, 4, 5))
// 之后用到该数组时应优先应用播送变量,而不是原值
sc.parallelize(broadcastVar.value).map(_ * 10).collect()

四、察看变量

创立的 Accumulator 变量的值可能在 Spark Web UI 上看到,在创立时应该尽量为其命名,上面探讨如何在 Spark Web UI 上查看累加器的值

五、参考资料

RDD Programming Guide

https://www.cnblogs.com/cc11001100/p/9901606.html

https://www.cnblogs.com/zz-ksw/p/12448650.html

吴邪,小三爷,混迹于后盾,大数据,人工智能畛域的小菜鸟。
更多请关注

正文完
 0