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

    文章

    7221

    浏览量

    90107
  • SQL
    SQL
    +关注

    关注

    1

    文章

    777

    浏览量

    44380
  • 代码
    +关注

    关注

    30

    文章

    4856

    浏览量

    69453
  • hive
    +关注

    关注

    0

    文章

    12

    浏览量

    3880

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

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

收藏 人收藏

    相关推荐

    CAN总线故障排查:从问题到解决的实战案例

    视频推荐在工业现场的煤安监控网络中,CAN总线通信常因复杂环境出现数据丢失问题。本文以一起煤安监控网络中CAN总线数据丢失的故障排查案例,简述排查
    的头像 发表于 02-28 11:37 166次阅读
    CAN总线故障<b class='flag-5'>排查</b>:从问题到解决的实战案例

    GPS无法定位?一定要排查的情况来啦~

    社群又有新朋友着急来问:   我的GPS无法定位啊,怎么破?… 做开发哪有不踩坑的,你并不孤独。 本文特别分享无法定位最常见的四种情况,希望能帮到有类似定位应用项目的朋友们,更快地排查
    的头像 发表于 02-24 15:25 111次阅读
    GPS无法<b class='flag-5'>定位</b>?一定要<b class='flag-5'>排查</b>的情况来啦~

    数据采集网关出现断网可能是什么原因?如何排查

    数据采集网关出现断网可能是什么原因?如何排查
    的头像 发表于 11-30 13:43 409次阅读

    机智云历史数据导出与排查指南

    机智云历史数据导出与排查指南在使用机智云平台进行设备管理和数据监控时,历史数据的导出和排查是常见的需求。机智云提供了开放的API接口,方便用
    的头像 发表于 11-21 01:01 284次阅读
    机智云历史<b class='flag-5'>数据</b>导出与<b class='flag-5'>排查</b>指南

    输电线路杆塔倾斜在线监测装置,杆塔倾斜预警大师

    很多人还不知道杆塔倾斜有怎样的危害以及杆塔倾斜是什么?杆塔倾斜是指输电线路的杆塔在垂直方向上偏离了正常位置,出现一定角度或位移的现象。 产生原因 1、杆塔基础是确保杆塔稳定的关键。水土流失、地基沉降
    的头像 发表于 11-20 18:05 354次阅读

    北斗输电线路杆塔倾斜在线监测装置 高精度差分定位 双天线

    该装置结合北斗技术和物联网技术,实现对杆塔倾斜状态的实时监测,包括航向⻆、顺线倾斜度、横线倾斜度等,并将监测数据无线发送至监测中心进行处理,一旦监测
    的头像 发表于 11-08 10:55 297次阅读

    电杆倾斜监测装置 杆塔倾斜监测装置 支持数据实时读取 精确预警

    TLKS-PMG-QX电杆倾斜监测装置的核心组件是双轴倾角传感器,该传感器能够精确测量杆塔在纵向和横向两个方向的倾斜角度。传感器持续进行数据采集,并将这些数据实时传输至监测主机。监测主
    的头像 发表于 11-05 11:05 395次阅读
    电杆<b class='flag-5'>倾斜</b>监测装置 杆塔<b class='flag-5'>倾斜</b>监测装置 支持<b class='flag-5'>数据</b>实时读取 精确预警

    倾斜传感器的种类与选择技巧

    2024-07-17 倾斜传感器,又称倾角传感器或倾斜计,是一种测量物体相对于重力场的倾斜角度的设备。这些传感器在各种应用中都有广泛的使用,包括工业自动化、航空航天、楼宇、汽车和消费类电子产品等领域
    的头像 发表于 10-02 17:10 811次阅读
    <b class='flag-5'>倾斜</b>传感器的种类与选择技巧

    数据从业者必知必会的Hive SQL调优技巧

    数据从业者必知必会的Hive SQL调优技巧 摘要 :在大数据领域中,Hive SQL被广泛应用于数据仓库的
    的头像 发表于 09-24 13:30 381次阅读

    科普小课堂|LCD 问题排查思路解析

    在嵌入式系统开发中,液晶显示器(LCD)作为人机交互的重要界面,其稳定性和可靠性至关重要。然而在实际应用中,LCD难免会遇到各种问题。今天和各位小伙伴分享一些常见的LCD问题及其排查思路,帮助大家快速定位并解决这些问题。
    的头像 发表于 08-05 17:06 1268次阅读
    科普小课堂|LCD 问题<b class='flag-5'>排查</b>思路解析

    故障排查小能手:输电线路分布式故障定位装置大解析

    。同时,通过故障波形数据还能够提供故障类型、电压和负荷电流等相关信息,故障结果以无线通信方式发送至监测中心,方便运维人员及时进行故障排查和修复。
    的头像 发表于 07-04 10:18 682次阅读

    “Spark+Hive”在DPU环境下的性能测评 | OLAP数据库引擎选型白皮书(24版)DPU部分节选

    在奇点云2024年版《OLAP数据库引擎选型白皮书》中,中科驭数联合奇点云针对Spark+Hive这类大数据计算场景下的主力引擎,测评DPU环境下对比CPU环境下的性能提升效果。特此节选该章节内容,与大家共享。
    的头像 发表于 05-30 16:09 620次阅读
    “Spark+<b class='flag-5'>Hive</b>”在DPU环境下的性能测评 | OLAP<b class='flag-5'>数据</b>库引擎选型白皮书(24版)DPU部分节选

    输电线路杆塔倾斜在线监测装置功能,案例 杆塔倾斜的影响因素及铁塔倾斜监测预警系统的应用

    输电线路杆塔倾斜是由于基础不平或地基不稳下沉引起杆塔中心偏离铅垂位置的现象。这种现象不仅会影响输电线路的安全和稳定运行,还可能导致线路故障,甚至造成停电事故。杆塔倾斜会加大杆塔的受力,造成杆塔变形
    的头像 发表于 05-23 09:20 540次阅读
    输电线路杆塔<b class='flag-5'>倾斜</b>在线监测装置功能,案例 杆塔<b class='flag-5'>倾斜</b>的影响因素及铁塔<b class='flag-5'>倾斜</b>监测预警系统的应用

    电缆故障排查技术案例笔记

    电缆故障排查技术案例笔记
    的头像 发表于 05-20 17:03 700次阅读
    电缆故障<b class='flag-5'>排查</b>技术案例笔记

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

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