您的位置:首页 > 其它

MapReduce 调优

2015-12-25 12:43 204 查看

Job Tracker Related

严格来说,下面这个配置项,是决定HDFS文件block数量的多少(也就是文件个数),但是它会间接的影响Job Tracker的调度和内存的占用(其实更能影响name node内存的使用)。

dfs.block.size

mapred.map.tasks.speculative.execution=true

mapred.reduce.tasks.speculative.execution=true

这两个是推测执行的配置项,当然如果你从来不关心这两个选项也没关系,它们默认值是true

所谓的推测执行,就是当所有task都开始运行之后,Job Tracker会统计所有任务的平均进度,如果某个task所在的task node机器配置比较低或者CPU load很高(原因很多),导致任务执行比总体任务的平均执行要慢,此时Job Tracker会启动一个新的任务(duplicate task),原有任务和新任务哪个先执行完就把另外一个kill掉,这也是我们经常在Job Tracker页面看到任务执行成功,但是总有些任务被kill,就是这个原因。

mapred.child.java.opts

一般来说,都是reduce耗费内存比较大,这个选项正是用来设置JVM堆的最大可用内存,但是也不要设置太大,如果超过2G,应该考虑从程序设计角度去优化。


Map Related

Input Split的大小,决定了一个Job拥有多少个map,默认64M每个Split,如果输入的数据量巨大,那么默认的64M的block会有几万甚至几十万的Map Task,集群的网络传输会很大,最严重的是给Job Tracker的调度、队列、内存都会带来很大压力。

mapred.min.split.size
这个配置项决定了每个 Input Split的最小值,也间接决定了一个Job的map 数目。

mapred.compress.map.output

压缩Map的输出应该作为一个习惯,这样做有两个好处:

a)      压缩是在内存中进行,所以写入map本地磁盘的数据就会变小,大大减少了本地IO次数

b)      Reduce从每个map节点copy数据,也会明显降低网络传输的时间

补充:数据序列化其实效果会更好,无论是磁盘IO还是数据大小,都会明显的降低。

io.sort.mb

以MB为单位,默认100M,通常来看,这个值太小了

这个选项定义了map输出结果在内存占用buffer的大小,当buffer达到一定阈值,会启动一个后台线程来对buffer的内容进行排序,然后写入本地磁盘(一个spill文件)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: