1. 程式人生 > >大資料IMF傳奇行動絕密課程第42課:Checkpoint內幕解密

大資料IMF傳奇行動絕密課程第42課:Checkpoint內幕解密

Broadcast內幕解密

1、Broadcast徹底解析
2、Broadcast原始碼徹底詳解
3、Broadcast最佳實踐

一、Broadcast徹底解析
1、Broadcast就是將資料從一個節點發送到其它的節點上。例如Driver上有一張表,而Executor中的每個並行執行的Task(100萬個Task)都要查詢這張表,那我們通過Broadcast的方式就只需要往每個Executor把這張表傳送一次就行了,Executor中的每個執行的Task查詢這張唯一的表,而不是每次執行的時候都從Driver中獲得這張表。
2、這就好像ServletContext的具體作用,只是Broadcast是分散式的共享資料,預設情況下只要程式在執行,Broadcast變數就會存在,因為Broadcast在底層是通過BlockManager管理的!但是你可以手動指定或者配置具體週期來銷燬Broadcast變數。
3、Broadcast一般用於處理共享配置檔案、通用的Dataset、常用的資料結構等等;但是不適合存放太大的資料在Broadcast,Broadcast不會記憶體溢位,因為其資料儲存的StorageLevel是MEMORY_AND_DISK的方式。雖然如此,我們也不可以放入太大的資料在Broadcast中,因為網路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中(StorageLevel是MEMORY_AND_DISK)獲得BlockId(BroadcastBlockId),當第一次Executor中的Task要訪問Broadcast變數的時候,會向Driver通過HttpServer來訪問資料,然後會在Executor中的BlockManager中註冊該Broadcast中的資料給BlockManager,這樣後續的Task需要訪問Broadcast的變數的時候會首先查詢BlockManager中有沒有該資料,如果有就直接使用;
7、BroadcastManager是用來管理Broadcast的,該例項物件是在SparkContext建立SparkEnv的時候建立的

// Called by SparkContext or Executor before using Broadcast
private def initialize() {
    synchronized {
      if (!initialized) {
        val broadcastFactoryClass =
          conf.get("spark.broadcast.factory", "org.apache.spark.broadcast.TorrentBroadcastFactory")

        broadcastFactory =
          Utils.classForName(broadcastFactoryClass).newInstance.asInstanceOf[BroadcastFactory]

        // Initialize appropriate BroadcastFactory and BroadcastObject
broadcastFactory.initialize(isDriver, conf, securityManager) initialized = true } } }

在例項化BroadcastManager的時候會建立BroadcastFactory工廠來構建具體實際的Broadcast型別,預設情況下是TorrentBroadcastFactory
8、HttpBroadcast存在單點故障,和網路IO等效能問題,所以預設使用TorrentBroadcast的方式,開始資料在Driver中,假設A節點用了資料,B訪問的時候A節點就變成資料來源,依次類推,都是資料來源,當然是被BlockManager進行管理的,資料來源越多,節點壓力會大大降低
9、TorrentBroadcast按照BLOCK_SIZE(預設是4MB)將Broadcust中的資料劃分成為不同的Block,然後將分塊資訊也就是meta資訊存放到Driver的BlockManager中,同時會告訴BlockManagerMaster說明Meta資訊存放完畢