Hadoop(MapReduce)性能優化

前言

我們時常談論說到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,另外他會考慮數據的存儲位置。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章