优化前
1.熟知业务要求
2.熟知数据分布状态(是否倾斜、是否是多个小文件等),可以使用采样来了解数据
通用型优化策略
1.文件存储格式
使用更加优化的格式的文件,例如Parquet、ORC,综合来说,ORC最优。
2.文件压缩
可以在mr各阶段启用压缩,例如:数据块可以被压缩(reduce输出可以被压缩)、map输出数据可以被压缩(减少shuffle过程中传输的数据量)
3.shuffle优化
核心思想:减少磁盘IO。可以通过调节一下几个方面来达到效果:
1.增加环形缓冲区大小
2.增大merge过程一次可以合并的溢写文件的数量(注意:量力(内存)而行)
3.增大溢写的第一级门槛
4.在能使用Combiner的业务场景下,尽可能的使用Combiner
5.合理设置Combiner的阈值
6.map输出的k、v尽量小
专用型优化策略
减少不必要的消耗
1.使用更加优化的数据格式文件,例如ORC
2.map端join(省去shuffle过程)
3.countall 或 topn场景下合理使用cleanup方法(减少shuffle过程中的数据传输量)
4.排序操作尽量使用shuffle内置的排序机制而不要自己手动排序
合理进行任务分配
数据本身不均衡
数据倾斜
通过自定义业务k,均分分散倾斜的数据,要实现同等效果还可以自定义Partitioner
大量小文件
1.当MR程序的输入是一堆小文件时,可以先将小文件合并,然后在再进行处理
2.使用Uber模式
数据本身均衡
1.合理设置ReduceTask的数量,假定map总输出的键值对的大小是10GB(并且去重后的key的数量远大于ReduceTask的数量),而一个ReduceTask所用的Continer的内存为1GB,那么合理的ReduceTask的数量为10÷(1*0.7)≈15(这里需要采用进1法);
2.为具体的任务设置合适的Continer大小,无论是MapTask还是ReduceTask,只要是cpu密集型的,其所使用的Continer就应该由较多的cpu和合适的内存所组成。同样的,如果任务是IO密集型的,其所使用的Continer就应该改由合适的cpu和较大的内存所组成。这个一般不全局调节。
优化最佳实践
在这里插入图片描述
MR优化总结
最新推荐文章于 2024-07-17 09:36:32 发布