Spark Broadcast運行機制解密(42)

 一、Broadcast徹底解密

    1、Broadcast就是將數據從一個節點發送到其他節點。

   2、Broadcast是分佈式的共享數據,默認情況下只要程序運行Broadcast變量就會存在,因爲Broadcast底層是由BlockManager管理的,但是也可以手動銷燬Broadcast變量。

   3、Broadcast一般用於處理共享的配置文件,通用的Dataset、常用的數據結構等等,但是不適合存放太大的數據在Broadcast,Broadcast不會內存溢出,因爲其數據的保存的StorageLevel是MEMORY_AND_DISK,雖然如此,也不可以放太大的數據,因爲網絡IO和可能的單點壓力會非常大。

   4、廣播的Broadcast變量是隻讀變量,保持了數據的一致性。

   5、Broadcast的使用:

     * {{{

     * scala> val broadcastVar = sc.broadcast(Array(1, 2, 3))

     * broadcastVar: org.apache.spark.broadcast.Broadcast[Array[Int]] = Broadcast(0)

     *

     * scala> broadcastVar.value

     * res0: Array[Int] = Array(1, 2, 3)

     * }}}
   6、HttpBroadcast方式的Broadcast:最開始的時候數據存在Driver的文件系統中,Driver會在本地創建一個文件夾存放Broadcast中的data,然後啓動HttpServer來訪問文件夾中的數據,同時寫入到BlockManager中,獲得BlockId(BroacastBlockId)。當第一次Executor中Task要訪問Broadcast變量的時候,會向Driver通過HttpServer來訪問數據,然後會在Executor中的BlockManager中註冊,這樣後續的Task需要訪問Broadcast變量的時候會首先查詢當前Executor的BlockManager中是否存在,如果存在就就直接獲取數據。

    7、BroadcastManager是用來管理Broadcast的,該對象是在SparkContext創建SparkEnv的時候創建的。在實例化BroadcastManager的時候會創建BroadcastFactory工廠來構建具體的Broadcst類型,默認是TorrentBroadcastFactory。

    8、HttpBroadcast存在單點故障和網絡IO性能問題,所以默認使用TorrentBroadcast的方式,開始數據存放在Driver端,假設A點需要訪問數據,就會去Driver端拿數據,然後在本地存儲一份,A節點也就擁有了一個副本,A節點也就成了數據源,降低了節點壓力。

     9、TorrentBroadcast按照BLOCK_SIZE(默認4m)將Broadcast中的數據劃分成不同的block,然後講分塊信息也就是meta信息存放到Driver端的BlockManager中,同時會通知BlockManagerMaster說明meta信息存放完畢。

二、Broadcast源碼解密

    當廣播數據的時候,會調用SparkContext的broadcast方法,在方法內部,Broadcast是由BroadcastManager管理創建的,而BroadcastManager又是有SparkEnv管理的

   wKiom1c4AEnjrlxGAAHcWvE8VTI971.png  

SparkEnv是由SparkContext中的createSparkEnv創建的,進而調用SparkEnv的createDriverEnv方法,最終會調用create自身的方法,構建一些所需的組建。管理Broadcast的BoradcastManager就在此方法中創建。

wKioL1c4Ax6iCeNpAADElOv9qI0353.png

創建BroadcastManager實例的時候,回調用initialize初始化方法,創建BoradcastFactory,默認是TorrentBroadcastFactory:咋

wKiom1c4A-SwHv-pAAG7S8bQ7qs953.png       

BroadcastManager初始化之後,就可以調用newBroadcast方法,根據BroadcastFactory創建相應的Broadcast(TorrentBroadcast)進行數據的廣播:

wKioL1c4BfeD8WjwAABbjctRrIY299.png

TorrentBroadcastFactory的newBroadcast方法創建一個TorrentBroadcast實例。當我們進行數據的廣播的時候,會調用writeBlocks方法,將廣播的數據劃分成多個block塊(默認是4m),把這些block塊存放在Driver端:
wKioL1c4B-egCkneAAH0-jscfNE354.png

當獲取廣播變量的值時,會調用相應Broadcast的getValue方法,在TorrentBroadcast中readBroadcastBlock方法,首先會在本地的BlockManager根據BroadcastBlockId獲取數據,如果獲取不到進而調用readBlocks方法

wKiom1c4CVayx2gEAAHX-kVUKWI791.png


  TorrentBroadcast中的readBlocks方法會從Driver端或者其他的Executor獲取相應的block快數據,然後把獲取的block數據保存到Executor的BlockManager中:

wKioL1c4C1ORkPmbAAF_HljtGQ8457.png

wKioL1c4C6nB4eFEAAF1LOq4Ebs726.png



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