Spark—廣播變量

廣播變量

Spark有兩種共享變量——累加器、廣播變量。廣播變量可以讓程序高效地向所有工作節點發送一個較大的只讀值,以供一個或多個Spark操作使用。

需求來源

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

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

使用方法

1.調用SparkContext.broadcast方法創建一個Broadcast[T]對象。任何序列化的類型都可以這么實現。
2.通過value屬性訪問改對象的值(Java之中為value()方法)
3.變量只會被發送到各個節點一次,應作為只讀值處理(修改這個值不會影響到別的節點)

pic-1.png

上面這個程序可以運行,但是如果表更加大(比如表中不是呼號,而是IP地址),signPrefixes很容易就會達到MB級別的大小,從主節點為每個任務發送一個這樣的數據就會代價巨大。而且如果之后還要再次使用signPrefixes這個對象,則還需要向每個節點再發送一遍。

所以可以將signPrefixes作為廣播變量來解決這個問題:

pic-2.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容