【大数据之Hive】二十三、HQL语法优化之数据倾斜

这篇具有很好参考价值的文章主要介绍了【大数据之Hive】二十三、HQL语法优化之数据倾斜。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 数据倾斜概述

  数据倾斜指参与计算的数据分布不均,即某个key或者某些key的数据量远超其他key,导致在shuffle阶段,大量相同key的数据被发往同一个Reduce,导致该Reduce所需的时间远超其他Reduce,成为整个任务的瓶颈。
  Hive中的数据倾斜常出现在分组聚合和join操作的场景中 。

2 分组聚合导致的数据倾斜

2.1 优化说明

  Hive中未经优化的分组聚合,是通过一个MapReduce Job实现的。Map端负责读取数据,并按照分组字段分区,通过Shuffle,将数据发往Reduce端,各组数据在Reduce端完成最终的聚合运算。
  如果group by分组字段的值分布不均,就可能导致大量相同的key进入同一Reduce,从而导致数据倾斜问题。

解决思路:
Map-Site聚合和Skew-GroupBy优化。

1、Map-Side聚合

  开启Map-Side聚合后,数据会现在Map端完成部分聚合工作(可以看作大小一样的切片,相当于先完成切片内的聚合工作)。

  即便原始数据是倾斜的,经过Map端的初步聚合后,发往Reduce的数据也就不再倾斜了。最佳状态下,Map-端聚合能完全屏蔽数据倾斜问题。

相关参数:

--启用map-side聚合
set hive.map.aggr=true;

--用于检测源表数据是否适合进行map-side聚合。检测的方法是:
--先对若干条数据进行map-side聚合,若聚合后的条数和聚合前的条数比值小于该值,
--则认为该表适合进行map-side聚合;否则,认为该表数据不适合进行map-side聚合,
--后续数据便不再进行map-side聚合。
set hive.map.aggr.hash.min.reduction=0.5;

--用于检测源表是否适合map-side聚合的条数。
set hive.groupby.mapaggr.checkinterval=100000;

--map-side聚合所用的hash table,占用map task堆内存的最大比例,
--若超出该值,则会对hash table进行一次flush。
set hive.map.aggr.hash.force.flush.memory.threshold=0.9;

2、Skew-GroupBy优化

  Skew-GroupBy专门用于处理由于group by导致数据倾斜的方案。

原理:
  启动两个MR任务,第一个MR按照随机数分区,将数据分散发送到Reduce,完成部分聚合;
  第二个MR读取第一个Reduce端的数据按照分组字段分区,完成最终聚合。

相关参数:

--启用分组聚合数据倾斜优化
set hive.groupby.skewindata=true;

2.2 案例

1、示例SQL语句

select
    province_id,
    count(*)
from order_detail
group by province_id;

2、优化前
  表中的province_id字段是存在倾斜的,若不经过优化,通过观察yarn中reduce任务的执行过程,是能够看出数据倾斜现象的。
  hive中的map-side聚合是默认开启的,若想看到数据倾斜的现象,需要先将hive.map.aggr参数设置为false。
3、优化思路
(1)Map-Side聚合
设置参数:

--启用map-side聚合
set hive.map.aggr=true;
--关闭skew-groupby
set hive.groupby.skewindata=false;

执行计划:
【大数据之Hive】二十三、HQL语法优化之数据倾斜,hive,大数据,hive,hadoop,sql
  观察yarn中reduce任务的执行过程,很明显可以看到开启map-side聚合后,reduce数据不再倾斜。
(2)Skew-GroupBy优化
设置参数:

--启用skew-groupby
set hive.groupby.skewindata=true;
--关闭map-side聚合
set hive.map.aggr=false;

  开启Skew-GroupBy优化后,可以很明显看到该sql执行在yarn上启动了两个mr任务,第一个mr打散数据,第二个mr按照打散后的数据进行分组聚合。
【大数据之Hive】二十三、HQL语法优化之数据倾斜,hive,大数据,hive,hadoop,sql

2.3 总结

  Map-site优化优于Skew-GroupBy优化,能做Map-site聚合就做Map-site聚合。

  Map-site聚合要在Map端维护一个HashTable,HashTable消耗了内存,即内存不充足的情况下尽量不做Map-site聚合,但也可以做,当HashTable超过设定的内存阈值时,会flush刷新。

  当内存很小时会flush很多次导致map端聚合没有解决数据倾斜问题,此时可以用Skew-GroupBy聚合。也就是不管内存足部足够都能把数据打散再做聚合。

3 Join导致的数据倾斜

3.1 优化说明

  未经优化的join操作,默认是使用common join算法,也就是通过一个MapReduce Job完成计算。Map端负责读取join操作所需表的数据,并按照关联字段进行分区,通过Shuffle,将其发送到Reduce端,相同key的数据在Reduce端完成最终的Join操作。

  如果关联字段的值分布不均,就可能导致大量相同的key进入同一Reduce,从而导致数据倾斜问题。

  由join导致的数据倾斜问题,有如下三种解决方案:map join、skew join、调整SQL语句。

1、map join

  map join中join操作仅在map端就能完成,没有shuffle操作,没有reduce阶段,自然不会产生reduce端的数据倾斜。该方案适用于大表join小表时发生数据倾斜的场景。

原理:
  多个Mapper缓存小表数据,大表数据进行切片(切片只与大小有关,与key无关),均匀切成若干个片,一个map负责处理一个切片(逐条遍历然后找缓存的小表的数据join)再逐条输出,使得每个map处理的数据量一致,解决数据倾斜问题。

相关参数:

--启动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;

2、skew join

  skew join解决大表join大表出现数据倾斜的问题。

原理:
  为倾斜的大key单独启动一个map join任务进行计算,其余key进行正常的common join。
【大数据之Hive】二十三、HQL语法优化之数据倾斜,hive,大数据,hive,hadoop,sql
相关参数:

--启用skew join优化
sethive.optimize.skewjoin=true;
--触发skew join的阈值,若某个key的行数超过该参数值,则触发(按照行数进行检测)
set hive.skewjoin.key=100000;

  这种方案对参与join的源表大小没有要求,但是对两表中倾斜的key的数据量有要求,要求一张表中的倾斜key的数据量比较小(方便走mapjoin)。

3、调整SQL语句

  若参与join的两表均为大表,其中一张表的数据是倾斜的,可以对SQL语句进行相应的调整。
  假设原始SQL语句如下:A,B两表均为大表,且其中一张表的数据是倾斜的。

select
    *
from A
join B
on A.id=B.id;

【大数据之Hive】二十三、HQL语法优化之数据倾斜,hive,大数据,hive,hadoop,sql
  图中1001为倾斜的大key,被发往了同一个Reduce进行处理。

调整SQL语句如下:

select
    *
from(
    select --打散操作,加随机数0、1
        concat(id,'_',cast(rand()*2 as int)) id,
        value
    from A
)ta
join(
    select --扩容操作
        concat(id,'_',0) id,
        value
    from B
    union all
    select
        concat(id,'_',1) id,
        value
    from B
)tb
on ta.id=tb.id;

调整之后的SQL语句执行计划:
【大数据之Hive】二十三、HQL语法优化之数据倾斜,hive,大数据,hive,hadoop,sql

3.2 案例

1、示例SQL语句

select
    *
from order_detail od
join province_info pi
on od.province_id=pi.id;

2、优化前

--关闭Map Join自动转换
set hive.auto.convert.join=false;

--关闭skew join优化(默认为关闭状态)
sethive.optimize.skewjoin=false;

  order_detail表中的province_id字段是存在倾斜的,若不经过优化,观察yarn中的reduce任务可以看到数据倾斜的现象。
  hive中的map join自动转换是默认开启的,若想看到数据倾斜的现象,需要先将hive.auto.convert.join参数设置为false。
3、优化思路
(1)map join
设置参数:

--启用map join
set hive.auto.convert.join=true;
--关闭skew join
set hive.optimize.skewjoin=false;

  可以很明显看到开启map join以后,mr任务只有map阶段,没有reduce阶段,没有数据倾斜发生。
【大数据之Hive】二十三、HQL语法优化之数据倾斜,hive,大数据,hive,hadoop,sql
【大数据之Hive】二十三、HQL语法优化之数据倾斜,hive,大数据,hive,hadoop,sql
(2)skew join
设置参数:

--启动skew join
set hive.optimize.skewjoin=true;
--关闭map join
set hive.auto.convert.join=false;

开启skew join后,使用explain查看执行计划:
【大数据之Hive】二十三、HQL语法优化之数据倾斜,hive,大数据,hive,hadoop,sql
  skew join生效,任务既有common join,又有部分key走了map join。并且该sql在yarn上最终启动了两个mr任务,而且第二个任务只有map没有reduce阶段,说明第二个任务是对倾斜的key进行了map join。
【大数据之Hive】二十三、HQL语法优化之数据倾斜,hive,大数据,hive,hadoop,sql
【大数据之Hive】二十三、HQL语法优化之数据倾斜,hive,大数据,hive,hadoop,sql文章来源地址https://www.toymoban.com/news/detail-568392.html

到了这里,关于【大数据之Hive】二十三、HQL语法优化之数据倾斜的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【大数据之Hive】十六、Hive-HQL函数之窗口函数(开窗函数)

      先定义了窗口的大小(按行来算),然后对窗口内的行的数据进行计算,再将计算结果返回给改行。   窗口函数包括窗口和函数两部分,窗口用于定义计算范围,函数用于定义计算逻辑,窗口函数只会在原来的表上增加一列结果列,不改变原来的数据。 函数:   绝

    2024年02月11日
    浏览(41)
  • hql、数据仓库、sql调优、hive sql、python

    HQL(Hibernate Query Language) 是面向对象的查询语言 SQL的操作对象是数据列、表等数据库数据 ; 而HQL操作的是类、实例、属性 数据仓库的定义 英文名称为Data Warehouse,可简写为DW或DWH。 为企业级别的决策制定过程,提供所有类型数据支持的战略集合。 它出于分析性报告和决策支持

    2024年02月03日
    浏览(65)
  • 一百二十五、Hive——hive性能优化

    在Hive中运行SQL,性能优化是个大坑! 总结一些 hive性能优化的参数设置 一、hive性能优化 set hive.vectorized.execution.enabled=false; set hive.auto.convert.join=false; --map阶段内存不足 set mapreduce.map.memory.mb=10150; set mapreduce.map.java.opts=-Xmx6144m; -- reduce阶段内存不足 set mapreduce.reduce.memory.mb=10150;

    2024年02月09日
    浏览(39)
  • IDEA 运行hql 出现FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.mr.MapRedTas

    启用的hiveserver2 的模拟用户功能 ,依赖于Hadoop 提供的proxy user(代理用户功能),只有Hadoop中的代理用户才能模拟其他用户身份访问 Hadoop集群。 因此,需要将hiverserver2 的启动用户设置为 Hadoop 的代理用户 修改hadoop 配置文件 core-site.xml 添加如下配置 重启Hadoop 以及Hive 再次运

    2024年02月11日
    浏览(46)
  • 二百二十三、Kettle——从Hive增量导入到ClickHouse(根据day字段判断)

    需要用Kettle从Hive的DWS层库表数据增量同步到ClickHouse的ADS层库表中,不过这次的增量判断字段是day字段,不像之前的create_time字段 因为day字段需要转换类型,而 create_time字段字段不需要转换类型,因此两者的Kettle任务配置有所不同,也踩了一些坑,因此再写一篇博客整理一下

    2024年02月20日
    浏览(40)
  • Hive-数据倾斜

    在计算各省份的GMV时,有可能会发生数据倾斜,解决办法如下: 分组聚合 预聚合思想 map-side(预聚合在map里面) skew-groupby(多个reduce阶段进行汇总):先对倾斜的key加上随机数,均匀分发到不同的reduce,进行一次聚合,然后去掉随机数,再发到一个reduce进行聚合。 表与表的

    2024年02月14日
    浏览(38)
  • Hive 数据倾斜

    数据倾斜:数据分布不均匀,造成数据大量的集中到一点,造成数据热点。主要表现为任务进度长时间维持在 99%或者 100%的附近,查看任务监控页面,发现只有少量 reduce 子任务未完成,因为其处理的数据量和其他的 reduce 差异过大。 单一 reduce 处理的记录数和平均记录数相差

    2024年04月28日
    浏览(31)
  • Hive & Spark & Flink 数据倾斜

    绝大部分任务都很快完成,只有一个或者少数几个任务执行的很慢甚至最终执行失败, 这样的现象为数据倾斜现象。 任务进度长时间维持在 99%或者 100%的附近,查看任务监控页面,发现只有少量 reduce 子任务未完成,因为其处理的数据量和其他的 reduce 差异过大。 单一 redu

    2024年02月07日
    浏览(41)
  • 【Hadoop】-Apache Hive使用语法与概念原理[15]

    创建数据库 create database if not exists myhive; 使用数据库 use myhive; 查看数据库详细信息 desc database myhive; 数据库本质上就是在HDFS之上的文件夹。 默认数据库的存放路径是HDFS的: /user/hive/warehouse内 创建数据库并指定hdfs存储位置 create database myhive2 location \\\'/myhive2\\\'; 使用location

    2024年04月28日
    浏览(31)
  • HIVE语法优化之Join优化

    桶用两表关联字段,MapJoin时需要将小表填入内存,这时候,分桶就起到了作用 一个stage阶段代表一个mr执行,好几个MR,会吧每一个MR的结果都压缩 Mysql 慢查询 如果sql语句执行超过指定时间,定义该sql为慢查询,存储日志, 查问题: SQL日志,模拟慢SQL 然后查询执行计划 分组聚合 就是在

    2024年02月13日
    浏览(32)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包