[轉]一些spark調優的經驗

調優的經驗總結

1 輸出信息

在Spark應用裏面可以直接使用System.out.println把信息輸出出來,系統會直接攔截out輸出到spark的日誌。像我們使用的yarn作爲資源管理系統,在yarn的日誌中就可以直接看到這些輸出信息了。這在數據量很大的時候,做一些show()(默認顯示20),count() 或者 take(10)的時候會很方便。

2 內存不夠

當任務失敗,收到sparkContext shutdown的信息時,基本都是執行者的內存不夠。這個時候,一方面可以調大--excutor-memory參數,另一方面還是得回去看看程序。如果受限於系統的硬件條件,無法加大內存,可以採用局部調試法,檢查是在哪裏出現的內存問題。比如,你的程序分成幾個步驟,一步一步的打包運行,最後檢查出現問題的點就可以了。

3 ThreadPool

線程池不夠,這個是因爲--excutor-core給的太少了,出現線程池不夠用的情況。這個時候就需要調整參數的配置了。

4 physical memory不夠

這種問題一般是driver memory不夠導致的,driver memory通常存儲了以一些調度方面的信息,這種情況很有可能是你的調度過於複雜,或者是內部死循環導致。

5 合理利用緩存

在Spark的計算中,不太建議直接使用cache,萬一cache的量很大,可能導致內存溢出。可以採用persist的方式,指定緩存的級別爲MEMORY_AND_DISK,這樣在內存不夠的時候,可以把數據緩存到磁盤上。另外,要合理的設計代碼,恰當地使用廣播和緩存,廣播的數據量太大會對傳輸帶來壓力,緩存過多未及時釋放,也會導致內存佔用。一般來說,你的代碼在需要重複使用某一個rdd的時候,才需要考慮進行緩存,並且在不使用的時候,要及時unpersist釋放。

6 儘量避免shuffle

這個點,在優化的過程中是很重要的。比如你需要把兩個rdd按照某個key進行groupby,然後在進行leftouterjoin,這個時候一定要考慮大小表的問題。如果把大表關聯到小表,那麼性能很可能會很慘。而只需要簡單的調換一下位置,性能就可能提升好幾倍。


原文鏈接:

http://www.cnblogs.com/xing901022/p/6445254.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章