天天看点

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>