一、Map端可以进行的优化
1.合并小文件
采用CombineTextInputFormat切片规则
2.自定义分区,减少数据倾斜
定义类,实现Partitioner接口,重写getPartition方法
3.减少溢写次数
mapreduce.task.io.sort.mb(修改Shuffle环形缓冲区的大小,默认100M,可以提高到200m)
mapreduce.map.sort.spill.percent(修改环形缓冲区溢出的阈值,默认880%,可以提高到90)
4.增加每次Merge合并次数
mapreduce.task.io.sort.factor(默认10次,可以提高到20次)
5.在不影响业务结果的条件下可以采用Combiner
6.为了减少磁盘IO,可以采用Snappy或者LZO压缩
7.修改MapTask内存上限
mapreduce.map.memory.mb(默认是1024MB 可以根据128m数据对应1G的内存比例来提高)
8.修改MapTaskCPU核数
mapreduce.map.cpu.vcores(默认MapTask的Cpu核数是1)
9.异常重试次数
mapreduce.map.maxattempts(每个MapTask最大的异常重试次数,一旦次数超过这个数值,则认为MapTask任务运行失败,默认值是4,可以根据情况适当提高)
二、reduce端可以进行的优化
1.修改每个ReduceTask去Map中拉取数据的并行数
mapreduce.reduce.shuffle.parallelcopies(默认值是5.可以调高倒10)
2.修改Buffer占Reduce内存的比例
mapreduce.reduce.shuffle.input.buffer.percent(默认值是0.7,可以提高到0.8)
3.Buffer中数据达到多少开始写入磁盘
mapreduce.reduce.shuffle.merge.percent(默认值是0.66,可以提高到0.75)
4.修改reducetask内存的大小
mapreduce.reduce.memory.mb(默认是1024,根据128对应1G 适当提高)
5.修改cpu核数
mapreduce.reduce.cpu.vcores(默认核数是1,可以提高2-4)
6.失败重试次数
mapreduce,reduce.maxattempts(失败次数超过该值,认为任务失败)
7.向MapTask给reduceTask申请资源
mapreduce.job.reduce,slowstart.completedmaps(当MapTask完成的比例达到该值后才会为ReduceTask申请资源。默认是0.05)