spark效能調優之廣播大變數

2021-08-11 10:32:18 字數 844 閱讀 2173

廣播變數

廣播變數允許程式設計師將乙個唯讀的變數快取在每台機器上,而不用在任務之間傳遞變數。廣播變數可被用於有效地給每個節點乙個大輸入資料集的副本。spark還嘗試使用高效地廣播演算法來分發變數,進而減少通訊的開銷。

spark的動作通過一系列的步驟執行,這些步驟由分布式的洗牌操作分開。spark自動地廣播每個步驟每個任務需要的通用資料。這些廣播資料被序列化地快取,在執行任務之前被反序列化出來。這意味著當我們需要在多個階段的任務之間使用相同的資料,或者以反序列化形式快取資料是十分重要的時候,顯式地建立廣播變數才有用。

其實就是sparkcontext的broadcast()方法,傳入你要廣播的變數,即可

final broadcast>> broadcast = sc.broadcast(fastutildatehourextractmap);

使用廣播變數的時候,

直接呼叫廣播變數(broadcast型別)的value() / getvalue() ,

可以獲取到之前封裝的廣播變數

map> datehourextractmap =

broadcast.value();

比如,50個executor,1000個task。乙個map,10m:

預設情況下,1000個task,1000份副本。10g的資料,網路傳輸,在集群中,耗費10g的記憶體資源。

如果使用了廣播變數。50個execurtor,50個副本。500m的資料,網路傳輸,而且不一定都是從driver傳輸到每個節點,還可能是就近從最近的

節點的executor的bockmanager上拉取變數副本,網路傳輸速度大大增加;500m的記憶體消耗。

真實的使用場景待後續開發!

spark常規效能調優四 廣播大變數

預設情況下,task中的運算元中如果使用了外部的變數,每個task都會獲取乙份變數的複本,這就造成了記憶體的極大消耗。一方面,如果後續對rdd進行持久化,可能就無法將rdd資料存入記憶體,只能寫入磁碟,磁碟io將會嚴重消耗效能 另一方面,task在建立物件的時候,也許會發現堆記憶體無法存放新建立的物...

Spark效能調優之 在實際專案中廣播大變數

其實就是我們寫的spark作業,打成jar執行起來的主程序。比如乙個1m的map 隨機抽取的map 建立1000個副本,網路傳輸!分到1000個機器上,則占用了1g記憶體。不必要的網路消耗,和記憶體消耗。如果你是從哪個表裡面讀取了一些維度資料,比方說,所有商品的品類的資訊,在某個運算元函式中使用到1...

Spark效能調優之Shuffle調優總結

spark底層shuffle的傳輸方式是使用netty傳輸,netty在進行網路傳輸的過程會申請堆外記憶體 netty是零拷貝 所以使用了堆外記憶體。shuffle過程中常出現的問題 常見問題一 reduce oom?問題原因 reduce task 去map端獲取資料,reduce一邊拉取資料一邊...