Spark 的 Accumulator
1.概述
Accumulator累加器能精確地統計數據的各種屬性,eg:可以統計符合條件的session,在一段時間段內產生了多少次購買,統計出各種屬性的數據。
def accumulator[T](initialValue: T, name: String)
initialValue: 初始值
name: 創建累加器時,可以指定累加器的名字,這樣在Driver 4040 Web UI的Task顯示時可以幫助你瞭解程序運行的情況。
2. 例子
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setMaster("local[2]").setAppName("SparkRdd")
val sc = new SparkContext(conf)
val accum = sc.accumulator(0,"test1")
val data = sc.parallelize(1 to 9)
//使用action操作觸發執行
data.foreach(x=>accum+=1)
println(accum.value)
//結果將返回9
}
3. 注意事項
-
accumulator需要通過一個action操作來觸發才能獲取到accum.value的值
-
在使用累加器的過程中,只能使用一次action的操作才能保證結果的準確性
object SparkAccumulator { def main(args: Array[String]): Unit = { val conf = new SparkConf().setMaster("local[2]").setAppName("SparkAccumulator") val sc = new SparkContext(conf) val accum = sc.accumulator(0,"test2") val data = sc.parallelize(1 to 8) val data2 = data.map{ x=>{ if(x%2==0){ accum+=1 0 }else 1 } } //使用action操作觸發執行 println(data2.count) // 輸出結果8 println(accum.value) // 輸出結果4 println(data2.count) // 輸出結果8 println(accum.value) // 輸出結果8 sc.stop() } }
第二次調用data2.count action的時候,會重新獲取一次data2,導致accum+=1執行了兩次
解決方案:只要將任務之間的依賴關係切斷,使用rdd的cache,persist方法