Spark 的一個核心功能是創建兩種特殊類型的變量:廣播變量和累加器
廣播變量(groadcast varible)為只讀變量,它有運行SparkContext的驅動程序創建后發送給參與計算的節點。對那些需要讓工作節點高效地訪問相同數據的應用場景,比如機器學習。我們可以在SparkContext上調用broadcast方法創建廣播變量:
val broadcastList = sc.broadcast(List("Spark","Impala","Hadoop"))
廣播變量也可以被非驅動程序所在節點(即工作節點)訪問,訪問方法就是調用該變量的value方法
sc.parallelize(List("1","2","3")).map(x => broadcastList.value ++ x).collect
使用廣播變量可以優化資源提高性能
廣播變量的優勢:是因為不是每個task一份變量副本,而是變成每個節點的executor才一份副本。這樣的話,就可以讓變量產生的副本大大減少。
廣播變量,初始的時候,就在Drvier上有一份副本。task在運行的時候,想要使用廣播變量中的數據,此時首先會在自己本地的Executor對應的
BlockManager中,嘗試獲取變量副本;如果本地沒有,BlockManager,也許會從遠程的Driver上面去獲取變量副本;也有可能從距離比較近的其他
節點的Executor的BlockManager上去獲取,並保存在本地的BlockManager中;BlockManager負責管理某個Executor對應的內存和磁盤上的數據,
此后這個executor上的task,都會直接使用本地的BlockManager中的副本。
例如,50個executor,1000個task。一個map,10M:
默認情況下,1000個task,1000份副本。10G的數據,網絡傳輸,在集群中,耗費10G的內存資源。
如果使用了廣播變量。50個execurtor,50個副本。500M的數據,網絡傳輸,而且不一定都是從Driver傳輸到每個節點,還可能是就近從最近的
節點的executor的bockmanager上拉取變量副本,網絡傳輸速度大大增加;500M,大大降低了內存消耗。