Spark基础(4)共享变量

南笙酒味 提交于 2020-03-06 09:11:12
  • 广播变量

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

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

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

scala> val broadcastVar = sc.broadcast(Array(1,2,3))
scala> broadcastVar.value
res0:Array[Int] = Array(1,2,3)

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

完整程序:

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
object BroadCastValue{
    def main(args:Array[String]):Unit={
        val conf = new SparkConf().setAppName("BroadCastValue1").setMaster("local[1]")
        val sc = new SparkContext(conf)
        val lists = List(1,2,3,4,5)
        val listRDD = sc.parallelize(lists)
    }
}
  • 累加器

累加器是仅仅被相关操作累加的变量,通过可以被用来实现(counter)和求和(sum)

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

scala> val accum = sc.longAccumulator("My Accumulator")
scala> sc.parallelize(Array(1,2,3,4)).foreach(x => accum.add(x))
scala> accum.value

在有很多节点/海量数据的情况下,使用累加器的add方法可以较大的提升效率。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!