本文爲《hadoop技術內幕:深刻解析MapReduce架構設計與實現原理》一書第9章《Hadoop性能調優》的總結。html
圖1 Hadoop層次結構圖算法
從管理員角度進行調優網絡
1.硬件選擇架構
master配置(可靠性,內存,CPU主頻等)優於slave。app
2.操做系統參數調優jvm
1)增大同時打開的文件描述符和網絡鏈接上限ide
ulimit 將容許同時打開的文件描述符數增大到一個合適的值。oop
net.core.somaxconn性能
定義了系統中每個端口最大的監聽隊列的長度,這是個全局的參數,默認值爲128(一般要增長大1024或更多)。ui
關於這個參數,見這篇博文:http://blog.csdn.net/taolinke/article/details/6800979
2)關閉swap分區
避免使用swap分區。設置vm.swappiness
3)設置合理的預讀取緩衝大小
blockdev命令
4)文件系統選擇與配置
不一樣的文件系統會有必定的差異。
在Linux文件系統中,啓動noatime屬性。具體操做見這篇文章:http://www.cnblogs.com/allegro/archive/2011/04/18/2019466.html
5)I/O調度器選擇
詳情可參見AMD的白皮書《Hadoop performance tuning guide》
3.JVM參數調優
關鍵詞:JVM FLAGS、垃圾回收機制。參見《Hadoop performance tuning guide》
4.Hadoop參數調優
1)合理規劃資源
a設置合理的槽位數目
b編寫健康監測腳本
2)調整心跳配置
a調整心跳間隔
b啓用帶外心跳
3)磁盤塊配置
4)設置合理的RPCHandler和HTTP線程數目
a配置RPC Handler數目
b配置HTTP線程數目
5)慎用黑名單機制
黑名單節點數目越多,系統吞吐率和計算能力越低。
6)啓用批量任務調度
7)選擇合適的壓縮算法
mapred.compress.map.output 設爲true
設置mapred.map.output.compression.codec的值爲合適的值。
8)啓用預讀取機制
從用戶角度進行調優
1.應用程序編寫規範
1)設置combiner,做用是減小map端的中間輸出。
2)選擇合適的Writable類型,Map Task和Reduce Task的輸入輸出都是Writable類型。
2.做業級別參數調優
1)規劃合理的任務數目
2)增長輸入文件副本數目
輸入文件副本少,一個可能的後果是當多個任務並行讀取一個副本時,會出現讀取瓶頸。
在hdfs-site.xml中修改dfs.replication的值。
3)啓動推測執行機制
將運行較慢的任務在另外一個節點上啓動,2個任務同時運行。其中1個提早完成後會將另外一個殺死。
屬性:mapred.map.tasks.speculative.execution 默認true
4)設置容忍度
分爲做業級別和任務級別的失敗容忍。
屬性:mapred.max.map.failures.percent 默認0,若是是5表示5%
mapred.map.max.attempts 默認爲4
5)適當打開JVM重用功能
當任務較小時,避免JVM重複啓動佔用不少時間。mapred.job.reuse.jvm.num.tasks 默認爲1
6)設置任務超時時間
超時以後,TaskTracker將任務殺死,而後在另外一個節點從新啓動一個。
屬性設置:
mapred.task.timeout 默認60 000(單位毫秒,也就是10分鐘)
7)合理使用DistributedCache
瞭解下DistributedCache就知道該怎麼用這個了。具體細節是:在調用任務前將文件上傳到HDFS能夠在做業運行期間將DistributedCache內的這些文件下載到public目錄下,好處是:public目錄下的文件是共享的,後續任務沒必要從新下載。
8)合理控制Reduce Task的啓動時機
注意:啓動過早會佔用slot資源,形成slot Hoarding現象;啓動過晚會形成資源獲取較晚從而延長做業運行時間。
舊版 mapred.reduce.slowstart.completed.maps 默認值0.05
新版 mapreduce.job.reduce.slowstart.completed.maps 默認0.05
9)跳過壞記錄
mapred.skip.attempts.to.start.skipping 當任務失敗次數達到此值時,纔會進入skip mode,即啓用跳過壞記錄功能。
mapred.skip.map.skip.records 最多容許跳過的壞記錄的個數
mapred.skip.reduce.max.skip.groups
mapred.skip.out.dir 顧名思義
10)提升做業優先級
解釋一下怎麼設置做業的優先級:設置mapred.job.priority(默認NORMAL)或者mapreduce.job.priority(NORMAL)。總共有5個優先級可選:VERY_HIGH,HIGH,NORMAL,LOW,VERY_LOW。
優先級主要做用在於做業調度器會根據優先級分配資源(slot數目或者在YARN中更加靈活的內存容量)。
3.任務級別參數調優
1)Map Task調優
高效利用環形緩衝區。具體方法是設置合適的io.sort.record.percent,這個屬性的含義是索引佔buffer的比例。索引或者數據達到了緩衝區的io.sort.spill.percent時,就會觸發flush,將數據讀入磁盤。根據索引大小(通常爲16B)和key/value大小,設置合適的io.sort.record.percent值=16/(16+R)(R爲key/value大小),這樣就能夠最大限度利用圓形緩衝區了。
2)Reduce Task調優
主要目的是減小磁盤的寫入。
寫入磁盤的條件爲:
a內存使用率超過heapsize*(mapred.job.shuffle.input.buffer.percent)達到mapred.job.shuffle.merge.percent(默認爲0.66);
b內存中文件數目超過mapred.inmem.merge.percent.threshold(默認是1000);
c文件大小超過閾值heapsize*(mapred.job.shuffle.input.buffer.percent)*0.25。
經過調整這些屬性值,能夠控制磁盤的寫入。