廣播變量
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