0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

简述Hive 数据倾斜问题定位排查及解决

数据分析与开发 来源:五分钟学大数据 作者:园陌 2021-10-08 09:10 次阅读

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

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

当执行过程中任务卡在 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 表为基础表,将其余表关联为一个宽表,代码如下:

select
a.userkey,
a.idno,
a.phone,
a.name,
b.user_active_at,
c.intend_commodity,
c.intend_rank,
d.order_num,
d.order_amount
fromuser_infoa
leftjoinuser_activebona.userkey=b.userkey
leftjoinuser_intendcona.phone=c.phone
leftjoinuser_orderdona.idno=d.idno;

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

7e4ad528-26b6-11ec-82a8-dac502259ad0.png

这时我们就应该考虑出现数据倾斜了。其实还有一种情况可能是数据倾斜,就是任务超时被杀掉,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 多分钟了还没完成。

7e8f9640-26b6-11ec-82a8-dac502259ad0.png

注意:要排除两种情况:

  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 亿多:

7ed8656e-26b6-11ec-82a8-dac502259ad0.png

7f0e2154-26b6-11ec-82a8-dac502259ad0.png

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

7f3042f2-26b6-11ec-82a8-dac502259ad0.png

4. 定位 SQL 代码

1. 确定任务卡住的 stage

  • 通过 jobname 确定 stage:

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

7f5dd6ae-26b6-11ec-82a8-dac502259ad0.png

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

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

7f9d9dde-26b6-11ec-82a8-dac502259ad0.png

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

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

7fb06586-26b6-11ec-82a8-dac502259ad0.png

2. 确定 SQL 执行代码

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

801276f4-26b6-11ec-82a8-dac502259ad0.png

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

8063b334-26b6-11ec-82a8-dac502259ad0.png

5. 解决倾斜

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

倾斜原因:

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

解决方法

  1. 可以先把身份证号为空的去除之后再关联,最后按照 userkey 连接,因为 userkey 全部都是有值的:
witht1as(
select
  u.userkey,
  o.*
fromuser_infou
leftjoinuser_ordero
onu.idno=o.idno
whereu.idnoisnotnull
--是可以把where条件写在后面的,hive会进行谓词下推,先执行where条件在执行leftjoin
)

select
a.userkey,
a.idno,
a.phone,
a.name,
b.user_active_at,
c.intend_commodity,
c.intend_rank,
d.order_num,
d.order_amount
fromuser_infoa
leftjoinuser_activebona.userkey=b.userkey
leftjoinuser_intendcona.phone=c.phone
leftjoint1dona.userkey=d.userkey;
  1. 也可以这样,给身份证为空的数据赋个随机值,但是要注意随机值不能和表中的身份证号有重复:
select
a.userkey,
a.idno,
a.phone,
a.name,
b.user_active_at,
c.intend_commodity,
c.intend_rank,
d.order_num,
d.order_amount
fromuser_infoa
leftjoinuser_activebona.userkey=b.userkey
leftjoinuser_intendcona.phone=c.phone
leftjoinuser_orderdonnvl(a.idno,concat(rand(),'idnumber'))=d.idno;

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

1. 过滤掉脏数据

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

2. 数据预处理

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

3. 增加 reduce 个数

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

配置 reduce 个数:

setmapred.reduce.tasks=15;

4. 转换为 mapjoin

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

配置 mapjoin:

sethive.auto.convert.join=true;是否开启自动mapjoin,默认是true

sethive.mapjoin.smalltable.filesize=100000000;mapjoin的表size大小

5. 启用倾斜连接优化

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

配置倾斜连接优化:

sethive.optimize.skewjoin=true;启用倾斜连接优化

sethive.skewjoin.key=200000;超过20万行就认为该键是偏斜连接键

6. 调整内存设置

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

配置内存:

setmapreduce.reduce.memory.mb=5120;设置reduce内存大小

setmapreduce.reduce.java.opts=-Xmx5000m-XX:MaxPermSize=128m;

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

编辑:jq
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6509

    浏览量

    87557
  • SQL
    SQL
    +关注

    关注

    1

    文章

    737

    浏览量

    43449
  • 代码
    +关注

    关注

    30

    文章

    4553

    浏览量

    66665
  • hive
    +关注

    关注

    0

    文章

    10

    浏览量

    3792

原文标题:实操 : Hive 数据倾斜问题定位排查及解决

文章出处:【微信号:DBDevs,微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于北斗差分定位的杆塔倾斜/沉降/位移监测系统

    武汉风河智能研发的FH-900Y北斗杆塔倾斜/位移/沉降在线监测系统,利用差分GPS/北斗技术、GPRS/4G及LORA等无线通信技术,实现对铁塔状态的远程监控
    的头像 发表于 03-13 10:25 1038次阅读
    基于北斗差分<b class='flag-5'>定位</b>的杆塔<b class='flag-5'>倾斜</b>/沉降/位移监测系统

    配网故障定位装置:实现高效故障排查的利器

    ,实现故障杆塔级精确定位。达到强化线路缺陷隐患排查,提升配网单线接地故障准确定位和快速处理的目的,为配网精益运维提供技术支撑。
    的头像 发表于 01-24 13:51 158次阅读

    输电线路杆塔倾斜监测预警装置的工作原理及功能特点

    输电线路杆塔倾斜监测预警装置可以实时采集线路杆塔的倾斜数据,包括纵向倾斜角、横向倾斜角和综合倾斜
    的头像 发表于 01-11 16:47 278次阅读

    使用ADXL350做倾斜角度测试的时候,Z轴数据一直是错误的的原因?

    我在使用ADXL350芯片做倾斜角度测试的时候,发现Z轴数据一直是错误的,而X,Y轴数据输出都是对的。求解。另外,我用相同的线路和程序测试了一下ADXL345,发现三个轴的输出是正确的。为什么会这样呢。搞了2个星期了。
    发表于 01-02 08:29

    551S低倾斜1到4时钟缓冲器数据

    电子发烧友网站提供《551S低倾斜1到4时钟缓冲器数据表.pdf》资料免费下载
    发表于 12-21 10:41 0次下载
    551S低<b class='flag-5'>倾斜</b>1到4时钟缓冲器<b class='flag-5'>数据</b>表

    倾斜1到4时钟缓冲器524S数据

    电子发烧友网站提供《低倾斜1到4时钟缓冲器524S数据表.pdf》资料免费下载
    发表于 12-21 10:37 0次下载
    低<b class='flag-5'>倾斜</b>1到4时钟缓冲器524S<b class='flag-5'>数据</b>表

    配网故障定位装置:故障排查的利器!

    我们快速找出故障原因,从而及时进行修复。今天,就让我们一起来了解一下这款神奇的[配网故障定位装置]吧 一、什么是配网故障定位装置?❓ 配网故障定位装置是一种专门用于电力系统故障排查的设
    的头像 发表于 12-18 10:26 631次阅读
    配网故障<b class='flag-5'>定位</b>装置:故障<b class='flag-5'>排查</b>的利器!

    分布式数据恢复-hbase+hive分布式存储误删除文件的数据恢复方案

    hbase+hive分布式存储数据恢复环境: 16台某品牌R730XD服务器节点,每台物理服务器节点上有数台虚拟机,虚拟机上配置的分布式,上层部署hbase数据库+hive
    的头像 发表于 11-24 15:55 200次阅读

    MPU6050在测量倾斜角的时候怎么判断倾斜的方向?

    MPU6050在测量倾斜角的时候怎么判断倾斜的方向
    发表于 10-10 07:08

    如何排查串口通信问题?

    如何排查串口通信问题?
    的头像 发表于 09-18 10:58 664次阅读
    如何<b class='flag-5'>排查</b>串口通信问题?

    工业应用中的精密倾斜感知

    在本应用笔记的指导下,用户可在静态或动态环境中选择最合适的意法半导体传感器进行角度测量。倾角计用于测量相对于地球重力矢量的倾斜、坡度或倾角。倾角计广泛应用于游戏控制器、土地测量、飞机飞行控制器
    发表于 09-08 07:03

    通过倾斜唤醒将输出引脚连接到RST来完美地工作,它在倾斜时变低是怎么回事?

    我的项目是在使用电池供电的倾斜开关打开或关闭车库门时通知我。 我通过倾斜唤醒将输出引脚连接到 RST 来完美地工作。它在倾斜时变低。 问题是它只会唤醒一次;要么打开要么关闭,不能同时打开。我
    发表于 05-25 06:39

    态路小课堂丨光口不亮?三种简单故障排查请查收!

    在光链路中,当遇到交换机光口互连不亮情况时,很多人不知道如何处理。本文态路为您介绍三种简单故障排查方案,助您快速进行故障排查和问题定位。   一、首先检查一致性 1、两端光模块型号是否一致。一般包括
    的头像 发表于 05-23 11:16 599次阅读
    态路小课堂丨光口不亮?三种简单故障<b class='flag-5'>排查</b>请查收!

    态路小课堂丨光口不亮?三种简单故障排查请查收!

    在光链路中,当遇到交换机光口互连不亮情况时,很多人不知道如何处理。本文态路为您介绍三种简单故障排查方案,助您快速进行故障排查和问题定位
    的头像 发表于 05-23 09:59 510次阅读
    态路小课堂丨光口不亮?三种简单故障<b class='flag-5'>排查</b>请查收!

    基于微悬臂梁的MEMS探针中与倾斜相关定位误差的量化和校正

    就微型探针而言,已经研究了避免误差的自动定位技术。量化并控制倾斜误差,对于利用微悬臂梁优化自动化探针测试至关重要。然而,后者的研究还没有考量潜在的微型MEMS探针的机械柔韧性。微悬臂梁可用于制造各种微型电气探针,包括射频探针。
    的头像 发表于 05-17 09:51 534次阅读
    基于微悬臂梁的MEMS探针中与<b class='flag-5'>倾斜</b>相关<b class='flag-5'>定位</b>误差的量化和校正