hive企业级调优策略之Join优化

这篇具有很好参考价值的文章主要介绍了hive企业级调优策略之Join优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

测试所用到的数据参考:

原文链接:https://blog.csdn.net/m0_52606060/article/details/135080511

本教程的计算环境为Hive on MR。计算资源的调整主要包括Yarn和MR。

Join算法概述

Hive拥有多种join算法,包括Common Join,Map Join,Bucket Map Join,Sort Merge Buckt Map Join等,下面对每种join算法做简要说明:

Common Join

Common Join是Hive中最稳定的join算法,其通过一个MapReduce Job完成一个join操作。Map端负责读取join操作所需表的数据,并按照关联字段进行分区,通过Shuffle,将其发送到Reduce端,相同key的数据在Reduce端完成最终的Join操作(一个Join操作默认执行Common Join)。
如下图所示:
hive企业级调优策略之Join优化,hive,hive,hadoop,数据仓库

需要注意的是,sql语句中的join操作和执行计划中的Common Join任务并非一对一的关系,一个sql语句中的相邻的且关联字段相同的多个join操作可以合并为一个Common Join任务。
例如:

select 
    a.val, 
    b.val, 
    c.val 
from a 
join b on (a.key = b.key1) 
join c on (c.key = b.key1)

上述sql语句中两个join操作的关联字段均为b表的key1字段,则该语句中的两个join操作可由一个Common Join任务实现,也就是可通过一个Map Reduce任务实现。

select 
    a.val, 
    b.val, 
    c.val 
from a 
join b on (a.key = b.key1) 
join c on (c.key = b.key2)

上述sql语句中的两个join操作关联字段各不相同,则该语句的两个join操作需要各自通过一个Common Join任务实现,也就是通过两个Map Reduce任务实现。

Map Join

Map Join算法可以通过两个只有map阶段的Job完成一个join操作。其适用场景为大表join小表。若某join操作满足要求,则第一个Job会读取小表数据,将其制作为hash table,并上传至Hadoop分布式缓存(本质上是上传至HDFS)。第二个Job会先从分布式缓存中读取小表数据,并缓存在Map Task的内存中,然后扫描大表数据,这样在map端即可完成关联操作。如下图所示:
hive企业级调优策略之Join优化,hive,hive,hadoop,数据仓库
Map Join有两种触发方式,一种是用户在SQL语句中增加hint提示,另外一种是Hive优化器根据参与join表的数据量大小,自动触发。

(1)Hint提示

用户可通过如下方式,指定通过map join算法,并且ta将作为map join中的小表。这种方式已经过时,不推荐使用。

select /*+ mapjoin(ta) */
    ta.id,
    tb.id
from table_a ta
join table_b tb
on ta.id=tb.id;
(2)自动触发

Hive在编译SQL语句阶段,起初所有的join操作均采用Common Join算法实现。
之后在物理优化阶段,Hive会根据每个Common Join任务所需表的大小判断该Common Join任务是否能够转换为Map Join任务,若满足要求,便将Common Join任务自动转换为Map Join任务。
但有些Common Join任务所需的表大小,在SQL的编译阶段是未知的(例如对子查询进行join操作),所以这种Common Join任务是否能转换成Map Join任务在编译阶是无法确定的。
针对这种情况,Hive会在编译阶段生成一个条件任务(Conditional Task),其下会包含一个计划列表,计划列表中包含转换后的Map Join任务以及原有的Common Join任务。最终具体采用哪个计划,是在运行时决定的。大致思路如下图所示:
hive企业级调优策略之Join优化,hive,hive,hadoop,数据仓库

Map join自动转换的具体判断逻辑如下图所示:
hive企业级调优策略之Join优化,hive,hive,hadoop,数据仓库

图中涉及到的参数如下:
–启动Map Join自动转换

set hive.auto.convert.join=true;

–一个Common Join operator转为Map Join operator的判断条件,若该Common Join相关的表中,存在n-1张表的已知大小总和<=该值,则生成一个Map Join计划,此时可能存在多种n-1张表的组合均满足该条件,则hive会为每种满足条件的组合均生成一个Map Join计划,同时还会保留原有的Common Join计划作为后备(back up)计划,实际运行时,优先执行Map Join计划,若不能执行成功,则启动Common Join后备计划。

set hive.mapjoin.smalltable.filesize=250000;

–开启无条件转Map Join

set hive.auto.convert.join.noconditionaltask=true;

–无条件转Map Join时的小表之和阈值,若一个Common Join operator相关的表中,存在n-1张表的大小总和<=该值,此时hive便不会再为每种n-1张表的组合均生成Map Join计划,同时也不会保留Common Join作为后备计划。而是只生成一个最优的Map Join计划。

set hive.auto.convert.join.noconditionaltask.size=10000000;
优化案例

(1)示例SQL

select
    *
from order_detail od
join product_info product on od.product_id = product.id
join province_info province on od.province_id = province.id;

hive企业级调优策略之Join优化,hive,hive,hadoop,数据仓库

(2)优化前
上述SQL语句共有三张表进行两次join操作,且两次join操作的关联字段不同。故优化前的执行计划应该包含两个Common Join operator,也就是由两个MapReduce任务实现。执行计划如下图所示:
hive企业级调优策略之Join优化,hive,hive,hadoop,数据仓库

(3)优化思路
经分析,参与join的三张表,数据量如下

表名 大小
order_detail 1176009934(约1122M)
product_info 25285707(约24M)
province_info 369(约0.36K)

注:可使用如下语句获取表/分区的大小信息

desc formatted table_name partition(partition_col='partition');

hive企业级调优策略之Join优化,hive,hive,hadoop,数据仓库

三张表中,product_info和province_info数据量较小,可考虑将其作为小表,进行Map Join优化。
根据前文Common Join任务转Map Join任务的判断逻辑图,可得出以下优化方案:

方案一:

启用Map Join自动转换。

set hive.auto.convert.join=true;

不使用无条件转Map Join。

set hive.auto.convert.join.noconditionaltask=false;

调整hive.mapjoin.smalltable.filesize参数,使其大于等于product_info。

set hive.mapjoin.smalltable.filesize=25285707;

这样可保证将两个Common Join operator均可转为Map Join operator,并保留Common Join作为后备计划,保证计算任务的稳定。调整完的执行计划如下图:
hive企业级调优策略之Join优化,hive,hive,hadoop,数据仓库
hive企业级调优策略之Join优化,hive,hive,hadoop,数据仓库

方案二:

启用Map Join自动转换。

set hive.auto.convert.join=true;

使用无条件转Map Join。

set hive.auto.convert.join.noconditionaltask=true;

调整hive.auto.convert.join.noconditionaltask.size参数,使其大于等于product_info和province_info之和。

set hive.auto.convert.join.noconditionaltask.size=25286076;

这样可直接将两个Common Join operator转为两个Map Join operator,并且由于两个Map Join operator的小表大小之和小于等于hive.auto.convert.join.noconditionaltask.size,故两个Map Join operator任务可合并为同一个。这个方案计算效率最高,但需要的内存也是最多的。
调整完的执行计划如下图:
hive企业级调优策略之Join优化,hive,hive,hadoop,数据仓库
这个方案需要调整单个Map Task申请的container容器内存大小,否则可能会出现内存溢出等报错。

set  mapreduce.map.memory.mb=2048

hive企业级调优策略之Join优化,hive,hive,hadoop,数据仓库

方案三:

启用Map Join自动转换。

set hive.auto.convert.join=true;

使用无条件转Map Join。

set hive.auto.convert.join.noconditionaltask=true;

调整hive.auto.convert.join.noconditionaltask.size参数,使其等于product_info。

set hive.auto.convert.join.noconditionaltask.size=25285707;

这样可直接将两个Common Join operator转为Map Join operator,但不会将两个Map Join的任务合并。该方案计算效率比方案二低,但需要的内存也更少。
调整完的执行计划如下图:
hive企业级调优策略之Join优化,hive,hive,hadoop,数据仓库
hive企业级调优策略之Join优化,hive,hive,hadoop,数据仓库

Bucket Map Join

Bucket Map Join是对Map Join算法的改进,其打破了Map Join只适用于大表join小表的限制,可用于大表join大表的场景。
Bucket Map Join的核心思想是:若能保证参与join的表均为分桶表,且关联字段为分桶字段,且其中一张表的分桶数量是另外一张表分桶数量的整数倍,就能保证参与join的两张表的分桶之间具有明确的关联关系,所以就可以在两表的分桶间进行Map Join操作了。这样一来,第二个Job的Map端就无需再缓存小表的全表数据了,而只需缓存其所需的分桶即可。其原理如图所示:

优化说明

Bucket Map Join不支持自动转换,发须通过用户在SQL语句中提供如下Hint提示,并配置如下相关参数,方可使用。
1)Hint提示

hive (default)> 
select /*+ mapjoin(ta) */
    ta.id,
    tb.id
from table_a ta
join table_b tb on ta.id=tb.id;

2)相关参数
–关闭cbo优化,cbo会导致hint信息被忽略

set hive.cbo.enable=false;

–map join hint默认会被忽略(因为已经过时),需将如下参数设置为false

set hive.ignore.mapjoin.hint=false;

–启用bucket map join优化功能

set hive.optimize.bucketmapjoin = true;
优化案例

1)示例SQL

select
    *
from(
    select
        *
    from order_detail
    where dt='2020-06-14'
)od
join(
    select
        *
    from payment_detail
    where dt='2020-06-14'
)pd
on od.id=pd.order_detail_id;

hive企业级调优策略之Join优化,hive,hive,hadoop,数据仓库

2)优化前
上述SQL语句共有两张表一次join操作,故优化前的执行计划应包含一个Common Join任务,通过一个MapReduce Job实现。执行计划如下图所示:
hive企业级调优策略之Join优化,hive,hive,hadoop,数据仓库

3)优化思路
经分析,参与join的两张表,数据量如下。

表名	大小
order_detail	1176009934(约1122M)
payment_detail	334198480(约319M)

两张表都相对较大,若采用普通的Map Join算法,则Map端需要较多的内存来缓存数据,当然可以选择为Map段分配更多的内存,来保证任务运行成功。但是,Map端的内存不可能无上限的分配,所以当参与Join的表数据量均过大时,就可以考虑采用Bucket Map Join算法。下面演示如何使用Bucket Map Join。
首先需要依据源表创建两个分桶表,order_detail建议分16个bucket,payment_detail建议分8个bucket,注意分桶个数的倍数关系以及分桶字段。
–订单表

drop table if exists order_detail_bucketed;
create table order_detail_bucketed(
    id           string comment '订单id',
    user_id      string comment '用户id',
    product_id   string comment '商品id',
    province_id  string comment '省份id',
    create_time  string comment '下单时间',
    product_num  int comment '商品件数',
    total_amount decimal(16, 2) comment '下单金额'
)
clustered by (id) into 16 buckets
row format delimited fields terminated by '\t';

–支付表

drop table if exists payment_detail_bucketed;
create table payment_detail_bucketed(
    id              string comment '支付id',
    order_detail_id string comment '订单明细id',
    user_id         string comment '用户id',
    payment_time    string comment '支付时间',
    total_amount    decimal(16, 2) comment '支付金额'
)
clustered by (order_detail_id) into 8 buckets
row format delimited fields terminated by '\t';

然后向两个分桶表导入数据。
–订单表

insert overwrite table order_detail_bucketed
select
    id,
    user_id,
    product_id,
    province_id,
    create_time,
    product_num,
    total_amount   
from order_detail
where dt='2020-06-14';

–分桶表

insert overwrite table payment_detail_bucketed
select
    id,
    order_detail_id,
    user_id,
    payment_time,
    total_amount
from payment_detail
where dt='2020-06-14';

然后设置以下参数:
–关闭cbo优化,cbo会导致hint信息被忽略,需将如下参数修改为false

set hive.cbo.enable=false;

–map join hint默认会被忽略(因为已经过时),需将如下参数修改为false

set hive.ignore.mapjoin.hint=false;

–启用bucket map join优化功能,默认不启用,需将如下参数修改为true

set hive.optimize.bucketmapjoin = true;

最后在重写SQL语句,如下:

select /*+ mapjoin(payment_detail_bucketed) */
    *
from order_detail_bucketed od
         join payment_detail_bucketed pd on od.id = pd.order_detail_id;
注意:mapjoin里面不要写别名,不然可能会报错。

hive企业级调优策略之Join优化,hive,hive,hadoop,数据仓库

优化后的执行计划如图所示:
hive企业级调优策略之Join优化,hive,hive,hadoop,数据仓库

需要注意的是,Bucket Map Join的执行计划的基本信息和普通的Map Join无异,若想看到差异,可执行如下语句,查看执行计划的详细信息。详细执行计划中,如在Map Join Operator中看到 “BucketMapJoin: true”,则表明使用的Join算法为Bucket Map Join。

explain extended select /*+ mapjoin(pd) */
    *
from order_detail_bucketed od
join payment_detail_bucketed pd on od.id = pd.order_detail_id;

Sort Merge Bucket Map Join

Sort Merge Bucket Map Join(简称SMB Map Join)基于Bucket Map Join。SMB Map Join要求,参与join的表均为分桶表,且需保证分桶内的数据是有序的,且分桶字段、排序字段和关联字段为相同字段,且其中一张表的分桶数量是另外一张表分桶数量的整数倍。
SMB Map Join同Bucket Join一样,同样是利用两表各分桶之间的关联关系,在分桶之间进行join操作,不同的是,分桶之间的join操作的实现原理。Bucket Map Join,两个分桶之间的join实现原理为Hash Join算法;而SMB Map Join,两个分桶之间的join实现原理为Sort Merge Join算法。
Hash Join和Sort Merge Join均为关系型数据库中常见的Join实现算法。Hash Join的原理相对简单,就是对参与join的一张表构建hash table,然后扫描另外一张表,然后进行逐行匹配。Sort Merge Join需要在两张按照关联字段排好序的表中进行,其原理如图所示:

Hive中的SMB Map Join就是对两个分桶的数据按照上述思路进行Join操作。可以看出,SMB Map Join与Bucket Map Join相比,在进行Join操作时,Map端是无需对整个Bucket构建hash table,也无需在Map端缓存整个Bucket数据的,每个Mapper只需按顺序逐个key读取两个分桶的数据进行join即可。

优化说明

Sort Merge Bucket Map Join有两种触发方式,包括Hint提示和自动转换。Hint提示已过时,不推荐使用。下面是自动转换的相关参数:
–启动Sort Merge Bucket Map Join优化

set hive.optimize.bucketmapjoin.sortedmerge=true;

–使用自动转换SMB Join

set hive.auto.convert.sortmerge.join=true;
优化案例

1)示例SQL语句

select
    *
from(
    select
        *
    from order_detail
    where dt='2020-06-14'
)od
join(
    select
        *
    from payment_detail
    where dt='2020-06-14'
)pd
on od.id=pd.order_detail_id;

2)优化前
上述SQL语句共有两张表一次join操作,故优化前的执行计划应包含一个Common Join任务,通过一个MapReduce Job实现。
3)优化思路
经分析,参与join的两张表,数据量如下

表名	大小
order_detail	1176009934(约1122M)
payment_detail	334198480(约319M)

两张表都相对较大,除了可以考虑采用Bucket Map Join算法,还可以考虑SMB Join。相较于Bucket Map Join,SMB Map Join对分桶大小是没有要求的。下面演示如何使用SMB Map Join。
首先需要依据源表创建两个的有序的分桶表,order_detail建议分16个bucket,payment_detail建议分8个bucket,

注意分桶个数的倍数关系以及分桶字段和排序字段(一张表的分桶数量是另外一张表分桶数量的整数倍,分桶字段和排序字段必须是JOIN关联字段)

订单表

drop table if exists order_detail_sorted_bucketed;
create table order_detail_sorted_bucketed(
    id           string comment '订单id',
    user_id      string comment '用户id',
    product_id   string comment '商品id',
    province_id  string comment '省份id',
    create_time  string comment '下单时间',
    product_num  int comment '商品件数',
    total_amount decimal(16, 2) comment '下单金额'
)
clustered by (id) sorted by(id) into 8 buckets
row format delimited fields terminated by '\t';

–支付表

drop table if exists payment_detail_sorted_bucketed;
create table payment_detail_sorted_bucketed(
    id              string comment '支付id',
    order_detail_id string comment '订单明细id',
    user_id         string comment '用户id',
    payment_time    string comment '支付时间',
    total_amount    decimal(16, 2) comment '支付金额'
)
clustered by (order_detail_id) sorted by(order_detail_id) into 4 buckets
row format delimited fields terminated by '\t';

然后向两个分桶表导入数据。
–订单表

insert overwrite table order_detail_sorted_bucketed
select
    id,
    user_id,
    product_id,
    province_id,
    create_time,
    product_num,
    total_amount   
from order_detail
where dt='2020-06-14';

–分桶表

insert overwrite table payment_detail_sorted_bucketed
select
    id,
    order_detail_id,
    user_id,
    payment_time,
    total_amount
from payment_detail
where dt='2020-06-14';

然后设置以下参数:
–启动Sort Merge Bucket Map Join优化

set hive.optimize.bucketmapjoin.sortedmerge=true;

–使用自动转换SMB Join

set hive.auto.convert.sortmerge.join=true;

–加大map端容器内存

set  mapreduce.map.memory.mb=2048;

最后在重写SQL语句,如下:

select
    *
from order_detail_sorted_bucketed od
join payment_detail_sorted_bucketed pd
on od.id = pd.order_detail_id;

优化后的执行计如图所示:
hive企业级调优策略之Join优化,hive,hive,hadoop,数据仓库
hive企业级调优策略之Join优化,hive,hive,hadoop,数据仓库
看到执行过程我们发现只用到Map完成了join没有用到reduce,所以测试的开始加大map端内存,否则会应为内存不足导致失败。
hive企业级调优策略之Join优化,hive,hive,hadoop,数据仓库文章来源地址https://www.toymoban.com/news/detail-792991.html

到了这里,关于hive企业级调优策略之Join优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • AI 时代的企业级安全合规策略

    目录 漏洞分类管理的流程 安全策略管理 在扫描结果策略中定义细粒度的规则 有效考虑整个组织中的关键漏洞 确保职责分离 尝试组合拳 本文来源: about.gitlab.com 作者: Grant Hickman 在应用程序敏捷研发、敏捷交付的今天,让安全人员跟上研发的脚步是一件充满挑战的事情。此

    2024年02月03日
    浏览(52)
  • 企业级大数据安全架构(十)DBeaver连接Hive的Kerberos认证配置

    1.配置本地hosts 因为Kerberos认证过程及集群服务中,很多是以主机名的形式进行访问的,所以工作机要设置hosts. 域名映射,我们通过部署CDH的集群的每一台机器都已经配置了host(文件为/etc/hosts),工作机也需要配置window的host文件,如果提示无法修改,一般是需要管理员权限的原

    2024年02月21日
    浏览(46)
  • 毕业设计So Easy:SpringCloud Hadoop Vue实现企业级网盘系统

    目录 1、项目背景 2、项目功能 3、项目机制 4、功能模块结构 5、数据库设计 6、项目实现 6.1、前台主要功能模块 6.2、后台主要功能模块 7、项目效果 7.1、主界面 7.2、后台界面 7.3、菜单管理界面 很多计算机专业大学生经常和我交流:毕业设计没思路、不会做、论文不会写、

    2024年02月13日
    浏览(64)
  • 毕业设计项目 基于SpringCloud+Hadoop+Vue的企业级网盘系统设计与实现

    基于SpringCloud+Hadoop+Vue的企业级网盘系统设计与实现 提示:适合用于课程设计或毕业设计,工作量达标,源码开放 前端:vue-projectManage 后台:mycloud-admin 提供前端服务:mycloud 文件在线预览服务:file-online-preview 编程语言:Java、Mybatis、Spring、SpringBoot、SpringCloud、Node、Vue 开发环

    2024年04月24日
    浏览(58)
  • java项目分享 - 基于SpringCloud+Hadoop+Vue的企业级网盘系统设计与实现

    基于SpringCloud+Hadoop+Vue的企业级网盘系统设计与实现 提示:适合用于课程设计或毕业设计,工作量达标,源码开放 前端:vue-projectManage 后台:mycloud-admin 提供前端服务:mycloud 文件在线预览服务:file-online-preview 编程语言:Java、Mybatis、Spring、SpringBoot、SpringCloud、Node、Vue 开发环

    2024年02月05日
    浏览(58)
  • 【linux】Nginx企业级优化:恶意域名解析优化、禁止IP访问网站、HTTP请求方法优化

    鱼弦:公众号:红尘灯塔,CSDN内容合伙人、CSDN新星导师、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen) 恶意域名解析优化: 恶意域名解析优化是指通过配置Nginx,阻止恶意域名对服务器的访问,以提高服务器的安全性

    2024年04月26日
    浏览(39)
  • 计算机毕设分享 基于SpringCloud+Hadoop+Vue的企业级网盘系统设计与实现

    基于SpringCloud+Hadoop+Vue的企业级网盘系统设计与实现 提示:适合用于课程设计或毕业设计,工作量达标,源码开放 前端:vue-projectManage 后台:mycloud-admin 提供前端服务:mycloud 文件在线预览服务:file-online-preview 编程语言:Java、Mybatis、Spring、SpringBoot、SpringCloud、Node、Vue 开发环

    2024年02月20日
    浏览(93)
  • 毕业设计项目:基于SpringBoot+Hadoop+Vue企业级网盘分布式系统的设计与实现

    2.1 运行环境 2.2 基本处理流程 企业网盘系统的使用者分为企业普通员工和企业管理员,所以进行的基本处理流程是不一样的。企业普通员工进入本系统前台主界面后看到的是首页数据大盘,系统右上角有用户的头像和系统公告通知。在首页顶部的位置有个欢迎用户功能,此模

    2024年02月05日
    浏览(70)
  • 【完整版】zabbix企业级监控(概念、简单操作、页面优化、监控主机自己、监控linux、监控Win10)

    第三阶段基础 时  间:2023年7月19日 参加人:全班人员 内  容: zabbix企业级监控 目录 一、Zabbix概述 (一)Zabbix简介 (二)Zabbix运行条件: (三)Zabbix功能 (四)优劣势 (五)zabbix的监控原理: (六)扩展:zabbix的监控架构 (七)Grafana简介: (八)Zabbix特点 二、zabb

    2024年02月02日
    浏览(40)
  • Hadoop、Spark和Hive调优优化原理

    作者:禅与计算机程序设计艺术 随着互联网和大数据的普及以及处理器性能的提升,当时的技术已经远远超过了当时能够想象的范围。这段时间MapReduce计算框架已经成为一个主流的开源计算框架,包括Hadoop、Pig、Hive、Mahout、Storm等。 2010年Apache Spark横空出世,基于内存计算框

    2024年02月06日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包