当job 运行中发现如下的现象,通常job是可以优化的:
Job的运行过程中会有一系列的sort 的操作,并且reduce input groups的counter变量的值远远要小于reduce input records counter。
Job在 mapper完成以后,shuffle过程中传输了大量的中间结果文件 (例如:每个slave上的map output bytes都好几个GB)
在job 的webui上的counter中看到,job的spilled records的数量远远要大于map output records的数量。
如果job的算法中涉及到许多的排序操作,可以尝试写一个Combiner 来提高job性能。Hadoop 的mapreduce 框架中提供了Combiner来减少中间结果对磁盘的写入和减少中间结果在mapper和reducer之间的传输,通常这两个方面都是非常影响作业性能的两个方面。
性能对比:
修改wordcount程序,将setCombinerClass去掉,或者不去掉,两种方式对比运行。去掉的结果是,让每一个mapper的运行时间由原先的33s变成了平均48s,并且shuffle过程中的中间数据 也由1G变成1.4GB,整个的job由原先的8分30 秒变成了15分42秒,将近两倍了。而且,这个测试还是在enable了map的output 压缩的情况下进行的,如果disable这个特性,性能的影响可能会更加大。