对Hadoop,MapReduce的优化主要在四个方面
- CPU
由于mapper和reducer数量依赖于每项任务CPU利用率。所以可在mapred-site.xml里根据每台机器设置map和reduce数量。通过设置mapred.tasktracker.map.tasks.maximum定义tasktracker同时运行map最大数,mapred.tasktracker.reduce.tasks.maximum设置最大同时运行reduce任务数。 - 磁盘I/O
通过mapred.compress.map.output=true设置map任务输出在发送前被压缩,设置mapred.output.compress=true使整个作业输出以压缩格式,设置mapred.map.output.compression.codcc来定义map输出压缩格式。设置dfs.replication调整集群备份数目,通过dfs.data.dir设置datanode在本地文件系统上存储数据快的位置。 - RAM
mapred.child.java.opts设置每个task所用jvm的内存大小,默认200M。mapred.child.ulimit设置每个task虚拟内存的极限值。io.sort.mb设置对map本地结果进行排序时使用的缓冲区大小。当map节点的task还没结束时,如果内存数据过多就要将内存数据写入洗盘,io.sort.mb设置的缓冲区大小,当缓冲区占用超过一个阈值io.sort.spill.percent时,会启动一个线程对缓冲区内存进行spill溢写,溢写时会调用combiner,并且会按key对溢写数据进行hash排序。io.sort.factor设置在merge sort阶段将本地的spill溢写文件合成一个文件时同时打开的文件句柄数量。min.num.spills.for.combine设置执行merge时,如果输入的文件小于这个数字就不调用combiner。mapred.job.shuffle.input.buffer.percent设置reduce存放从map节点取过来的数据占用Jvm内存的比例。 - 网络I/O
mapred.reduce.parallel.copies设置reduce到map取数据的线程数。
PS:mapred.reduce.slowstart.completed.maps当map完成多少%时,开始shuffle