Spark 的Accumulator

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方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章