32查运行内存的map文件_Spark Shuffle调优之调节map端内存缓冲与reduce端内存占比
本文首先介紹Spark中的兩個配置參數:
spark.shuffle.file.buffer map端內存緩沖 spark.shuffle.memoryFraction reduce端內存占比很多博客會說上面這兩個參數是調節Spark shuffle性能的利器,實際上并不是這樣的。
以實際的生產經驗來說,這兩個參數沒有那么重要,往往來說shuffle的性能不是因為這方面的原因決定的,但是整體來說還是有一點點效果的。
這兩個shuffle調優的小點能帶來一些性能的提升,與其他調優小點結合起來最終可以會有可以看見的還算不錯的性能調優的效果。
默認情況下shuffle的map task輸出到磁盤文件的時候,統一都會先寫入每個task自己關聯的一個內存緩沖區。這個緩沖區大小,默認是32kb。
每一次,當內存緩沖區滿溢之后,才會進行spill操作,溢寫操作,溢寫到磁盤文件中去。
reduce端task拉取到數據之后會用hashmap這種數據格式來對各個key對應的values進行匯聚。針對每個key對應的values執行我們自定義的聚合函數的代碼,比如_ + _(把所有values累加起來)。
reduce task在進行匯聚、聚合等操作的時候使用的就是自己對應的executor的內存,默認executor內存中劃分給reduce task進行聚合的比例,是0.2。
問題來了,因為默認比例是0.2,理論上很有可能會出現拉取過來的數據很多導致在內存中放不下,內存無法放下的數據,都被spill(溢寫)到磁盤文件中去了。
原理說完之后,來看一下默認情況下不調優會出現什么樣的問題
默認配置下map端內存緩沖是每個task,32kb。
默認配置下reduce端聚合內存比例,是0.2,也就是20%。
如果map端的task處理的數據量比較大而配置的內存緩沖大小是固定的可能會出現什么樣的情況?
每個task處理320kb時總共會向磁盤溢寫320 / 32 = 10次。
每個task處理32000kb時總共會向磁盤溢寫32000 / 32 = 1000次。
在map task處理的數據量比較大的情況下,而你的task的內存緩沖默認是比較小的(32kb)。可能會造成多次的map端往磁盤文件的spill溢寫操作,發生大量的磁盤IO,從而降低性能。
reduce端聚合內存占比默認是0.2。如果數據量比較大,reduce task拉取過來的數據很多,那么就會頻繁發生reduce端聚合內存不夠用,頻繁發生spill操作溢寫到磁盤上去。而且最致命的是,磁盤上溢寫的數據量越大后面在進行聚合操作的時候很可能會多次讀取磁盤中的數據進行聚合。
默認不調優,在數據量比較大的情況下,可能頻繁地發生reduce端的磁盤文件的讀寫。
這兩個點之所以放在一起說是因為他們倆是有關聯的。數據量變大,map端肯定會出點問題;reduce端肯定也會出點問題;出的問題是一樣的:都是磁盤IO頻繁,影響性能。
調優方案如下:
調節map task內存緩沖:spark.shuffle.file.buffer
調節reduce端聚合內存占比:spark.shuffle.memoryFraction
在實際生產環境中,我們在什么時候來調節兩個參數?
看Spark UI,如果采用的是standalone模式,可以通過SparkUI查看每個stage的詳情,有哪些executor,task ?每個task的shuffle write和shuffle read的量,shuffle的磁盤和內存,讀寫的數據量;如果是用的yarn模式來提交,可以從yarn的界面進去,點擊對應的application,進入Spark UI,查看詳情。
如果發現shuffle 磁盤的write和read很大。這個時候,就意味著最好調節一些shuffle的參數。進行調優。首先當然是考慮開啟map端輸出文件合并機制。
調節的時候的原則:spark.shuffle.file.buffer,每次擴大一倍,然后看看效果,64,128;spark.shuffle.memoryFraction,每次提高0.1,看看效果。
不能調節的太大,太大了以后過猶不及,因為內存資源是有限的,你這里調節的太大了,其他環節的內存使用就會有問題了。
調節了以后效果如何?map task內存緩沖變大了,減少spill到磁盤文件的次數;reduce端聚合內存變大了,減少spill到磁盤的次數,而且減少了后面聚合讀取磁盤文件的數量。
往期回顧:
碼農鏟屎官:Spark Shuffle調優之合并map端輸出文件?zhuanlan.zhihu.com碼農鏟屎官:Spark性能調優之資源分配?zhuanlan.zhihu.com碼農鏟屎官:Flink開發的7點建議?zhuanlan.zhihu.com碼農鏟屎官:Flink state 使用的4點建議?zhuanlan.zhihu.com碼農鏟屎官:4個角度輕松理解 Flink中的Watermark?zhuanlan.zhihu.com碼農鏟屎官:3種Flink State Backend | 你該用哪個??zhuanlan.zhihu.com碼農鏟屎官:Flink方案設計中的4大誤區?zhuanlan.zhihu.com碼農鏟屎官:Flink實現固定時長或消息條數的觸發器?zhuanlan.zhihu.com碼農鏟屎官:詳解 Flink 異步 IO?zhuanlan.zhihu.com總結
以上是生活随笔為你收集整理的32查运行内存的map文件_Spark Shuffle调优之调节map端内存缓冲与reduce端内存占比的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 天气很好阳光很美句子243个
- 下一篇: 模板 字段_劲爆新功能:轻流文字识别(O