1. 程式人生 > 其它 >Spark中廣播變數(broadcast)使用

Spark中廣播變數(broadcast)使用

技術標籤: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上拉取變數副本。