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.jointrue (Hive 0.11.0+)hive.auto.convert.join.noconditionaltasktruehive.auto.convert.join.noconditionaltask.size10000000(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)
因以上二表的任一个都大于此参数的默认值(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过程:
因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过程(非重要部分已在截图中省略):
关联方式改为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参数值。