PySpark 共享变量之 广播变量和累加器

一、广播变量

1. 什么是广播变量?

广播变量(Broadcast)是可以在内存的所有节点中被访问,用于缓存变量;

在这里插入图片描述
通常情况下,当一个RDD的很多操作都需要使用Driver中定义的变量时,每次操作,Driver都要把变量发送给Worker节点一次,如果这个变量中的数据很大的话,会产生很高的传输负载,导致执行效率降低。

如果使用了广播变量技术,则Driver端将共享数据只会发送到每个【Executor】一份。Executor中的所有【Task】都复用这个对象。每次操作时【Executor】可以直接获取本地保存的数据副本,不需要多次传输。

2. 使用方式

# 1. 将本地list 标记成广播变量即可
broadcast = sc.broadcast(stu_info_list)

# 2. 使用广播变量,从broadcast对象中取出本地list对象即可
value = broadcast.value

先把要广播的变量放入到broadcast内部,然后从broadcast内部在取出来用,中间传输的是broadcast这个对象,而且spark只会给每个executor发一份。

二、累加器

1. 什么是累加器?

累加器(Accumulator)是只能用来做加法的变量;

Spark提供的Accumulator,主要用于多个节点对一个变量进行共享性的操作。Accumulator只提供了累加的功能,并给我们提供了多个Task对一个变量并行操作的功能。但是Task只能对Accumulator进行累加操作,不能读取它的值。只有Driver程序可以读取Accumulator的值。

2. 使用方式

# 1. 在Driver端定义累加器,赋初始值
acc=sc.accumulator(0)

# 2. 在Executor端每次累加1
acc+=1  或者acc.add(1)

# 3. 在Driver获取累加器的结果
acc.value

注意:使用累加器的时候,要注意,因为rdd是过程数据,如果rdd被多次使用可能会重新构建此rdd,如果累加器累加代码,存在重新构建的步骤中,累加器累加代码可能被多次执行。可以采取加缓存或Checkpoint即可

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值