mr跑的慢可能有很多原因,如:數據傾斜、map和reduce數設置不合理、reduce等待過久、小文件過多、spill 次數過多、 merge 次數過多等。 1、解決數據傾斜:數據傾斜可能是partition不合理,導致部分partition中的數據過多,部分過少。可通過分析數據,自定義分區器解決。 2、合理設置map和reduce數:兩個都不能設置太少,也不能設置太多。太少,會導致task等待,延長處理時間;太多,會導致 map、 reduce 任務間競爭資源,造成處理超時等錯誤。 3、設置map、reduce共存:調整slowstart.completedmaps參數,使map運行到一定程度后,reduce也開始運行,減少 reduce 的等待時間。 4、合並小文件:在執行mr任務前將小文件進行合並,大量的小文件會產生大量的map任務,增大map任務裝載次數,而任務的裝載比較耗時,從而導致 mr 運行較慢。 5、減少spill次數:通過調整io.sort.mb及sort.spill.percent參數值,增大觸發spill的內存上限,減少spill 次數,從而減少磁盤 IO。 6、減少merge次數:通過調整io.sort.factor參數,增大merge的文件數目,減少merge的次數,從而縮短mr處理時間。 |