概述apache
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)spa
scala> broadcastVar.valuescala
res0: Array[Int] = Array(1, 2, 3)對象
注意,廣播變量是隻讀的,因此建立以後再更新它的值是沒有意義的,通常用val修飾符來定義廣播變量。作用域
2. 計數器spark
計數器只能增長,是共享變量,用於計數或求和。
計數器變量的建立方法是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