- 广播变量
广播变量(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方法可以较大的提升效率。
来源:CSDN
作者:KaiwenYu
链接:https://blog.csdn.net/qq_16898611/article/details/104505245