暂无说说

共享变量

pyspark jiajun 8个月前 (03-02) 96次浏览 0个评论 扫描二维码

Spark 中有两个重要抽象,一个是 RDD,另一个是共享变量,这里介绍共享变量。

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

广播变量

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

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

broadcastVar = sc.broadcast([1, 2, 3])
broadcastVar.value

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

累加器

累加器是仅仅被相关操作累加的变量,通常可以被用来实现计数器(counter)和求和(sum)。Spark 原生地支持数值型(numeric)的累加器,程序开发人员可以编写对新类型的支持。如果创建累加器时指定了名字,则可以在 Spark UI 界面看到,这有利于理解每个执行阶段的进程。
一个数值型的累加器,可以通过调用 SparkContext.accumulator()来创建。运行在集群中的任务,就可以使用 add 方法来把数值累加到累加器上,但是,这些任务只能做累加操作,不能读取累加器的值,只有任务控制节点(Driver Program)可以使用 value 方法来读取累加器的值。
下面是一个代码实例,演示了使用累加器来对一个数组中的元素进行求和:

accum = sc.accumulator(0)
sc.parallelize([1, 2, 3, 4]).foreach(lambda x : accum.add(x))
accum.value

 

喜欢 (1)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址