1.使用分区裁剪、列裁剪

分区裁剪:只读取所需要的分区 列裁剪:只读取所需要的列,尽量避免使用select * ,将where过滤提前

2.count distinct&group by 尽量使用group by 代替 distinct

比如:select count(distinct order_no) from order_snap 会将所有的order_no集中到一个reduce里。正确写法:select count(order_no) from order_snap group by order_no 通过group by 均衡分步,所以效率很高

3.谓词下推

提前执行过滤,以减少map到reduce的传输数量

4.分区&分桶

按照表的某列分为多个分区,避免全局扫描。尽量避免使用动态分区,因为它会把每一个分区分配到reduce数量里,当分区数量特别多的时候,reduce的数量也是成倍往上增加。分桶是对列值取hash,相同列桶进行join操作就可以了

5.mr优化

如果是少量大文件减少mapper数,如果是大量非小文件就增加mapper数,提高并行度。

6.减少job数

先union 再聚合,划分的stage少,效率高

7.数据倾斜优化

倾斜字段打散,null值异常处理生成随机数,先局部聚合再整体聚合

文章链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。