【Hive】性能调优 - map-side JOIN

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官方文档对参数有如下解释:
【Hive】性能调优 - map-side JOIN_第1张图片
注意:

由于map-side JOIN只能流化一个表到内存,而全外连接( Full Outer join)需要关联后两张表的数据,所以暂不能使用此优化。
在这里插入图片描述

测试

下面是对hive.auto.convert.join.noconditionaltask.size的简单测试:
测试环境中有两张表youtubevideo_orc(132.42M),youtubevideo_user_orc(17.33M)
【Hive】性能调优 - map-side JOIN_第2张图片在这里插入图片描述

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过程:
【Hive】性能调优 - map-side JOIN_第3张图片

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过程(非重要部分已在截图中省略):
【Hive】性能调优 - map-side JOIN_第4张图片

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;

【Hive】性能调优 - map-side JOIN_第5张图片

总结

map-side JOIN可以省掉reduce过程,从而提高Hive效率;
Hive 0.11.0版本后,默认开启自动map-side JOIN优化,我们需要合理调整hive.auto.convert.join.noconditionaltask.size参数值。

你可能感兴趣的:(Hive)