Spark中廣播變數(broadcast)使用
阿新 • • 發佈:2021-01-24
技術標籤:Sparkscala大資料大資料sparkbroadcastscala
文章目錄
前言
在spark中,有一些資料需要傳入到每個Excetor中每個task任務中,假如一個Excetor中有10個分割槽的task,那麼每個分割槽都得需要一份Driver中傳入的資料,那麼會導致一個Excetor中有大量的重複的資料,spark中存在一種變數broadcast,廣播變數,該變數只會往執行任務的執行的Excetor中傳送一份變數,這樣會大大減少每個EXcetor中的重複的資料
一、使用介紹
object Broadcast { def main(args: Array[String]): Unit = { val sparkConf= new SparkConf().setMaster("local[*]").setAppName("broadcast") val sc = new SparkContext(sparkConf) val rdd = sc.makeRDD(List( ("a", 1), ("b", 2), ("c", 3),("c", 3) ),4) // val map=mutable.Map("b"->3,"c"->5,"d"->7) val value1 = sc.broadcast(map) val broadRDD = rdd.map { case (key, value) => { if (value1.value.contains(key)) { (key, value + 1) }else{ (key,1000) } } } broadRDD .collect() sc.stop() } }
使用sc.Broadcast 把變數放入Spark上下文中,這樣每個Excetor都可以使用這個廣播變量了
二、broadcast原理
廣播變數,初始的時候,就在Drvier上有一份副本。task在執行的時候,想要使用廣播變數中的資料,此時首先會在自己本地的Executor對應的BlockManager中,嘗試獲取變數副本;如果本地沒有,那麼就從Driver遠端拉取變數副本,並儲存在本地的BlockManager中;此後這個executor上的task,都會直接使用本地的BlockManager中的副本。executor的BlockManager除了從driver上拉取,也可能從其他節點的BlockManager上拉取變數副本。