天天看點

MapReduce任務參數調優1. 作業系統調優2. Hdfs參數調優3. MapReduce參數調優4. 系統優化5. 總結

本文主要記錄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>