1. 程式人生 > >Spark效能調優之廣播變數

Spark效能調優之廣播變數

廣播變數概述及其優勢

廣播變數(groadcast varible)為只讀變數,它有執行SparkContext的driver程式建立後傳送給參與計算的節點。對那些需要讓工作節點高效地訪問相同資料的應用場景,比如機器學習。我們可以在SparkContext上呼叫broadcast方法建立廣播變數:

廣播變數也可以被非driver程式所在節點(即worker)訪問,訪問方法就是呼叫該變數的value方法

使用廣播變數可以優化資源提高效能

廣播變數的優勢:是因為不是每個task一份變數副本,而是變成每個節點的executor才一份副本。這樣的話,就可以讓變數產生的副本大大減少。

廣播變數,初始的時候,就在Drvier上有一份副本。task在執行的時候,想要使用廣播變數中的資料,此時首先會在自己本地的Executor對應的BlockManager中,嘗試獲取變數副本;如果本地沒有,BlockManager,也許會從遠端Driver上面去獲取變數副本;也有可能從距離比較近的其它節點的Executor的BlockManager上去獲取,並儲存在本地的BlockManager中;BlockManager負責管理某個Executor對應的記憶體和磁碟上的資料,此後這個executor上的task,都會直接使用本地的BlockManager中的副本。

Spark中分散式執行的程式碼需要傳遞到各個Executor的Task上執行。對於一些只讀、固定的資料(比如從DB中讀出的資料),每次都需要Driver廣播到各個Task上,這樣效率低下。廣播變數允許將變數只廣播(提前廣播)給各個Executor。該Executor上的各個Task再從所在節點的BlockManager獲取變數,而不是從Driver獲取變數,從而提升了效率。

一個Executor只需要在第一個Task啟動時,獲得一份Broadcast資料,之後的Task都從本節點的BlockManager中獲取相關資料。

使用方法

  1. 呼叫SparkContext.broadcast方法建立一個Broadcast[T]物件。任何序列化的型別都可以這麼實現。

  2. 通過value屬性訪問改物件的值

  3. 變數只會被髮送到各個節點一次,應作為只讀值處理(修改這個值不會影響到別的節點)

例項

轉:http://mp.weixin.qq.com/s/C7oDNoKAW_cc7vFQNy5_Qg