Hive数据倾斜常见场景及解决方案(超全!!!)

这篇具有很好参考价值的文章主要介绍了Hive数据倾斜常见场景及解决方案(超全!!!)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Hive数据倾斜常见问题和解决方案

目录

前言

一、Explain

二、数据倾斜

1.什么是数据倾斜?它的主要表现?

2.产生数据倾斜的常见原因

一.join时:首先是大表关联小表,容易发生数据倾斜

二.join时:空key过多,或者相同key过多

三.join时:不同数据类型关联产生数据倾斜

四.join时:大表和不大不小的表联接

五.join时:大表联接大表

六. 没有join时:group by发生的数据倾斜

七.没有join时:count distinct优化

八.行列过滤 优化​编辑

九、面对复杂逻辑,每个map耗时较长,适当增加map的个数

十、假如小文件比较多,可以先进行小文件合并

十一、调整reduce个数

十二、并行执行


前言

Hive数据倾斜是面试中常问的问题,这里我们需要很熟练地能举出常见的数据倾斜的例子并且给出解决方案。

一、Explain

我们可以通过sql语句前面加expalin来具体查看这条语句的执行计划 通过观察它的一些参数来辅助调优

hive数据倾斜,python,pandas,开发语言

       hive数据倾斜,python,pandas,开发语言

二、数据倾斜

1.什么是数据倾斜?它的主要表现?

数据倾斜是由于数据分布不均匀,造成数据大量的集中到一点,造成数据热点的现象。

主要表现:任务进度长时间维持在 99%或者 100%的附近,查看任务监控页面,发现只有少量 reduce 子任务未完成,因为其处理的数据量和其他的 reduce 差异过大。 单一 reduce 处理的记录数和平均记录数相差太大,通常达到好几倍之多,最长时间远大于平均时长。

2.产生数据倾斜的常见原因

一.join时:首先是大表关联小表,容易发生数据倾斜

这里Hive自动帮我们把小表放到缓存当中了。也就是我们所熟知的mapjoin,在学习Hadoop中就已经使用过。

以前需要我们手动调:set hive.auto.convert.join=true

一般小表的大小是25M左右,想要改变其大小只需set hive.mapjoin.smalltable.filesize=25000000

以前join的时候小表必须在左边,现在底层优化了,无所谓放到左边右边了。

二.join时:空key过多,或者相同key过多

空key可能是异常数据,两个表联接时,联接的字段作为key,可能有很多null值,也可能集中出现在某个值上。这样就导致了他们经过计算得出的哈希值都一样,然后把它们都放到一个reduce里面,导致这几个reduce的压力过大,其他reduce很轻松的场面,也就是我们所谓的数据倾斜。

这里我们有两种常用的解决办法:第一种是将两表联接之前就去掉这些null值,然后再union all加上是空值的全部数据。比如要联接user和log:

select * from log a join user b on a.userid is not null and a.userid=b.userid union all select * from log c where c.userid is null;

第二种办法就是赋予空值新的key值,通过随机数将他们赋给不同的reduce:

这里什么意思呢?就是null现在通过计算不都是一个哈希值嘛,那就给他们赋随机数,这样通过计算就会分配到不同的分区了。

select * from log a left join user b on case when a.userid is null then concat('hive',rand()) else a.userid end =b.userid;

三.join时:不同数据类型关联产生数据倾斜

比如两个表联接,联接的字段是userid,一个表的userid是string类型,一个表的是int类型,那这样默认按照int来计算哈希的话,那么string类型的都会被分到同一组,易发生数据倾斜。

解决办法就是把数字类型 id 转换成 string 类型的 id,或者统一即可。

四.join时:大表和不大不小的表联接

如果此时的小表不大不小,不能发生mapjoin,有什么优化方法呢?假如联接的字段是userid,这里如果这个“大表”或者“小表”有比较多重复的userid,那么我们也可以优化。

我们这里假设大表有较多重复的userid,解决方案就是就是先给“大表”的userid去重然后再联接另一个表,此时去重后大表可能会变成小表,这样又可以mapjoin,查询完以后再右连接原先的这个大表。比如这时的log表是大表,有很多重复的userid,users表是小表,但也超过了25M。

select from log a left join (select d* from (select distinct userid from log)c join users d on c.userid=d.userid)x on a.userid=x.userid 

五.join时:大表联接大表

两个大表联查,分桶优化,根据id分桶,id是字符型数值,通过计算哈希值会计算出自己在第几桶,所以一个桶对应一个桶就行,这样效率提高很多。

一个桶对应一个桶,0桶对应0桶联查,1桶对应1桶联查...(因为一样的id肯定在一个对应的桶里)

hive数据倾斜,python,pandas,开发语言

代码演示:

hive数据倾斜,python,pandas,开发语言

    hive数据倾斜,python,pandas,开发语言

    hive数据倾斜,python,pandas,开发语言

   hive数据倾斜,python,pandas,开发语言

六. 没有join时:group by发生的数据倾斜

group by引起的倾斜主要是输入数据行按照group by列分布不均匀引起的。

比如,有个key值有100W个a,此时直接做分组的话,这100W个a将会分到同一个reduce中,这一个节点处理的数据远大于其他节点处理的数据,造成数据倾斜,跑不出数据。其原因就是有大量的key集中分配到了同一个reduce,那么我们的解决思路就是将这些key值打散,使起分散到多个reduce节点处理即可,达到负载均衡的效果。解决办法:(2)可以不动
hive数据倾斜,python,pandas,开发语言

hive数据倾斜,python,pandas,开发语言


七.没有join时:count distinct优化

在Hive开发过程中,应该小心使用count distinct,因为很容易引起性能问题,比如下面的SQL:

 select count(distinct userid) from t1;

由于必须去重,因此Hive将会把Map阶段的输出全部分布到一个Reduce Task上,此时很容易引起性能问题。对于这种情况,可以通过先group by再count的方式来优化,优化后的SQL如下:

select count(*) from (select user from t1 group by userid) a;

其原理为:利用group by去重,再统计group by的行数目(不过这种方式需要注意数据倾斜的问题)。

八.行列过滤 优化hive数据倾斜,python,pandas,开发语言

谓词下推 用在SQL优化上来说 就是先过滤再做聚合等操作

因为两个表的关联字段是id 想要在关联以后在用where过滤 实际上底层已经优化了 关联之前就将两个表过滤了 但有时候sql写的长的时候 谓词下推会失效 所以有点不靠谱的

hive数据倾斜,python,pandas,开发语言

 (该图来自知乎)

九、面对复杂逻辑,每个map耗时较长,适当增加map的个数

hive数据倾斜,python,pandas,开发语言

十、假如小文件比较多,可以先进行小文件合并

hive数据倾斜,python,pandas,开发语言

十一、调整reduce个数

hive数据倾斜,python,pandas,开发语言

hive数据倾斜,python,pandas,开发语言

十二、并行执行

hive数据倾斜,python,pandas,开发语言

 文章来源地址https://www.toymoban.com/news/detail-780301.html

总结:Hive数据倾斜是非常常见的面试题,基本 可以说出4-6个我觉得就可以应付面试啦~

到了这里,关于Hive数据倾斜常见场景及解决方案(超全!!!)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 基于MapReduce的Hive数据倾斜场景以及调优方案

    通常认为当所有的map task全部完成,并且99%的reduce task完成,只剩下一个或者少数几个reduce task一直在执行,这种情况下一般都是发生了数据倾斜。 即为在整个计算过程中,大量相同的key被分配到了同一个reduce任务上造成。Hive的数据倾斜本质上是MapReduce计算引擎的数据倾斜,

    2024年02月12日
    浏览(51)
  • Spark数据倾斜解决方案一:源数据预处理和过滤倾斜key

    为什么把源数据预处理和过滤掉倾斜的key两种处理倾斜的方式写到一起? 因为这两种方式在实际的项目中场景较少而且单一,对于数据源预处理,比如原本要在spark中进行聚合或join的操作,提前到hive中去做,这种方式虽然解决了spark中数据倾斜的问题,但是hive中依然也会存

    2024年02月09日
    浏览(42)
  • Hive表锁机制原理以及各种场景的解决方案

    hive 锁机制(S锁,X锁) 是由hive的事务管理器出发,锁的原理是 一张表简称A表,我们对A表做查询操作的时候,就会获取到 A表的S锁(共享锁), 如果对A表做alter 等其他操作就会获取A表的X锁(排他锁) 如果A表同时拥有S锁和X锁,A表就会死锁。死锁后的现象就是做drop truncate 等操作会

    2024年02月02日
    浏览(34)
  • MapReduce数据倾斜产生的原因及其解决方案

    数据倾斜就是数据的key的分化严重不均,造成一部分数据很多,一部分数据很少的局面。 数据频率倾斜 —— 某一个区域的数据量要远远大于其他区域。 数据大小倾斜 —— 部分记录的大小远远大于平均值。 (1)Hadoop框架的特性 Job数多的作业运行效率会相对比较低; count

    2023年04月08日
    浏览(38)
  • Kafka数据倾斜到某一个分区解决方案

    我们使用Kafka时,某时需要消息消费是有序的,因此在生产者投递消息时,可能会指定分区,或者指定Key,此时可能会导致数据倾斜到某一个分区。 由于Kafka消费的特性,即一个消费组,那怕此时消费组有2个以上消费者,此时同一个主分区,只能被一个消费者消费,当生产消

    2024年02月13日
    浏览(56)
  • 视频汇聚融合平台解决方案常见的接入方式及场景应用

    视频汇聚融合平台解决方案常见的接入方式及场景应用 一、视频融合平台 视频汇聚与融合赋能平台支持多协议(GB28181/Onvif/RTSP/RTMP/海康SDK/Ehome/大华SDK/宇视SDK)、多类型设备(IPC/NVR/监控平台)的接入,可将分散不同品牌、不同协议的视频资源进行统一整合和管理,实现视频图

    2024年01月19日
    浏览(60)
  • 数字金融建设中数据传输场景及解决方案

    金融数据泄露、滥用、篡改等安全威胁影响重大,涉及用户个人隐私和企业商 业机密,关乎国家安全和社会稳定,数字金融安全能力建设重要性凸显。 数字金融建设总体情况. 数字金融是通过互联网及信息技术手段与传统金融服务业态相结合的新一代金融服务,依托于大数据

    2024年02月14日
    浏览(55)
  • 大数据:Trino简介及ETL场景的解决方案

    Presto 在 Facebook 的诞生最开始是为了填补当时 Facebook 内部实时查询和 ETL 处理之间的空白。Presto 的核心目标就是提供交互式查询,也就是我们常说的 Ad-Hoc Query,很多公司都使用它作为 OLAP 计算引擎。但是随着近年来业务场景越来越复杂,除了交互式查询场景,很多公司也需要

    2024年02月08日
    浏览(40)
  • 常见后端数据存储问题解决方案

    1、mysql数据准确性        常见电商系统中,如订单服务、现金券服务、活动类服务等,这类服务中经常会出现一些并发更新数据的情况,如何保证数据准确性。虽然有些操作可通过\\\"状态\\\"字段做了类似乐观锁的处理。但理论上还是会出现ABA的问题,而且规则不够统一,不同

    2023年04月18日
    浏览(41)
  • 关于hive3多表leftjoin导致数据丢失问题及解决方案

    最近业务场景需要将一张大表通过name名字关联多个小表去获取他们的id,大表数据9000w,小表数据最大180w,最小30w,我以主表leftjoin的时候发现了数据丢失问题 代码如下  结果显示数据我t7的数据由180w剩下9w,发生了严重的数据丢失,在别的表也有不同程度的丢失问题. 最后发现这个问

    2024年02月15日
    浏览(53)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包