共享变量的使用

来源:互联网 发布:上下课铃声软件 编辑:程序博客网 时间:2024/05/21 06:13

在默认情况下,当Spark在集群的多个不同节点的多个任务上并行运行一个函数时,它会把函数中涉及到的每个变量,在每个任务上都生成一个副本。但是,有时候,需要在多个任务之间共享变量,或者在任务(Task)和任务控制节点(Driver Program)之间共享变量。为了满足这种需求,Spark提供了两种类型的变量:广播变量(broadcast variables)和累加器(accumulators)。广播变量用来把变量在所有节点的内存之间进行共享。累加器则支持在所有不同节点之间进行累加计算(比如计数或者求和)。

广播变量

广播变量(broadcast variables)允许程序开发人员在每个机器上缓存一个只读的变量,而不是为机器上的每个任务都生成一个副本。通过这种方式,就可以非常高效地给每个节点(机器)提供一个大的输入数据集的副本。Spark的“动作”操作会跨越多个阶段(stage),对于每个阶段内的所有任务所需要的公共数据,Spark都会自动进行广播。通过广播方式进行传播的变量,会经过序列化,然后在被任务使用时再进行反序列化。这就意味着,显式地创建广播变量只有在下面的情形中是有用的:当跨越多个阶段的那些任务需要相同的数据,或者当以反序列化方式对数据进行缓存是非常重要的。

 

可以通过调用SparkContext.broadcast(v)来从一个普通变量v中创建一个广播变量。这个广播变量就是对普通变量v的一个包装器,通过调用value方法就可以获得这个广播变量的值,具体代码如下:

scala> val broadcastVar =sc.broadcast(Array(1, 2, 3))

broadcastVar:org.apache.spark.broadcast.Broadcast[Array[Int]] = Broadcast(0)

scala> broadcastVar.value

res0: Array[Int] = Array(1, 2, 3)

 

这个广播变量被创建以后,那么在集群中的任何函数中,都应该使用广播变量broadcastVar的值,而不是使用v的值,这样就不会把v重复分发到这些节点上。此外,一旦广播变量创建后,普通变量v的值就不能再发生修改,从而确保所有节点都获得这个广播变量的相同的值。

累加器

累加器是仅仅被相关操作累加的变量,通常可以被用来实现计数器(counter)和求和(sum)。Spark原生地支持数值型(numeric)的累加器,程序开发人员可以编写对新类型的支持。如果创建累加器时指定了名字,则可以在Spark UI界面看到,这有利于理解每个执行阶段的进程。

一个数值型的累加器,可以通过调用SparkContext.longAccumulator()或者SparkContext.doubleAccumulator()来创建。运行在集群中的任务,就可以使用add方法来把数值累加到累加器上,但是,这些任务只能做累加操作,不能读取累加器的值,只有任务控制节点(Driver Program)可以使用value方法来读取累加器的值。

下面是一个代码实例,演示了使用累加器来对一个数组中的元素进行求和:

scala> val accum =sc.longAccumulator("My Accumulator")

accum:org.apache.spark.util.LongAccumulator = LongAccumulator(id: 0, name: Some(MyAccumulator), value: 0)

scala> sc.parallelize(Array(1, 2, 3,4)).foreach(x => accum.add(x))

scala> accum.value

res1: Long = 10

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 脸部疱疹怎么引起的 脑膜瘤是怎么引起的 阴毛囊炎怎么引起的 脚痛风是怎么引起的 寻常疣是什么引起的 脂肪瘤是怎么引起的 脑垂体瘤是什么引起的 腰痛是什么原因引起的 坐骨神经痛怎么引起的 传染性软疣怎么引起的 左背痛是什么原因引起的 脑供血不足是怎么引起的 手臂发麻是什么原因引起的 小腿浮肿是什么原因引起的 腰椎管狭窄怎么引起的 脚后跟疼是什么原因引起的 腿痛有哪些原因引起 末梢神经炎怎么引起的 腿浮肿是什么原因引起的 血糖高是什么原因引起的 腰椎滑脱是什么引起的 坐骨神经痛是怎么引起的 肾功能不全怎么引起的 腰困是什么原因引起的 腰肌劳损是怎么引起的 泡疹是什么原因引起的 嘴唇疱疹是怎么引起的 肾功能衰竭是怎么引起的 带状疱疹是什么引起 坐骨神经痛是怎样引起的 病毒性软疣怎么引起的 坐骨神经疼是什么引起的 坐骨神经是怎么引起的 腰椎管狭窄是什么引起的 病毒性疱疹怎么引起的 衣原体感染怎么引起的 颈椎痛是什么原因引起的 腰部带状疱疹是怎么引起的 妇科囊肿是什么引起的 胆囊息肉是什么引起的 阴毛囊炎是怎么引起的