概述
Spark程序的大部分操作都是RDD操作,通过传入函数给RDD操作函数来计算。这些函数在不同的节点上并发执行,但每个内部的变量有不同的作用域,不能相互访问,所以有时会不太方便,Spark提供了两类共享变量供编程使用——广播变量和计数器。
1. 广播变量
这是一个只读对象,在所有节点上都有一份缓存,创建方法是SparkContext.broadcast(),比如:
scala> val broadcastRef= sc.broadcast(Array(1, 2, 3))
broadcastRef: org.apache.spark.broadcast.Broadcast[Array[Int]] = Broadcast(0)
scala> broadcastVar.value
res0: Array[Int] = Array(1, 2, 3)
注意,广播变量是只读的,所以创建之后再更新它的值是没有意义的,一般用val修饰符来定义广播变量。
2. 计数器
计数器只能增加,是共享变量,用于计数或求和。
计数器变量的创建方法是SparkContext.accumulator(v, name),其中v是初始值,name是名称。
示例如下:
scala> val accum = sc.accumulator(0, "My Accumulator")
accum: org.apache.spark.Accumulator[Int] = 0
scala> sc.parallelize(Array(1, 2, 3, 4)).foreach(x => accum += x)
scala> accum.value
res1: Int = 10