1.使用mapPartitions算子提高性能
mapPartition的優點:使用普通的map操作,假設一個partition中有1萬條資料,那么function就要被執行1萬次,但是使用mapPartitions操作之后,function僅僅會被執行一次,顯然性能得到了很大的提升,這個就沒必要在多廢話了,
mapPartition的缺點:使用普通的map操作,呼叫一次function執行一條資料,不會出現記憶體不夠使用的情況;但是使用mapPartitions操作,很顯然,如果資料量太過于大的時候,由于記憶體有限導致發生OOM,記憶體溢位,
總結:通過以上以上優缺點的對比,我們可以得出一個結論;就是在資料量不是很大的情況下使用mapPartition操作,性能可以得到一定的提升,在使用mapPartition前,我們需要預先估計一下每個partition的量和每個executor可以被分配到的記憶體資源,然后嘗試去運行程式,如果程式沒有問題就大可放心的使用即可,下圖是一個實際的應用例子,僅供參考,
2.filter操作之后使用coalesce算子提高性能
經過一次filter操作以后,每個partition的資料量不同程度的變少了,這里就出現了一個問題;由于每個partition的資料量不一樣,出現了資料傾斜的問題,比如上圖中執行filter之后的第一個partition的資料量還有9000條,
解決方案:針對上述出現的問題,我們可以將filter操作之后的資料進行壓縮處理;一方面減少partition的數量,從而減少task的數量;另一方面通過壓縮處理之后,盡量讓每個partition的資料量差不多,減少資料傾斜情況的出現,從而避免某個task運行速度特別慢,coalesce算子就是針對上述出現的問題的一個解決方案
3.使用foreachPartition算子進行
4.使用repartition解決SparkSQL低并行度的問題
在spark專案中,如果在某些地方使用了SparkSQL,那么使用了SparkSQL的那個stage的并行度就沒有辦法通過手動設定了,而是由程式自己決定,那么,我們通過什么樣的手段來提高這些stage的并行度呢?其實解決這個問題的辦法就是使partition的數量增多,從而間接的提高了task的并發度,要提高partition的數量,該怎么做呢?就是使用repartition算子,對SparkSQL查詢出來的資料重新進行磁區操作,此時可以增加磁區的個數,
作者:z小趙
鏈接:https://www.jianshu.com/p/a1ca2ff91d9c
來源:簡書
著作權歸作者所有,商業轉載請聯系作者獲得授權,非商業轉載請注明出處,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/224909.html
標籤:其他
下一篇:Spark性能優化指南-美團
