9.3.3 任务级别参数调优
1.Map Task调优
在8.3节中已经提到,Map Task的输出结果将被暂时存放到一个环形缓冲区中,这个缓冲区的大小由参数“io.sort.mb”指定(单位是MB,默认是100 MB)。该缓冲区主要由两部分组成:索引和实际数据。默认情况下,索引占整个buffer的比例为io.sort.record.percent(默认为0.05,即5%),剩下的空间全部存放数据,当且仅当满足以下任意一个条件时,才会触发一次flush,生成一个临时文件:
❑索引空间使用率达到比例为io.sort.spill.percent(默认是0.8,即80%)。
❑数据空间使用率达到比例为io.sort.spill.percent(默认是0.8,即80%)。
合理地调整io.sort.record.percent值,可减少中间文件数目,提高任务执行效率。举例说明,如果你的key/value非常小,则可以适当调大io.sort.record.percent值,以防止索引空间优先达到使用上限触发flush。考虑到每条数据记录(一个key/value)需占用索引大小为16 B,因此,建议io.sort.record.percent=16/(16+R),其中R为平均每条记录的长度。
综上所述,用户可根据自己作业的特点对以下参数进行调优:
❑io. sort.mb;
❑io. sort.record.percent;
❑io. sort.spill.percent。
2.Reduce Task调优
在8.3节中已经提到,Reduce Task会启动多个拷贝线程从每个Map Task上读取相应的中间结果,具体的拷贝线程数目由参数“mapred.reduce.parallel.copies”(默认为5)指定。对于每个待拷贝的文件,如果文件大小小于一定阈值A,则将其放到内存中,否则以文件的形式存放到磁盘上。如果内存中文件满足一定条件D,则会将这些数据写入磁盘,而当磁盘上文件数目达到io.sort.factor(默认是10)时,进行一次合并。阈值A为:
heapsize{mapred. job.shuffle.input.buffer.percent}0.25
其中,heapsize是通过参数“mapred.child.java.opts”指定的,默认是200 MB;mapred.job.shuffle.input.buffer.percent默认大小为0.7。
条件D为以下两个条件中任意一个:
❑内存使用率(总的可用内存为heapsize*{mapred.job.shuffle.input.buffer.percent})达到mapred.job.shuffle.merge.percent(默认是0.66)。
❑内存中文件数目超过mapred.inmem.merge.threshold(默认是1 000)。
综上所述,用户可根据自己作业的特点对以下参数进行调优:
❑mapred. reduce.parallel.copies;
❑io. sort.factor;
❑mapred. child.java.opts;
❑mapred. job.shuffle.input.buffer.percent;
❑mapred. inmem.merge.threshold。