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值异常处理生成随机数,先局部聚合再整体聚合
文章链接
发表评论