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

    文章

    7314

    浏览量

    93955
  • SQL
    SQL
    +关注

    关注

    1

    文章

    789

    浏览量

    46353
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73123
  • hive
    +关注

    关注

    0

    文章

    12

    浏览量

    4094

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Keithley吉时利6511常见故障排查及解决方法

    Keithley吉时利6511作为一款精密测量仪器,在长期使用中可能会遇到各种故障。以下是该设备常见故障的排查思路及解决方法,帮助用户快速定位问题并恢复设备正常运行。     一、常见故障及排查步骤
    的头像 发表于 11-21 18:47 442次阅读
    Keithley吉时利6511常见故障<b class='flag-5'>排查</b>及解决方法

    鄂电故障定位超声传感器如何实现快速定位排查

    在鄂电电网(涵盖高压输电线路、变电站、配电网络)运行中,设备绝缘缺陷(如绝缘子老化、电缆接头松动)、线路短路等故障若不能及时定位排查,可能引发停电事故,影响居民用电与工业生产。鄂电故障定位超声传感器
    的头像 发表于 09-11 10:53 416次阅读

    Web页面白屏问题的排查步骤和解决方法

    Web页面出现白屏的原因众多,本文列举了若干常见白屏问题的排查步骤,供开发者快速定位
    的头像 发表于 08-22 10:49 2990次阅读
    Web页面白屏问题的<b class='flag-5'>排查</b>步骤和解决方法

    倾斜仪可以应用在哪些工程的安全监测项目上?

    倾斜仪作为一种高精度变形监测设备,已广泛应用于各类工程场景,为结构安全提供实时数据保障。其耐候性强、安装便捷的特点,特别适合野外恶劣环境下的长期监测任务。水利水电工程是倾斜仪的核心应用领域在混
    的头像 发表于 08-19 16:02 557次阅读
    <b class='flag-5'>倾斜</b>仪可以应用在哪些工程的安全监测项目上?

    倾斜仪测量数据的读取与分析指南

    在结构物安全监测中,倾斜仪的数据精准度直接影响工程安全评估结果。南京峟思了解到很多用户想了解倾斜仪的数据读取和分析相关内容,那么下面我们将结合本公司的
    的头像 发表于 08-06 14:50 535次阅读
    <b class='flag-5'>倾斜</b>仪测量<b class='flag-5'>数据</b>的读取与分析指南

    VirtualLab 应用:倾斜光栅的参数优化及公差分析

    摘要 对于背光系统、光内连器和近眼显示器等许多应用来说,将光高效地耦合到引导结构中是一个重要的问题。对于这种应用,倾斜光栅以能够高效地耦合单色光而闻名。在本例中,提出了利用严格傅里叶模态方法(FMM
    发表于 05-22 08:52

    研发排查问题的利器:一款方法调用栈跟踪工具

    ,有助于快速定位代码来源和流量入口,有效提升研发和运维排查定位效率。期望在大家面临类似痛点时可以提供一些实践经验和参考,也欢迎大家合适的场景下接入使用。    现状分析 在系统值班时,经常会有人拿着报错截图前来咨询,作
    的头像 发表于 05-06 17:24 3010次阅读
    研发<b class='flag-5'>排查</b>问题的利器:一款方法调用栈跟踪工具

    分布式存储数据恢复—虚拟机上hbase和hive数据数据恢复案例

    分布式存储数据恢复环境: 16台某品牌R730xd服务器节点,每台服务器节点上有数台虚拟机。 虚拟机上部署Hbase和Hive数据库。 分布式存储故障: 数据库底层文件被误
    的头像 发表于 04-17 11:05 510次阅读

    倾斜仪适用于哪些工程场景?能否监测桥梁或隧道的变形?

    倾斜仪是一种高精度测量设备,能够实时监测建筑物或结构的倾斜角度变化。它通过内置的耐冲击传感器,将倾斜变形转化为数字信号,直接显示位移或角度值,无需复杂计算。其核心特点是耐用性强、安装方便、数据
    的头像 发表于 04-14 15:13 703次阅读
    <b class='flag-5'>倾斜</b>仪适用于哪些工程场景?能否监测桥梁或隧道的变形?

    使用福禄克示波表排查电气故障的案例分析

    当工程师们排查异常的电气故障时,和侦探探案有着异曲同工之妙。工程师需要从设备的种种表现抽丝剥茧。他们从多个测试点的数据逐一排查,甚至需要不断扩大调查范围,检查上游供电的电能质量,侦破各个潜在的影响因素,最终
    的头像 发表于 03-27 15:42 756次阅读
    使用福禄克示波表<b class='flag-5'>排查</b>电气故障的案例分析

    5G网络优化中,信令测试仪如何帮助故障排查

    的信令流程,并分析系统性能数据,从而定位问题所在。 用户设备问题定位:信令测试仪还可以检测UE相关的信令异常,如固件或操作系统问题、硬件故障以及用户操作不当等。通过仔细检查UE日志和信令跟踪记录,可以
    发表于 03-20 14:18

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

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

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

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

    机房精密空调故障?排查步骤看这!

    机房精密空调作为维持机房环境稳定的关键设备,其故障排查工作至关重要。下面聊一下排查机房精密空调故障的详细步骤。
    的头像 发表于 02-17 15:48 1062次阅读
    机房精密空调故障?<b class='flag-5'>排查</b>步骤看这!

    杆塔倾斜的原因及监测方案

    部署使用一体式杆塔倾斜在线监测系统,针对影响因素全面分析和研究,采取科学合理防治措施。
    的头像 发表于 02-07 17:08 654次阅读
    杆塔<b class='flag-5'>倾斜</b>的原因及监测方案