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 = {
val conf: SparkConf = new SparkConf().setAppName("Test10_BroadCast").setMaster("local[*]")
val sc: SparkContext = new SparkContext(conf)
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) <- broadcastList.value) {
if (k1 == k2) {
v3 = v2
}
}
(k1, (v1, v3))
}
}
resRDD.collect().foreach(println)
sc.stop()
}
}