本文主要記錄hadoop 2.x版本中mapreduce參數調優,不涉及yarn的調優。
hadoop的預設配置檔案(以cdh5.0.1為例):
<a href="http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.3.0-cdh5.0.1/hadoop-project-dist/hadoop-common/core-default.xml" target="_blank">core-default.xml</a>
<a href="http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.3.0-cdh5.0.1/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml" target="_blank">hdfs-default.xml</a>
<a href="http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.3.0-cdh5.0.1/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml" target="_blank">mapred-default.xml</a>
說明: 在hadoop2中有些參數名稱過時了,例如原來的<code>mapred.reduce.tasks</code>改名為<code>mapreduce.job.reduces</code>了,當然,這兩個參數你都可以使用,隻是第一個參數過時了。
增大打開檔案資料和網絡連接配接上限,調整核心參數<code>net.core.somaxconn</code>,提高讀寫速度和網絡帶寬使用率
适當調整<code>epoll的檔案描述符</code>上限,提高hadoop rpc并發
<code>關閉swap</code>。如果程序記憶體不足,系統會将記憶體中的部分資料暫時寫入磁盤,當需要時再将磁盤上的資料動态換置到記憶體中,這樣會降低程序執行效率
增加<code>預讀緩存區</code>大小。預讀可以減少磁盤尋道次數和i/o等待時間
設定<code>openfile</code>
<code>hadoop.tmp.dir</code>:
預設值: /tmp
說明: 盡量手動配置這個選項,否則的話都預設存在了裡系統的預設臨時檔案/tmp裡。并且手動配置的時候,如果伺服器是多磁盤的,每個磁盤都設定一個臨時檔案目錄,這樣便于mapreduce或者hdfs等使用的時候提高磁盤io效率。
<code>fs.trash.interval</code>:
預設值: 0
說明: 這個是開啟hdfs檔案删除自動轉移到垃圾箱的選項,值為垃圾箱檔案清除時間。一般開啟這個會比較好,以防錯誤删除重要檔案。機關是分鐘。
<code>io.file.buffer.size</code>:
預設值:4096
說明:sequencefiles在讀寫中可以使用的緩存大小,可減少 i/o 次數。在大型的 hadoop cluster,建議可設定為 65536 到 131072。
<code>dfs.blocksize</code>:
預設值:134217728
說明: 這個就是hdfs裡一個檔案塊的大小了,cdh5中預設128m。太大的話會有較少map同時計算,太小的話也浪費可用map個數資源,而且檔案太小namenode就浪費記憶體多。根據需要進行設定。
<code>dfs.namenode.handler.count</code>:
預設值:10
說明:設定 namenode server threads 的數量,這些 threads 會用 rpc 跟其他的 datanodes 溝通。當 datanodes 數量太多時會發現很容易出現 rpc timeout,解決方法是提升網絡速度或提高這個值,但要注意的是 thread 數量多也表示 namenode 消耗的記憶體也随着增加
包括以下節點:
合理設定槽位數目
調整心跳配置
磁盤塊配置
設定rpc和線程數目
啟用批量任務排程
<code>mapred.reduce.tasks</code>(<code>mapreduce.job.reduces</code>):
預設值:1
說明:預設啟動的reduce數。通過該參數可以手動修改reduce的個數。
<code>mapreduce.task.io.sort.factor</code>:
說明:reduce task中合并小檔案時,一次合并的檔案資料,每次合并的時候選擇最小的前10進行合并。
<code>mapreduce.task.io.sort.mb</code>:
預設值:100
說明: map task緩沖區所占記憶體大小。
<code>mapred.child.java.opts</code>:
預設值:-xmx200m
說明:jvm啟動的子線程可以使用的最大記憶體。建議值<code>-xx:-usegcoverheadlimit -xms512m -xmx2048m -verbose:gc -xloggc:/tmp/@[email protected]</code>
<code>mapreduce.jobtracker.handler.count</code>:
說明:jobtracker可以啟動的線程數,一般為tasktracker節點的4%。
<code>mapreduce.reduce.shuffle.parallelcopies</code>:
預設值:5
說明:reuduce shuffle階段并行傳輸資料的數量。這裡改為10。叢集大可以增大。
<code>mapreduce.tasktracker.http.threads</code>:
預設值:40
說明:map和reduce是通過http進行資料傳輸的,這個是設定傳輸的并行線程數。
<code>mapreduce.map.output.compress</code>:
預設值:false
說明: map輸出是否進行壓縮,如果壓縮就會多耗cpu,但是減少傳輸時間,如果不壓縮,就需要較多的傳輸帶寬。配合mapreduce.map.output.compress.codec使用,預設是org.apache.hadoop.io.compress.defaultcodec,可以根據需要設定資料壓縮方式。
<code>mapreduce.reduce.shuffle.merge.percent</code>:
預設值: 0.66
說明:reduce歸并接收map的輸出資料可占用的記憶體配置百分比。類似mapreduce.reduce.shuffle.input.buffer.percen屬性。
<code>mapreduce.reduce.shuffle.memory.limit.percent</code>:
預設值: 0.25
說明:一個單一的shuffle的最大記憶體使用限制。
預設值: 10
說明:可并發處理來自tasktracker的rpc請求數,預設值10。
<code>mapred.job.reuse.jvm.num.tasks</code>(<code>mapreduce.job.jvm.numtasks</code>):
預設值: 1
說明:一個jvm可連續啟動多個同類型任務,預設值1,若為-1表示不受限制。
<code>mapreduce.tasktracker.tasks.reduce.maximum</code>:
預設值: 2
說明:一個tasktracker并發執行的reduce數,建議為cpu核數
對于一些不需要排序的應用,比如hash join或者limit n,可以将排序變為可選環節,這樣可以帶來一些好處:
在map collect階段,不再需要同時比較partition和key,隻需要比較partition,并可以使用更快的計數排序(o(n))代替快速排序(o(nlgn))
在map combine階段,不再需要進行歸并排序,隻需要按照位元組合并資料塊即可。
去掉排序之後,shuffle和reduce可同時進行,這樣就消除了reduce task的屏障(所有資料拷貝完成之後才能執行reduce()函數)。
map端–用netty代替jetty
reduce端–批拷貝
将shuffle階段從reduce task中獨立出來
在運作mapreduce任務中,經常調整的參數有:
<code>mapred.reduce.tasks</code>:手動設定reduce個數
<code>mapreduce.map.output.compress</code>:map輸出結果是否壓縮
<code>mapreduce.map.output.compress.codec</code>
<code>mapreduce.output.fileoutputformat.compress</code>:job輸出結果是否壓縮
<code>mapreduce.output.fileoutputformat.compress.type</code>
<code>mapreduce.output.fileoutputformat.compress.codec</code>