廣播變數
廣播變數允許程式設計師將乙個唯讀的變數快取在每台機器上,而不用在任務之間傳遞變數。廣播變數可被用於有效地給每個節點乙個大輸入資料集的副本。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一邊拉取資料一邊...