spark-broadcast&accumulator使用

累加器
  1. Accumulator是spark提供的累加器,顾名思义,该变量只能够增加。
  2. 只有driver能获取到Accumulator的值(使用value方法),Task只能对其做增加操作(使用 +=)。你也可以在为Accumulator命名(不支持Python),这样就会在spark web ui中显示,可以帮助你了解程序运行的情况。
  3. 使用Accumulator时,为了保证准确性,只使用一次action操作。如果需要使用多次则使用cache或persist操作切断依赖。;每一次action都会触发前面的transform
  4. rdd1=sc.parallelize([1,2,3,4,5])
    # accumulator=sc.accumulator(0,'ac') #python不支持命名
    accumulator=sc.accumulator(0)
    rdd1.foreach(lambda x:accumulator.add(x))
    print(accumulator.value)
广播变量
  1. 广播变量(groadcast varible)为只读变量,它有运行SparkContext的驱动程序创建后发送给参与计算的节点。对那些需要让工作节点高效地访问相同数据的应用场景,比如机器学习。我们可以在SparkContext上调用broadcast方法创建广播变量:
  2. 广播变量也可以被非驱动程序所在节点(即工作节点)访问,访问方法就是调用该变量的value方法
  3. 使用广播变量可以优化资源提高性能
    • 广播变量的优势:是因为不是每个task一份变量副本,而是变成每个节点的executor才一份副本。这样的话,就可以让变量产生的副本大大减少。
    • 广播变量,初始的时候,就在Drvier上有一份副本。task在运行的时候,想要使用广播变量中的数据,此时首先会在自己本地的Executor对应的BlockManager中,尝试获取变量副本;如果本地没有,BlockManager,也许会从远程的Driver上面去获取变量副本;也有可能从距离比较近的其他节点的Executor的BlockManager上去获取,并保存在本地的BlockManager中;BlockManager负责管理某个Executor对应的内存和磁盘上的数据,此后这个executor上的task,都会直接使用本地的BlockManager中的副本。
  4. # rdd1=sc.parallelize([1,2,3,4,5])
    # num=3
    # broadcastFactor=sc.broadcast(num)
    # rdd2=rdd1.map(lambda x:x*broadcastFactor.value)
    # rdd2.foreach(lambda x:print(x))
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值