首页 > Hadoop > Hadoop 任务执行的优化。
2014
04-15

Hadoop 任务执行的优化。

在配置hadoop集群的时候,不得不考虑到一些参数的配置,hadoop集群搭建比较容易,但是要修改成合适的参数时,可能就需要大量的经验测试,网络上也有很多的建议值,小编在这里只简单的说几个经常要注意的地方。

1. 推测式执行:在mapred-site.xml配置文件中设置mapred.map.tasks.speculative.execution和mapred.reduce.tasks.speculative.execution可以分别为map和reduce任务开启推测式执行,缺省是打开的。当jobtracker发现有任务拖后腿的时候,就会另外启动一个相同的任务,这个新任务就是推测任务,然后哪个任务先执行完就会kill另一个任务,关于这一点,通常在监控网页上会看到正常执行完的任务有被kill掉的任务,如果本身mapreduce程序有问题,这样可能会导致集群更慢,因为需要分配更多的任务来执行相同的mapreduce。

2. 重用JVM:经常使用C和JAVA的程序员可能都会觉得C比JAVA执行要快,其实这部分时间大部分消耗在启动JVM上,所以给我们的感觉可能要慢,在hadoop中,我们可以在mapred-site.xml配置文件中设置mapred.job.reuse.jvm.num.tasks单个JVM上重用运行的最大任务数,设置为-1表示没有限制,默认值为1. 当然设置的时候需要注意,因为可能某台集群很长时间不会分配到mapreduce任务,如果JVM一直不释放,对服务器也是一种资源消耗。

3. 忽略模式:因为在大多数hadoop集群中,我们使用的服务器并不像oracle那样使用比较昂贵的服务器,可能就是一些PC server搭建的hadoop集群,所以错误是一种比较常态的。当任务在读取数据失败2次后,会通过心跳把数据位置告诉jobtracker,jobtracker收到并重启该任务并且在遇到记录的坏数据时直接跳过,当然这个功能默认是关闭状态,可以用java里面的skipbadrecord方法打开,如果有必要的话。

4. 另外一些参数的配置:

dfs.block.size(HDFS上每个block的大小,默认是64MB,已字节为单位)

io.sort.mb和io.sort.spill.percent(map输出在内存buffer的大小和buffer阀值),buffer大小默认是100MB,阀值设置默认是0.8,也就是80%,当map的输出结果达到100*0.8MB时,后台线程就会对buffer中的数据进行排序,然后写入磁盘,在排序的过程中,map的输出结果会继续写到余下的20%中,如果20%写满之后还未排序结束,那map会被block,然后等待。通常这个不能随便设置,也并不是越大越好,最好观察hadoop日志,如果spill次数很多,说明这个buffer大小设置低,可以进行适当的调整。

此外还有一些参数配置,小编就不一一介绍了。在mapreduce代码中,尽量将map输出压缩,这样可以避免reduce程序的扫描。

最后编辑:
作者:Jerry
一个积极向上的小青年,热衷于分享--Focus on DB,BI,ETL