实操 | Hive 数据倾斜问题定位排查及解决

article/2025/8/25 17:38:35

Hive 数据倾斜怎么发现,怎么定位,怎么解决


多数介绍数据倾斜的文章都是以大篇幅的理论为主,并没有给出具体的数据倾斜案例。当工作中遇到了倾斜问题,这些理论很难直接应用,导致我们面对倾斜时还是不知所措。

本文首发在公众号【五分钟学大数据

今天我们不扯大篇理论,直接以例子来实践,排查是否出现了数据倾斜,具体是哪段代码导致的倾斜,怎么解决这段代码的倾斜。

当执行过程中任务卡在 99%,大概率是出现了数据倾斜,但是通常我们的 SQL 很大,需要判断出是哪段代码导致的倾斜,才能利于我们解决倾斜。通过下面这个非常简单的例子来看下如何定位产生数据倾斜的代码

表结构描述

先来了解下这些表中我们需要用的字段及数据量:

表的字段非常多,此处仅列出我们需要的字段

第一张表:user_info (用户信息表,用户粒度)

字段名字段含义字段描述
userkey用户 key用户标识
idno用户的身份证号用户实名认证时获取
phone用户的手机号用户注册时的手机号
name用户的姓名用户的姓名

user_info 表的数据量:1.02 亿,大小:13.9G,所占空间:41.7G(HDFS三副本)

第二张表:user_active (用户活跃表,用户粒度)

字段名字段含义字段描述
userkey用户 key用户没有注册会分配一个 key
user_active_at用户的最后活跃日期从埋点日志表中获取用户的最后活跃日期

user_active 表的数据量:1.1 亿

第三张表:user_intend(用户意向表,此处只取近六个月的数据,用户粒度)

字段名字段含义字段描述
phone用户的手机号有意向的用户必须是手机号注册的用户
intend_commodity用户意向次数最多的商品客户对某件商品意向次数最多
intend_rank用户意向等级用户的购买意愿等级,级数越高,意向越大

user_intend 表的数据量:800 万

第四张表:user_order(用户订单表,此处只取近六个月的订单数据,用户粒度)

字段名字段含义字段描述
idno用户的身份证号下订单的用户都是实名认证的
order_num用户的订单次数用户近六个月下单次数
order_amount用户的订单总金额用户近六个月下单总金额

user_order 表的数据量:640 万

1. 需求

需求非常简单,就是将以上四张表关联组成一张大宽表,大宽表中包含用户的基本信息,活跃情况,购买意向及此用户下订单情况。

2. 代码

根据以上需求,我们以 user_info 表为基础表,将其余表关联为一个宽表,代码如下:

selecta.userkey,a.idno,a.phone,a.name,b.user_active_at,c.intend_commodity,c.intend_rank,d.order_num,d.order_amount
from user_info a
left join user_active b on a.userkey = b.userkey
left join user_intend c on a.phone = c.phone
left join user_order d on a.idno = d.idno;

执行上述语句,在执行到某个 job 时任务卡在 99%:

这时我们就应该考虑出现数据倾斜了。其实还有一种情况可能是数据倾斜,就是任务超时被杀掉,Reduce 处理的数据量巨大,在做 full gc 的时候,stop the world。导致响应超时,超出默认的 600 秒,任务被杀掉。报错信息一般如下:

AttemptID:attempt_1624419433039_1569885_r_000000 Timed outafter 600 secs Container killed by the ApplicationMaster. Container killed onrequest. Exit code is 143 Container exited with a non-zero exit code 143

3. 倾斜问题排查

数据倾斜大多数都是大 key 问题导致的。

如何判断是大 key 导致的问题,可以通过下面方法:

1. 通过时间判断

如果某个 reduce 的时间比其他 reduce 时间长的多,如下图,大部分 task 在 1 分钟之内完成,只有 r_000000 这个 task 执行 20 多分钟了还没完成。

注意:要排除两种情况:

  1. 如果每个 reduce 执行时间差不多,都特别长,不一定是数据倾斜导致的,可能是 reduce 设置过少导致的。

  2. 有时候,某个 task 执行的节点可能有问题,导致任务跑的特别慢。这个时候,mapreduce 的推测执行,会重启一个任务。如果新的任务在很短时间内能完成,通常则是由于 task 执行节点问题导致的个别 task 慢。但是如果推测执行后的 task 执行任务也特别慢,那更说明该 task 可能会有倾斜问题。

2. 通过任务 Counter 判断

Counter 会记录整个 job 以及每个 task 的统计信息。counter 的 url 一般类似:

http://bd001:8088/proxy/application_1624419433039_1569885/mapreduce/singletaskcounter/task_1624419433039_1569885_r_000000/org.apache.hadoop.mapreduce.FileSystemCounter

通过输入记录数,普通的 task counter 如下,输入的记录数是 13 亿多:

而 task=000000 的 counter 如下,其输入记录数是 230 多亿。是其他任务的 100 多倍:

4. 定位 SQL 代码

1. 确定任务卡住的 stage

  • 通过 jobname 确定 stage:

    一般 Hive 默认的 jobname 名称会带上 stage 阶段,如下通过 jobname 看到任务卡住的为 Stage-4:

  • 如果 jobname 是自定义的,那可能没法通过 jobname 判断 stage。需要借助于任务日志:

    找到执行特别慢的那个 task,然后 Ctrl+F 搜索 “CommonJoinOperator: JOIN struct” 。Hive 在 join 的时候,会把 join 的 key 打印到日志中。如下:

上图中的关键信息是:struct<_col0:string, _col1:string, _col3:string>

这时候,需要参考该 SQL 的执行计划。通过参考执行计划,可以断定该阶段为 Stage-4 阶段:

2. 确定 SQL 执行代码

确定了执行阶段,即 stage。通过执行计划,则可以判断出是执行哪段代码时出现了倾斜。还是从此图,这个 stage 中进行连接操作的表别名是 d:

就可以推测出是在执行下面红框中代码时出现了数据倾斜,因为这行的表的别名是 d:

5. 解决倾斜

我们知道了哪段代码引起的数据倾斜,就针对这段代码查看倾斜原因,看下这段代码的表中数据是否有异常。

倾斜原因:

本文的示例数据中 user_info 和 user_order 通过身份证号关联,检查发现 user_info 表中身份证号为空的有 7000 多万,原因就是这 7000 多万数据都分配到一个 reduce 去执行,导致数据倾斜。

解决方法

  1. 可以先把身份证号为空的去除之后再关联,最后按照 userkey 连接,因为 userkey 全部都是有值的:

with t1 as(
selectu.userkey,o.*
from user_info u
left join user_order o
on u.idno = o.idno
where u.idno is not null
--是可以把where条件写在后面的,hive会进行谓词下推,先执行where条件在执行 left join
)selecta.userkey,a.idno,a.phone,a.name,b.user_active_at,c.intend_commodity,c.intend_rank,d.order_num,d.order_amount
from user_info a
left join user_active b on a.userkey = b.userkey
left join user_intend c on a.phone = c.phone
left join t1 d on a.userkey = d.userkey;
  1. 也可以这样,给身份证为空的数据赋个随机值,但是要注意随机值不能和表中的身份证号有重复:

selecta.userkey,a.idno,a.phone,a.name,b.user_active_at,c.intend_commodity,c.intend_rank,d.order_num,d.order_amount
from user_info a
left join user_active b on a.userkey = b.userkey
left join user_intend c on a.phone = c.phone
left join user_order d on nvl(a.idno,concat(rand(),'idnumber')) = d.idno;

其他的解决数据倾斜的方法

1. 过滤掉脏数据

如果大 key 是无意义的脏数据,直接过滤掉。本场景中大 key 有实际意义,不能直接过滤掉。

2. 数据预处理

数据做一下预处理(如上面例子,对 null 值赋一个随机值),尽量保证 join 的时候,同一个 key 对应的记录不要有太多。

3. 增加 reduce 个数

如果数据中出现了多个大 key,增加 reduce 个数,可以让这些大 key 落到同一个 reduce 的概率小很多。

配置 reduce 个数:

set mapred.reduce.tasks = 15;

4. 转换为 mapjoin

如果两个表 join 的时候,一个表为小表,可以用 mapjoin 做。

配置 mapjoin:

set hive.auto.convert.join = true;  是否开启自动mapjoin,默认是trueset hive.mapjoin.smalltable.filesize=100000000;   mapjoin的表size大小

5. 启用倾斜连接优化

hive 中可以设置 hive.optimize.skewjoin 将一个 join sql 分为两个 job。同时可以设置下 hive.skewjoin.key,此参数表示 join 连接的 key 的行数超过指定的行数,就认为该键是偏斜连接键,就对 join 启用倾斜连接优化。默认 key 的行数是 100000。

配置倾斜连接优化:

set hive.optimize.skewjoin=true; 启用倾斜连接优化set hive.skewjoin.key=200000; 超过20万行就认为该键是偏斜连接键

6. 调整内存设置

适用于那些由于内存超限任务被 kill 掉的场景。通过加大内存起码能让任务跑起来,不至于被杀掉。该参数不一定会明显降低任务执行时间。

配置内存:

set mapreduce.reduce.memory.mb=5120; 设置reduce内存大小set mapreduce.reduce.java.opts=-Xmx5000m -XX:MaxPermSize=128m;

附:Hive 配置属性官方链接:https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties


http://chatgpt.dhexx.cn/article/fFecRrPR.shtml

相关文章

数据倾斜原理及解决方案

导读 相信很多接触MapReduce的朋友对数据倾斜这四个字并不陌生,那么究竟什么是数据倾斜?又该怎样解决这种该死的情况呢? 何为数据倾斜? 在弄清什么是数据倾斜之前,我想让大家看看数据分布的概念: 正常的数据分布理论上都是倾斜的&#xff0c;就是我们所说的20-80原理&…

spark 数据倾斜调优

数据倾斜应该算是一个比较麻烦的问题&#xff0c;笔者也是刚刚开始学习相关的调优&#xff0c;将看到的比较全面、清晰的几种解决方案整合了一下&#xff0c;并加上了一些理解与心得&#xff0c;供参考&#xff01; 首先&#xff0c;需要对spark执行计划有一定的基础与理解&am…

如何解决mysql数据倾斜_数据倾斜解决方案

1)聚合原数据(主要操作的是hive数据库中的数据&#xff0c;先通过hive sql将相同key的数据聚合成一条数据&#xff0c;再进行map操作) 当没办法聚合成一条数据时&#xff1a;增大key粒度&#xff0c;从而key的数量会减少&#xff0c;但是每个key对应的数据量会增大&#xff0c…

数据倾斜及其解决方式

数据倾斜是大数据领域绕不开的拦路虎&#xff0c;当你所需处理的数据量到达了上亿甚至是千亿条的时候&#xff0c;数据倾斜将是横在你面前一道巨大的坎。很可能有几周甚至几月都要头疼于数据倾斜导致的各类诡异的问题。 数据倾斜是指&#xff1a;mapreduce程序执行时&#xff0…

Hive 数据倾斜

数据倾斜&#xff0c;即单个节点任务所处理的数据量远大于同类型任务所处理的数据量&#xff0c;导致该节点成为整个作业的瓶颈&#xff0c;这是分布式系统不可能避免的问题。从本质来说&#xff0c;导致数据倾斜有两种原因&#xff0c;一是任务读取大文件&#xff0c;二是任务…

Spark数据倾斜解决

一、数据倾斜表现 数据倾斜就是数据分到各个区的数量不太均匀,可以自定义分区器,想怎么分就怎么分。 Spark中的数据倾斜问题主要指shuffle过程中出现的数据倾斜问题&#xff0c;是由于不同的key对应的数据量不同导致的不同task所处理的数据量不同的问题。 例如&#xff0c;redu…

大数据篇--数据倾斜

文章目录 一、什么是数据倾斜二、结合Shuffle1.结合mapreduce的shshuffle来说&#xff1a;&#xff08;1&#xff09;Shuffle 机制&#xff08;2&#xff09;Shuffle 阶段的优化 2.结合spark的shshuffle来说&#xff1a;&#xff08;1&#xff09;Spark任务调度&#xff1a;&am…

spark 数据倾斜

一. 数据倾斜的现象 1、spark中一个stage的执行时间受限于最后那个执行完的task&#xff0c;因此运行缓慢的任务会拖累整个程序的运行速度&#xff08;分布式程序运行的速度是由最慢的那个task决定的&#xff09;比如&#xff0c;总共有1000个task&#xff0c;997个task都在1分…

Spark处理数据倾斜问题

写在前面&#xff1a;有博主的文章写的很好&#xff0c;很详细&#xff0c;推荐&#xff01; 参考&#xff1a;Spark如何处理数据倾斜&#xff08;甚好&#xff0c;甚详细&#xff0c;很有逻辑&#xff0c;强推&#xff01;&#xff09; spark数据倾斜解决方案汇总 1、什么是数…

如何处理Spark数据倾斜

一、什么是数据倾斜 在分布式集群计算中&#xff0c;数据计算时候数据在各个节点分布不均衡&#xff0c;某一个或几个节点集中80%数据&#xff0c;而其它节点集中20%甚至更少数据&#xff0c;出现了数据计算负载不均衡的现象。 数据倾斜在MR编程模型中是十分常见的&#xff0…

数据倾斜

数据倾斜 转载声明 本文大量内容系转载自以下文章&#xff0c;有删改&#xff0c;并参考其他文档资料加入了一些内容&#xff1a; Spark性能优化指南——高级篇 作者&#xff1a;李雪蕤 出处&#xff1a;美团技术团队博客漫谈千亿级数据优化实践&#xff1a;数据倾斜&#x…

大数据常见问题:数据倾斜的原理及处理方案

什么是数据倾斜 Hadoop能够进行对海量数据进行批处理的核心&#xff0c;在于它的分布式思想&#xff0c;通过多台服务器&#xff08;节点&#xff09;组成集群&#xff0c;共同完成任务&#xff0c;进行分布式的数据处理。 理想状态下&#xff0c;一个任务是由集群下所有机器…

数据倾斜问题

一、什么是数据倾斜 简单来说&#xff0c;就是在数据计算的时候&#xff0c;数据会分配到不同的task上执行&#xff0c;当数据分配不均匀导致某些大批量数据分配到某几个task上就会造成计算不动或者异常的情况。 二、数据倾斜表现形式 1、大部分的task在计算的时候计算的特别…

数据倾斜常见原因和解决办法

数据倾斜在MapReduce编程模型中十分常见&#xff0c;多个节点并行计算&#xff0c;如果分配的不均&#xff0c;就会导致长尾问题&#xff08;大部分节点都完成了任务&#xff0c;一直等待剩下的节点完成任务&#xff09;&#xff0c;本文梳理了常见的发生倾斜的原因以及相应的解…

数据倾斜产生,原因及其解决方案

目录 第七章 数据倾斜 7.1 数据倾斜的产生&#xff0c;表现与原因 7.1.1 数据倾斜的定义 7.1.2 数据倾斜的危害 7.1.3 数据倾斜发生的现象 7.2 数据倾斜倾斜造成的原因 7.3 几种常见的数据倾斜及其解决方案 7.3.1 空值引发的数据倾斜 7.3.2 不同数据类型引发的数据倾斜…

数据倾斜原理与解决方法

数据倾斜的概念 数据倾斜这四个字经常会在学习MapReduce中遇到。所谓数据分区&#xff0c;就是数据分区分布因为数据本身或者分区方法的原因变得极为不一致&#xff0c;大量的数据被划分到了同一个区。由于Reducer Task每次处理一个区的数据&#xff0c;这导致Reducer Task处理…

什么是缓存穿透、缓存雪崩、缓存击穿

缓存穿透 缓存穿透 &#xff1a;缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;这些请求都会打到数据库&#xff0c;失去了缓存保护后端存储的意义。 解决方案 缓存空值 如果访问数据库后还未命中&#xff0c;则把一…

缓存穿透和缓存击穿

一、背景介绍 几乎所有互联网公司都采用缓存的方案来解决瞬时流量超高&#xff0c;或者长期流量过高的问题。但使用缓存存在风险——缓存穿透和缓存击穿&#xff1a;简单的讲就是如果该数据原本就不存在&#xff0c;那么就会发生缓存穿透&#xff1b;如果缓存内容因为各种原因…

缓存穿透,缓存雪崩,缓存击穿

一&#xff0c;缓存穿透 原因&#xff1a;一个请求来访问某个数据&#xff0c;发现缓存中没有&#xff0c;直接去DB中访问。此种情况就是穿透。(正常情况下缓存跟数据库中数据都是存在&#xff0c;异常情况下会导致) 特点:因传递了非法的key,导致缓存跟数据库中都无法查询 方…

如何避免缓存穿透、缓存击穿、缓存雪崩?

如何避免缓存穿透、缓存击穿、缓存雪崩&#xff1f; 缓存穿透 先来看一下缓存穿透&#xff0c;顾名思义&#xff0c;是指业务请求穿过了缓存层&#xff0c;落到持久化存储上。在大多数场景下&#xff0c;我们应用缓存是为了承载前端业务请求&#xff0c;缓存被击穿以后&#x…