1、mr程序的效率瓶颈
功能:分布式离线计算
->计算机性能
CPU、内存、磁盘、网络
->I/O草足优化
1、数据倾斜(代码优化)
2、map和reduce数设置不合理
3、map运行阶段时间太长,导致reduce等待太久
4、小文件太多(combineTextInputFormat小文件合并)
5、不可分块的超大文件(不断的溢写)
6、多个溢写小文件需要多次merge
2、mr优化方法
六个方面考虑:数据输入、Map阶段、Reduce阶段、IO阶段、数据倾斜、参数调优
1、数据输入
1)合并小文件:在执行mr任务前就进行小文件合并
2)采用CombineTextInputFormat来作为输入,解决输入端大量小文件的场景
mr并不适合处理大量小文件
2、Map阶段
1)减少溢写次数(增加内存到200M 80%)
参数在mapred-default.xml
mapreduce.task.io.mb改内存
mapreduce.map.sort.spill.percent改百分数
2)减少合并的次数
mapreduce.task.io.sort.factor//默认是10,调大,文件的个数
3)在map之后,不影响业务逻辑的条件下进行combiner
3、reduce
1)合理的设置map与reduce的个数,需调试
2)设置map和reduce共存
设置运行一定程度的map运行后 启动reduce减少时间
mapreduce.job.reduce.slowstart.completedmaps//默认是0.05,调小
3)合理设置reduce端的buffer
mapreduce.reduce.markreset.buffer.percent//默认是0.0
4、IO传输阶段
1)进行数据压缩
2)使用sequenceFile二进制文件,使字节之间的紧密度更高
5、数据倾斜
1)进行范围分区
2)自定义分区
3)Combine
4)能用mapjoin,就坚决不用reducejoin
6、参数调优
1)设置核心数
mapreduce.map.cpu.vcores 核数
mapreduce.reduce.cpu.vcores
2)设置内存
mapreduce.map.memory.mb //默认1024MB,调高
mapreduce.reduce.memory.mb
3)reduce取map端那数据并行度
mapreduce.reduce.shuffle.parallelcopies //默认是5