一、impala的两种hash join
- broadcast
适合大表join小表的场景,将小表广播到大表所在的所有节点,可以本地实现join。
- shuffle join
适合两个大表join,将大表shuffle成多个部分,分别在不同的节点join。
二、常用优化思路方法
-
采用hints来指示Impala执行方法
- 大表 inner 小表
优化方法:select [straight_join] xxx from A inner join[broadcast] B on xxxx
straight_join 可以固定join的先后顺序,不加可以能把A大表做广播JOIN - 大表 left join 大表
默认会广播右表,left join [shuffle] 会partitioned 再join - 大表在前 小表在后
三、举个栗子
1. A JOIN[shuffle] B JOIN[shuffle] C , A和B是小表,C是大表
执行计划生成
由于A B数据量很小,所以参与计算的节点只有2个instances;C表大表 加了shuffle后,会把数据partitioned到那两个节点,最终导致2个节点内存消耗过大,内存溢出。
- 优化方法: JOIN顺序改成 C join B join A
C表先scan,开启节点增加,后面join A小表,并行操作,速度明显提升