1.join优化的介绍

hive的join优化一般是在data warehouse base(dwb)层出现,dwb层主要用于构建宽表,多表关联,需要join。hive的join分为map join 和reduce join,reduce join需要经过shuffle过程,涉及到IO流程,耗时较长,所以一般map join优化,map join分为一般的map join 、Bucket Map Join(分桶join)、SMB Join ( sort merge bucket map join)这三种。

2.map join

定义:每一个mapTask在读取数据的时候, 每读取一条数据, 就会和内存中班级表数据进行匹配, 如果能匹配的上, 将匹配上数据合并在一起, 输出即可。

好处: 将原有reduce join 问题全部都可以解决。

弊端:
1- 比较消耗内存;
2- 要求整个 Join 中, 必须的都有一个小表, 否则无法放入到内存中。

仅适用于: 小表 join 大表 | 大表 join 小表
在老版本(1.x以下)中, 需要将小表放置在前面, 大表放置在后面, 在新版本中, 无所谓。
建议, 如果明确知道那些表示小表, 可以优先将这些表, 放置在最前面。

如何使用呢?
set hive.auto.convert.join=true; – 开启 map join的支持 默认值为True
set hive.auto.convert.join.noconditionaltask.size=20971520; – 设置 小表数据量的最大阈值: 默认值为 20971520(20M)。
如果不满足条件, HIVE会自动使用 reduce join 操作。

下图是map join 的执行计划,只有Map Operator Tree,没有Reduce Operator Tree;而reduce joinl两者都有。
在这里插入图片描述

下图是reduce join 的执行计划,包括Map Operator Tree和Reduce Operator Tree。
在这里插入图片描述

3.Bucket Map Join

适用条件:
中型表 和 大表 join:
使用条件:
1- Join两个表必须是分桶表
2- 开启 Bucket Map Join 支持: set hive.optimize.bucketmapjoin = true;
3- 一个表的分桶数量是另一个表的分桶数量的整倍数
4- 分桶列 必须 是 join的ON条件的列
5- 必须建立在Map Join场景中

4 SMB Join ( sort merge bucket map join)

适用条件:
大表 和 大表 join
使用条件:
1- 两个表必须都是分桶表
2- 开启 SMB Join 支持:
set hive.auto.convert.sortmerge.join=true;
set hive.optimize.bucketmapjoin.sortedmerge = true;
set hive.auto.convert.sortmerge.join.noconditionaltask=true;
3- 两个表的分桶的数量是一致的
4- 分桶列必须是 join的 on条件的列, 同时必须保证按照分桶列进行排序操作
– 开启强制排序
set hive.enforce.sorting=true;
– 在建分桶表使用: 必须使用sorted by()
5- 应用在Bucket Map Join 场景中
– 开启 bucket map join
set hive.optimize.bucketmapjoin = true;
6- 必须开启HIVE自动尝试使用SMB 方案:
set hive.optimize.bucketmapjoin.sortedmerge = true;

smb join的总结:
set hive.auto.convert.join=true;
set hive.auto.convert.join.noconditionaltask.size=20971520;
set hive.optimize.bucketmapjoin = true;
set hive.auto.convert.sortmerge.join=true;
set hive.optimize.bucketmapjoin.sortedmerge = true;
set hive.auto.convert.sortmerge.join.noconditionaltask=true;
set hive.enforce.sorting=true;
set hive.optimize.bucketmapjoin.sortedmerge = true;

smb join的建表语句:
create table course (cid string,c_name string,tid string) clustered by(cid) SORTED BY(cid) into 3 buckets row format delimited fields terminated by ‘\t’;

分桶的数量要根据文件大小和hive.auto.convert.join.noconditionaltask.size参数决定,两者相除得到最小的分桶数量。

加载数据:
insert overwrite table course select * from course_common cluster by(cid);
下图是smb join执行计划的图片,图中红线部分说明走的是smb join。
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐