根本思想
- 尽早过滤数据,减少每个阶段数量
- 减少job数量
- 解决数据倾斜
过滤数据
列裁剪
只查询必要的列,不被查询的列可以不被访问,提升性能
分区裁剪
减少不必要的分区
利用Hive的优化机制减少job数量
out join inner join,如果是join的key相同,不论表的数量,都会合并为一个mapReduce任务
job的输入输出优化
善用muti-insert, union all,不同表的union all相当于multiple inputs,同一个表的union all,相当map一次输出多条
1 | insert overwrite table tmp1 |
Join优化
避免笛卡尔积
1 | select … |
数据过滤
在join前过滤掉不需要的数据
小表放前大表放后原则
在编写带有join操作的代码语句时,应该将条目少的表/子查询放在join操作符的左边
因为在Reduce阶段,位于join操作符左边的表的内容会被加载进内存,载入条目较少的表可以有效减少OOM。所以对于同一个key来说,对应的value值小的放前,大的放后。
map join 来避免数据倾斜
数据倾斜一般是由于代码中的join或group by或distinct的key分布不均导致的
Join算法一般有两种
- (map side join) replication join:把其中一个表复制到所有节点,这样另一个表在每个节点上面的分片就可以跟这个完整的表join了
- (reduce side join) repartition join:把两份数据按照join key进行hash重分布,让每个节点处理hash值相同的join key数据,也就是做局部的join
合理使用left semi join
left semi 是比 In exist 效率高的一种方式