前言
我們時常談論說到MapReduce時,我們都會說它是離線計算框架,磁盤IO開銷大,job運行比較慢等等。
這一篇博客,南國系統回顧下mr程序運行慢的原因,以及如何優化mr程序。
MapReduce運行慢的原因
我們都知道MapReduce是離線計算框架,不同於Spark內存計算框架模型。一個標準的mr程序由map方法和reduce方法構成,數據源在map方法前輸入,map方法的輸出結果放在磁盤中 由shuffle階段進行處理後輸入到reduce方法,最後reduce方法的輸出作爲mr程序的整個結果輸出保存到HDFS中。
在這個過程中,MapReduce程序的性能瓶頸在於兩點:
- 機器性能
它包括cpu、內存、磁盤以及網絡 - IO操作
在頻繁的IO操作中,他可能會存在以下一些問題:
數據傾斜;
map和reduce個數設置不合理:
reduce等待過久;
小文件過多;
有大量的不可分塊的超大文件;
spill次數過多;
merge次數過多等。
MapReduce優化方法
1. 數據輸入
- 合併小文件:在執行mr任務前將小文件進行合併,因爲大量的小文件會產生大量的map任務,增大map任務裝載次數,而任務的裝載比較耗時,從而導致 mr 運行較慢。
- 採用CombineFileInputFormat來作爲輸入,解決輸入端大量小文件場景。
2. map階段
- 減少spill次數:通過調整io.sort.mb及sort.spill.percent參數值,增大觸發spill的內存上限,減少spill次數,從而減少磁盤 IO。
- 減少merge次數:通過調整io.sort.factor參數,增大merge的文件數目,減少merge的次數,從而縮短mr處理時間。
- 在 map 之後先進行combine處理,減少 I/O。
3. reduce階段
- 合理設置map和reduce數:兩個都不能設置太少,也不能設置太多。太少,會導致task等待,延長處理時間;太多,會導致 map、reduce任務間競爭資源,造成處理超時等錯誤。
- 設置map、reduce共存:調整slowstart.completedmaps參數,使map運行到一定程度後,reduce也開始運行,減少reduce的等待時間。
- 規避使用reduce,因爲Reduce在用於連接數據集的時候將會產生大量的網絡消耗。
- 合理設置reduc端的buffer,默認情況下,數據達到一個閾值的時候,buffer中的數據就會寫入磁盤,然後reduce會從磁盤中獲得所有的數據。也就是說,buffer和reduce是沒有直接關聯的,中間多個一個寫磁盤->讀磁盤的過程,既然有這個弊端,那麼就可以通過參數來配置,使得buffer中的一部分數據可以直接輸送到reduce,從而減少IO開銷:mapred.job.reduce.input.buffer.percent,默認爲0.0。當值大於0的時候,會保留指定比例的內存讀buffer中的數據直接拿給reduce使用。這樣一來,設置buffer需要內存,讀取數據需要內存,reduce計算也要內存,所以要根據作業的運行情況進行調整。
4. IO傳輸
- 採用數據壓縮的方式,減少網絡IO的時間。例如安裝Snappy和LZOP壓縮編碼器。
- 使用SequenceFile二進制文件。
5. 數據傾斜問題
這一部分內容,南國在之前的博客Hadoop處理數據傾斜中有講述到。
其實除此之外,開發者還可以在配置文件中進行參數調優,例如mapred-default.xml,yarn-default.xml。
HDFS小文件的優化方法
在上文,南國講述MapReduce優化方法時提到過數據輸入階段的合併小文件。我們知道,MapReduce的數據源一半來自於HDFS,所以 這裏也着重講一下HDFS小文件的弊端和解決方案。
1. HDFS的小文件弊端
HDFS上每個文件都要在namenode上建立一個索引,這個索引的大小約爲150byte,這樣當小文件比較多的時候,就會產生很多的索引文件,一方面會大量佔用namenode的內存空間,另一方面就是索引文件過大是的索引速度變慢。
2. 解決的方式
1.Hadoop本身提供了一些文件壓縮的方案。
2.根本解決方式:進行小文件的合併,然後建立比較快速的索引。
- Hadoop Archive:這是一個高效的將小文件放入HDFS塊中的文件存檔工具,它能夠將多個小文件打包成一個HAR文件,這樣在減少namenode內存使用的時間。
- Sequence file: 它由一系列的二進制key/value組成。如果爲key小文件名,value爲文件內容,則可以將大批文件合併成爲一個大文件。
- CombineFileInputFormat是一種新的InputFormat,用於將多個文件合併成一個單獨的split,另外他會考慮數據的存儲位置。