1.hadoop的inputformat提供了在block的基础上更细粒度控制mapper输入块的大小,设置split的大小范围。
FileInputFormat.setMaxInputSplitSize(job,size)
FileInputFormat.setMinInputSplitSize(job,size)
这种方法可以控制mapper的数量。
也可以在配置文件中配置,mapred.min.split.size。
2.推测任务。
mapred.map.tasks.speculative.execution和mapred.reduce.tasks.speculative.execution。
当所有task开始运行后,Job Tracker会统计所有任务的平均进度,如果某个task所在的node机器配置比较低或者CPU 占用很高,导致任务执行比总体任务的平均执行要慢。此时,Job Tracker会启动一个新的任务duplicate task ,这个新任务就是推测任务,原有任务和新任务哪个先执行完就把另外一个kill掉。这也是在Job Tracker页面看到任务执行成功,但是总有些任务被kill的原因。推测任务也要占用计算资源,任务执行本身很耗资源的情况下可以设置成false,禁止执行。
3.io.sort.mb
以MB为单位,默认100M,定义了map输出结果在内存中占用buffer的大小,当buffer达到一定的阈值,会启动后台线程将buffer内容写入本地磁盘(一个spill文件)。观察hadoop的日志,如果spill次数比较多说明这个缓存大小设置太低。
io.sort.spill.percent 就是上述的阈值,默认0.8。
4.io.sort.factor