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))

猜你喜欢

转载自blog.csdn.net/zhangbaoanhadoop/article/details/77731734