1. 程式人生 > >MapReduce優化

MapReduce優化

對Hadoop,MapReduce的優化主要在四個方面

  1. CPU
    由於mapper和reducer數量依賴於每項任務CPU利用率。所以可在mapred-site.xml里根據每臺機器設定map和reduce數量。通過設定mapred.tasktracker.map.tasks.maximum定義tasktracker同時執行map最大數,mapred.tasktracker.reduce.tasks.maximum設定最大同時執行reduce任務數。
  2. 磁碟I/O
    通過mapred.compress.map.output=true設定map任務輸出在傳送前被壓縮,設定mapred.output.compress=true使整個作業輸出以壓縮格式,設定mapred.map.output.compression.codcc來定義map輸出壓縮格式。設定dfs.replication調整叢集備份數目,通過dfs.data.dir設定datanode在本地檔案系統上儲存資料快的位置。
  3. RAM
    mapred.child.java.opts設定每個task所用jvm的記憶體大小,預設200M。mapred.child.ulimit設定每個task虛擬記憶體的極限值。io.sort.mb設定對map本地結果進行排序時使用的緩衝區大小。當map節點的task還沒結束時,如果記憶體資料過多就要將記憶體資料寫入洗盤,io.sort.mb設定的緩衝區大小,當緩衝區佔用超過一個閾值io.sort.spill.percent時,會啟動一個執行緒對緩衝區記憶體進行spill溢寫,溢寫時會呼叫combiner,並且會按key對溢寫資料進行hash排序。io.sort.factor設定在merge sort階段將本地的spill溢寫檔案合成一個檔案時同時開啟的檔案控制代碼數量。min.num.spills.for.combine設定執行merge時,如果輸入的檔案小於這個數字就不呼叫combiner。mapred.job.shuffle.input.buffer.percent設定reduce存放從map節點取過來的資料佔用Jvm記憶體的比例。
  4. 網路I/O
    mapred.reduce.parallel.copies設定reduce到map取資料的執行緒數。
    PS:mapred.reduce.slowstart.completed.maps當map完成多少%時,開始shuffle