【SPARK】- 共享变量

Spark 中的两个重要抽象是RDD和共享变量

当Spark在集群的多个不同节点的多个任务上,并行运行一个函数时,他会把函数中涉及到的每个变量在每个任务上都生成一个副本。

在做计算的时候,几个task任务需要公共数据,通过设置共享变量,减少开销---->设置几个共享变量(只读),将其发送至executor,所有task共享这些只读变量

为了满足这种需求,Spark提供了两种类型的变量:广播变量(broadcast variables)、累加器(accumulators)

广播变量:允许程序开发人员在每个机器上缓存一个只读变量,而不是为机器上的每个任务都生成一个副本

Spark的“行动”操作会跨越多个阶段(stage),对于每个阶段内的所有任务所需的公共数据,Spark都会自动进行广播,广播到executor(只广播一次)。

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

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

累加器:是仅仅被相关操作累加的变量,通常可以被用来实现计数器(counter)和求和(sum)。Spark原生地支持数据值型(numeric)的累加器,程序开发人员可以编写对新类型的支持

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

猜你喜欢

转载自blog.csdn.net/u010530712/article/details/82738230
今日推荐