Spark共享變量

Spark一個非常重要的特性就是共享變量。 默認情況下,如果在一個算子的函數中使用到了某個外部的變量,那麼這個變量的值會被拷貝到每個task中。此時每個task只能操作自己的那份變量副本。如果多個task想要共享某個變量,那麼這種方式是做不到的。

Spark爲此提供了兩種共享變量

  • 一種是Broadcast Variable(廣播變量),
  • 另一種是Accumulator(累加變量)。

廣播變量

廣播變量限定只讀 (緩存在每臺worker中的cache),可應用在 任務與任務之間共享,不用再不同任務之間傳遞變量。Broadcast Variable會將使用到的變量,僅僅爲每個節點拷貝一份,更大的用處是優化性能,減少網絡傳輸以及內存消耗。
在這裏插入圖片描述

object AccumulatorVariable {
  def main(args: Array[String]) {
    val conf = new SparkConf()
      .setAppName("AccumulatorVariable")
      .setMaster("local")
    val sc = new SparkContext(conf)

    val sum = sc.accumulator(0)

    val numberArray = Array(1, 2, 3, 4, 5)
    val numbers = sc.parallelize(numberArray, 1)
    numbers.foreach { num => sum += num }

    println(sum)
  }

累加器

累加器限定只寫 (通過關聯操作進行"加"操作的變量),可應用在任務與驅動器之間共享,Accumulator則可以讓多個task共同操作一份變量,主要可以進行累加操作。例如調試時,對Job的執行過程中事件進行計數。

例子:計算file文件中空行

import org.apache.spark.{SparkContext, SparkConf}

/**
  * Created by chh on 2016/5/22.
  */
object Counter {
  def main(args :Array[String]): Unit = {
    //創建一個scala版本的SparkContext
    val conf = new SparkConf().setAppName("Counter").setMaster("local")
    val sc = new SparkContext(conf)
    val file=sc.textFile("file.txt")
    val blankLines =sc.accumulator(0)//創建Accumulator[Int]並初始化爲0
    val callSigns =file.flatMap(line => {
        if(line == ""){
          blankLines += 1 //累加器加一
        }
        line.split(" ")
      })
    callSigns.saveAsTextFile("output.txt")
    println(blankLines.value)
  }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章