SparkCore之廣播變量

SparkCore中的廣播變量

1.定義

  • 廣播變量:分佈式共享只讀變量

2.爲什麼使用廣播變量

  • 在多個並行操作中(Executor)使用同一個變量,Spark默認會爲每個任務(Task)分別發送,這樣如果共享比較大的對象,會佔用很大工作節點的內存。
  • 廣播變量用來高效分發較大的對象。向所有工作節點發送一個較大的只讀值,以供一個或多個Spark操作使用。比如,如果你的應用需要向所有節點發送一個較大的只讀查詢表,甚至是機器學習算法中的一個很大的特徵向量,廣播變量用起來都很順手。

3.廣播變量的使用步驟

  • (1)通過對一個類型T的對象調用SparkContext.broadcast創建出一個Broadcast[T]對象,任何可序列化的類型都可以這麼實現。
  • (2)通過value屬性訪問該對象的值(在Java中爲value()方法)。
  • (3)變量只會被髮到各個節點一次,應作爲只讀值處理(修改這個值不會影響到別的節點)。

4.原理說明

在這裏插入圖片描述

5.案例實操

object Test10_BroadCast {

    def main(args: Array[String]): Unit = {
        // 創建SparkConf對象,設置APP名稱以及Master名稱
        val conf: SparkConf = new SparkConf().setAppName("Test10_BroadCast").setMaster("local[*]")

        // 創建SparkContext對象,該對象是提交Spark App的入口
        val sc: SparkContext = new SparkContext(conf)

        //需求:想實現類似join效果   (a,(1,4)),(b,(2,5)),(c,(3,6))
        val rdd: RDD[(String, Int)] = sc.makeRDD(List(("a",1),("b",2),("c",3)))
        val list: List[(String, Int)] = List(("a",4),("b",5),("c",6))

        // 聲明一個廣播變量
        val broadcastList: Broadcast[List[(String, Int)]] = sc.broadcast(list)

        val resRDD: RDD[(String, (Int, Int))] = rdd.map {
            case (k1, v1) => {
                var v3 = 0
                //for ((k2, v2) <- list) {
                // 使用廣播變量
                for ((k2, v2) <- broadcastList.value) {
                    if (k1 == k2) {
                        //(k1, (v1, v2))
                        v3 = v2
                    }
                }
                (k1, (v1, v3))
            }
        }

        resRDD.collect().foreach(println)

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