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

news2024/11/20 7:14:31

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

文章目录

  • 前言、
  • 一、Explain
  • 二、数据倾斜(常见优化)


前言

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

一、Explain

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

       

二、数据倾斜

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肯定在一个对应的桶里)

代码演示:

    

    

   

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

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

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


 七.没有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的行数目(不过这种方式需要注意数据倾斜的问题)。

 八.行列过滤 优化

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

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

 (该图来自知乎)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/407.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

公众号网课查题搭建方法

公众号网课查题搭建方法 本平台优点: 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 查题校园题库:查题校园题库后台(…

QLC 闪存给主控带来了很大的难题?

前言 世界各大主流闪存厂商,如美光、海力士、铠侠和长江存储积极致力于QLC的研发,并相继推出了QLC SSD 产品。随着技术的不断进步,人们普遍担心的QLC擦写寿命少正逐渐被改善。QLC SSD 成本是最大的优势,不指望说替代 TLC SSD&…

408 | 【2011年】计算机统考真题 自用回顾知识点整理

选择题 T3:循环队列 不同指针指向,队列判空/判满条件 1. rear:指向队尾元素 front:指向队头元素前一个位置 (1)牺牲一个存储空间 (2)判空条件:front rear (3&#xff0…

【RHCSA】管理Linux的联网

目录 rhel8与旧版本的区别 NetworkManager的特点 配置网络 (1)使用P命令配置临时生效的网络连接 (2)修改配置文件,前提是需要有network服务[不推荐] (3)nmcli(命令行工具) 网络测试命令 Ⅰ、使用ping命令测试网络的连通性 Ⅱ、使用tracepath命令跟踪并显示网…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java危险品运输车辆信息管理系统b2z1o

大学毕业设计,一般都是自己或者几个同学一起弄,lunwen都是去,百度,图书馆找很多资料参考,(就是把里面都了,自己再按照各个意思重新表达),但是前提,提纲要想好…

【附源码】计算机毕业设计SSM微课程服务系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

神经网络芯片的单片机,什么是神经网络芯片

1、神经网络做图像分类一定要用到gpu吗? GPU最大的价值一直是“accelerating”(加速),GPU不是取代CPU,而是利用GPU的并行计算架构,来将并行计算的负载放到GPU上来处理从而极大的提升处理速度。GPU本质上在异构计算架构上属于协处…

Hello Word你真的理解了么?今天教我的表弟,有些感悟

🍬博主介绍 👨‍🎓 博主主页:喵的主页 ✨主攻领域:【大数据】【java】【python】【面试分析】 Hello world1. 编写程序2. 打开命令行3. 运行 .class 文件4. 排查错误1. 编写程序 是不是都忘了我们初学时是打开记事本的…

9-1 Kubernetes二进制部署的Prometheus实现服务发现

文章目录前言创建用户复制Token配置文件全局配置Master节点发现Node节点发现Namespace Pod发现自定义Pod发现前言 在上一章节介绍了 8-5 在Prometheus实现Kubernetes-apiserver及Coredns服务发现 基于K8s集群内部安装的Prometheus,添加服务发现时更加方便。Prometh…

二叉树遍历原理 | 深度优先-广度优先 | 栈-队列

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 14天阅读挑战赛 文章目录二叉树遍历原理队列和栈区别深度优先遍历(DFS)前序遍历(根-左-右)中序遍历(左-根-右)后序遍历(左-右-根)广度优先遍历(BFS)逐层遍历(上-下 | …

软件研发人效提升之道,法,术,器,势

在华为的寒气传递之前,笔者已经在思考和实战如何提高研发人效。目的目标很明确: 提高软件研发人效,所谓的软件人效,简单粗暴的定义就是以最低单位人均成本,快速,高质量,高频率,安全地交付软件产…

C++笔记之bitset使用

C++笔记之bitset使用 文章目录 C++笔记之bitset使用0.进制介绍1.cppreference2.常规使用3.用法总结3.1.bitset是什么3.2.使用方法3.3.相关使用函数3.4.转换函数0.进制介绍 1.cppreference

C语言高级教程-C语言数组(五):二维(多维)数组初始化和基于数组的综合实例->帽子选购问题

C语言高级教程-C语言数组(五):二维(多维)数组初始化和基于数组的综合实例->帽子选购问题一、本文的编译环境二、二维数组的初始化三、三维数组的初始化四、使用for循环求三维数组元素值的和4.1、for循环求数组元素值…

行业周期分析的主要内容,怎么分析行业生命周期

如何分析经济周期? 很多人认为经济周期分析很难,很复杂。但是作为一个投资者,必须了解一定的经济周期分析原理。所以今天康少就用一张图来简单讲解下经济周期的分析。 一、经济周期判断1、经济趋向繁荣:普通股收益将大幅提高&am…

第07篇:巧用Spring类型转换, ConverterFormatter知识点学习。

公众号: 西魏陶渊明 CSDN: https://springlearn.blog.csdn.net 天下代码一大抄, 抄来抄去有提高, 看你会抄不会抄! 文章目录一、前言1.1 类型转换1.2 格式化输出二、Converter 类型转换2.1 Converter2.1.1 接口定义2.1.2 接口功能2.2 ConverterFactory2.2.1 接口定义…

java8特性,lambda表达式,简写的演变及应用

🍬博主介绍 👨‍🎓 博主主页:chad_chang的主页 ✨主攻领域:【大数据】【java】【python】【面试分析】 文章目录lambda表达式1.1.简介1.1.1.什么是Lambda?1.1.2.为什么使用Lambda1.1.3.Lambda对接口的要求1…

【Linux】特别篇--SMBus 协议

【Linux】特别篇--SMBus 协议一、SMBus 简介二、SMBus 与 I2C 区别三、SMBus协议分析3.1 符号含义3.2 SMBus Quick Command3.3 SMBus Receive Byte3.4 SMBus Send Byte3.5 SMBus Read Byte3.6 SMBus Read Word3.7 SMBus Write Byte3.8 SMBus Write Word3.9 SMBus Block Read3.1…

672页21万字智慧高速数据中心大数据平台建设方案

目 录 第1章 设计总述 6 1.1 项目概述 6 1.1.1 项目名称 6 1.1.2 建设单位概况 6 1.1.3 公司具备的优势 6 1.2 对项目的理解分析 7 1.2.1 项目现状分析 7 1.2.2 建设目标分析 10 1.2.3 建设内容分析 13 1.2.4 项目建设重难点分析 19 1.2.5 项目风险分析 22 1.2.6 各中心职能需求…

python控制台颜色输出设置

python控制台颜色输出设置 控制台输出内容的颜色有前景色与背景色 控制台的展示效果有限,并不能像前端一样炫酷,只能做一些简单的设置 原理 python终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无…

【C++笔试强训】第十天

🎇C笔试强训 博客主页:一起去看日落吗分享博主的C刷题日常,大家一起学习博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话:夜色难免微凉,前方必有曙光 🌞。 💦 &…