广播变量和累加器——学习笔记

广播变量

为什么会用广播变量?

  • 本地list对象被发送到每个分区的处理线程上使用,也就是一个executor内,其实存放了两份一样的数据,executor是进程,进程内资源共享,这两份数据没有必要,造成内存资源浪费。
  • 如果将本地list对象标记为广播变量对象,那么当出现上述情况下,spark就会给每个executor来一份数据,而不是像原本那样,每个分区的处理线程都来一份,节省内存
  • 使用广播变量后,每个executor只会收到一份数据集,内部的各个线程(分区)共享这一份数据集

使用方法

# 1.将本地list标记为广播变量
broadcast = sc.broadcast(list)

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

# 先把list放进broadcast内部,然后从broadcast内部取出,中间传输的是broadcast这个对象
# 主要中间传输的是broadcast对象,spark就会检查每个executor中是否有broadcast对象,如果没有,则传输

累加器

为什么使用累加器?

  • 当count来自driver对象,executor中的map算子需要count对象时,driver会将count对象复制发送给每个executor,所以不管executor中累加到多少,都和driver这个count无关,这时就需要使用累加器实现全局变量定义。

使用方法

sc.accumulator(初始值)
# 这个对象唯一和前面提到的count不同的是这个对象可以从各个executor中收集到他们的执行结果,作用回自己身上

注意事项

  • 使用累加器的时候,要注意,因为rdd是过程数据,如果rdd被多次使用,可能会重新构建rdd。如果累加器代码在重新构建的步骤中,累加器累加代码就会被执行多次
  • 解决方法:将rdd加入缓存或者CheckPoint即可
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值