Hive版本: hive-1.1.0-cdh5.14.2
概述
如果表关联时,有一张表很小,那么可以在大表通过mapper时将小表完全加载到内存中,Hive可以在map端完成关联过程,这就是所谓的map-side JOIN。
使用map-side JOIN可以省掉常规的reduce过程,从而提升Hive的效率。
Hive中有三个和map-side JOIN相关的参数:
参数 | 默认值 |
---|---|
hive.auto.convert.join | true (Hive 0.11.0+) |
hive.auto.convert.join.noconditionaltask | true |
hive.auto.convert.join.noconditionaltask.size | 10000000(10M) |
如果想使用map-side JOIN,重点关注hive.auto.convert.join.noconditionaltask.size就可以了,可以认为如果小表的大小超过此参数的值(默认10M),Hive就不会自动优化为map-side JOIN。但可以根据节点的实际内存大小,合理调整此参数值。
Hive官方文档对参数有如下解释:
注意:
由于map-side JOIN只能流化一个表到内存,而全外连接( Full Outer join)需要关联后两张表的数据,所以暂不能使用此优化。
测试
下面是对hive.auto.convert.join.noconditionaltask.size的简单测试:
测试环境中有两张表youtubevideo_orc(132.42M),youtubevideo_user_orc(17.33M)
1. hive.auto.convert.join.noconditionaltask.size不做调整
因以上二表的任一个都大于此参数的默认值(10M),所以Hive会执行reduce-side JOIN,而非map-side JOIN。
0: jdbc:hive2://node03:10000> explain select t1.uploader,t2.friends from youtubevideo_orc t1
. . . . . . . . . . . . . . > join youtubevideo_user_orc t2 on t1.uploader = t2.uploader
. . . . . . . . . . . . . . > limit 10;
在执行计划中可以看出,Hive依然执行了reduce过程:
2. hive.auto.convert.join.noconditionaltask.size调整为20M
因youtubevideo_user_orc(17.33M),符合小于hive.auto.convert.join.noconditionaltask.size的值,所以Hive会自动调整为map-side JOIN。
0: jdbc:hive2://node03:10000> set hive.auto.convert.join.noconditionaltask.size = 20000000;
No rows affected (0.005 seconds)
0: jdbc:hive2://node03:10000> explain select t1.uploader,t2.friends from youtubevideo_orc t1
. . . . . . . . . . . . . . > join youtubevideo_user_orc t2 on t1.uploader = t2.uploader
. . . . . . . . . . . . . . > limit 10;
在执行计划中可以看出,Hive只执行map,而没有reduce过程(非重要部分已在截图中省略):
3. Full Outer Join不会使用map-side JOIN
关联方式改为Full Outer Join后,即使hive.auto.convert.join.noconditionaltask.size调整为20M,Hive依然使用reduce-side JOIN,而非map-side JOIN。
0: jdbc:hive2://node03:10000> set hive.auto.convert.join.noconditionaltask.size = 20000000;
0: jdbc:hive2://node03:10000> explain select t1.uploader,t2.friends from youtubevideo_orc t1
. . . . . . . . . . . . . . > full outer join youtubevideo_user_orc t2 on t1.uploader = t2.uploader
. . . . . . . . . . . . . . > limit 10;
总结
map-side JOIN可以省掉reduce过程,从而提高Hive效率;
Hive 0.11.0版本后,默认开启自动map-side JOIN优化,我们需要合理调整hive.auto.convert.join.noconditionaltask.size参数值。