从真实案例出发解决数据倾斜问题

Hive千亿级数据倾斜解决方案 数据倾斜问题剖析 本文首发于公众号【五分钟学大数据】 数据倾斜是分布式系统不可避免的问题,任何分布式系统都有几率发生数据倾斜,但有些小伙伴在平时工作中感知不是很明显,这里要注意本篇文章的标题—“千亿级数据”,为什么说千亿级,因为如果一个任务的数据量只有几百万,它即使发生了数据倾斜,所有数据都跑到一台机器去执行,对于几百万的数据量,一台机器执行起来还是毫无压力的,这时数据倾斜对我们感知不大,只有数据达到一个量级时,一台机器应付不了这么多的数据,这时如果发生数据倾斜,那么最后就很难算出结果。 所以就需 阅读详情

是的,在大数据开发中数据倾斜(Data Skew)是非常常见且棘手的问题。我曾在多个生产项目中遇到并成功解决过数据倾斜问题。下面从 真实场景出发,系统性地说明:


✅ 一、是否遇到过?—— 真实案例

场景:用户行为日志表(100亿+条)与商品维度表 JOIN,按 item_id 关联。
问题:作业运行 2 小时卡在最后 1 个 Reducer,其他 Reducer 早已完成。
影响:ETL 任务超时失败,下游报表延迟。


✅ 二、如何定位数据倾斜?

🔍 方法 1:观察任务进度(最直观)

  • 在 YARN / Spark UI 中看到:
    • 大部分 Task 几秒完成;
    • 少数 Task(甚至 1 个)运行数分钟/小时;
    • 这些 Task 处理的数据量远大于其他(如 10GB vs 10MB)。

🔍 方法 2:分析 Key 分布(精准定位)

-- 对 JOIN 字段或 GROUP BY 字段做分布统计
SELECT item_id, COUNT(*) AS cnt
FROM user_behavior
TABLESAMPLE(1 PERCENT)  -- 采样避免全扫
GROUP BY item_id
ORDER BY cnt DESC
LIMIT 10;

结果发现:item_id = 'hot_999' 占比 62%(典型的“爆款商品”)。

🔍 方法 3:查看执行计划 & 日志

  • Hive MR 日志中出现:
    Reducer 0: 1/1 completed (100%)
    Reducer 1: 0/1 completed (stuck for 1h)
    
  • Spark UI 中 Task 持续时间长、Shuffle Read Size 巨大。

✅ 三、定位后如何处理?—— 分场景策略

🎯 场景 1:JOIN 倾斜(大表 JOIN 大表)

✅ 解决方案:拆分 + 打散(Salt)
-- 步骤1:识别倾斜 Key(如 'hot_999')
-- 步骤2:拆分处理

-- 非倾斜部分(正常 JOIN)
INSERT INTO result
SELECT /*+ MAPJOIN(b) */ a.*, b.*
FROM (
  SELECT * FROM big_table_a WHERE item_id != 'hot_999'
) a
JOIN (
  SELECT * FROM big_table_b WHERE item_id != 'hot_999'
) b ON a.item_id = b.item_id

UNION ALL

-- 倾斜部分(加随机 salt 打散)
SELECT a.*, b.*
FROM (
  SELECT *, CONCAT(item_id, '_', CAST(RAND() * 10 AS INT)) AS salt_key
  FROM big_table_a
  WHERE item_id = 'hot_999'
) a
JOIN (
  SELECT *, CONCAT(item_id, '_', CAST(RAND() * 10 AS INT)) AS salt_key
  FROM big_table_b
  WHERE item_id = 'hot_999'
) b ON a.salt_key = b.salt_key;

💡 原理:将 1 个大 Key 拆成 10 个小 Key,并行处理。


🎯 场景 2:GROUP BY 倾斜

✅ 解决方案:两阶段聚合(局部 + 全局)
-- 第一阶段:Map 端局部聚合(加 salt)
WITH stage1 AS (
  SELECT 
    item_id,
    CONCAT(item_id, '_', CAST(RAND() * 5 AS INT)) AS salt_key,
    COUNT(1) AS local_cnt
  FROM user_behavior
  GROUP BY item_id, salt_key
),
-- 第二阶段:全局聚合(去掉 salt)
stage2 AS (
  SELECT 
    item_id,
    SUM(local_cnt) AS total_cnt
  FROM stage1
  GROUP BY item_id
)
SELECT * FROM stage2;

✅ 效果:避免单个 Reducer 处理全部 'hot_999' 数据。


🎯 场景 3:倾斜 Key 是无效值(如 NULL、-1)

✅ 解决方案:单独过滤处理
-- 主流程排除无效值
INSERT INTO result
SELECT ... FROM a JOIN b ON a.id = b.id WHERE a.id IS NOT NULL;

-- 无效值单独写默认值或丢弃
INSERT INTO result
SELECT ..., '未知商品' FROM a WHERE id IS NULL;

🎯 场景 4:使用引擎自适应优化(推荐)

Spark AQE(自动处理倾斜):
SET spark.sql.adaptive.enabled=true;
SET spark.sql.adaptive.skewJoin.enabled=true;
SET spark.sql.adaptive.skewJoin.skewedPartitionThresholdInBytes=256MB;

✅ Spark 自动检测倾斜 Partition,并拆分成小 Task 并行处理。

Hive 自动倾斜优化:
SET hive.optimize.skewjoin=true;
SET hive.skewjoin.key=100000;

✅ 四、处理后性能提升多少?—— 实测数据

指标优化前优化后提升效果
总运行时间2 小时 10 分钟8 分钟⏱️ 提速 16 倍
最长 Task 时间1 小时 50 分钟45 秒📉 降低 99%
资源消耗200 个 Container50 个 Container💰 节省 75% 计算资源
任务稳定性经常 OOM 失败100% 成功✅ SLA 达标

💡 关键收益:不仅提速,还大幅降低集群压力和运维成本。


✅ 五、预防建议(避免再次发生)

  1. 上线前采样分析 Key 分布;
  2. 对高频字段做业务归一化(如将“未知用户”分散为 unknown_{hash});
  3. 默认开启 AQE(Spark)或 skewjoin(Hive);
  4. 监控大表 JOIN/GROUP BY 作业的 Task 耗时差异。

📌 面试总结(黄金回答)

我在处理用户行为日志与商品表 JOIN 时,遇到因“爆款商品”导致的数据倾斜:99% 的 Task 几秒完成,1 个 Task 卡 2 小时。
通过 采样分析定位到倾斜 Key,采用 “拆分 + 随机打散”策略,将单点压力分散到 10 个并行任务。
最终作业从 2 小时降至 8 分钟,提速 16 倍,资源消耗减少 75%。
后续我们将倾斜检测纳入上线 checklist,并默认开启 Spark AQE,从源头规避此类问题。

这种经验体现了问题定位能力、技术深度和业务结果导向,是大数据工程师的核心价值。

Spark数据倾斜问题+解决方案 1、数据倾斜 数据倾斜指的是,并行处理的数据集中,某一部分(如Spark或Kafka的一个Partition)的数据显著多于 其它部分,从而使得该部分的处理速度成为整个数据集处理的瓶颈 数据倾斜俩大直接致命后果 1)数据倾斜直接会导致一种情况:Out Of Memory 2)运行速度慢 主要是发生在Shuffle阶段。同样Key的数据条数太多了。导致了某个key(下图中的80亿条)所在的Task数 据量太大了。远远超过其他Task所处理的数据量 一个经验结论是:一般情况下,OOM的原因都是数据倾斜 2、如 阅读详情

相关推荐

数据倾斜问题及解决方法总结

在任务开发前,对关键字段(Join Key, Group By Key)进行数据分布分析(最大值、最小值、频次统计、直方图),提前发现潜在热点。如果数据分层(ODS -> DWD -> DWS),在底层明细层就进行适当粒度的聚合,减少上层宽表或应用层聚合的压力。的数据进行Join即可,大大减少参与Shuffle和Join的数据量,且天然避免倾斜(前提是桶内数据均匀)。去掉随机前缀,对阶段一的结果进行第二次聚合(此时相同原始Key的数据量已大大减少)。类似于添加随机前缀,是一种特殊的自定义分区策略。

走过冬季 1463

【大数据实战案例】解决由手机号缺失引发的数据倾斜,提速10倍

本文总结一个数据倾斜的问题,该问题由 SQL 函数对手机号分组时引发,做数仓开发的同学在在业务实战过程中,或许会遇到过。先简单介绍一下什么是数据倾斜和为什么会造成数据倾斜。数据倾斜是在分布式计算系统中经常遇到的一种现象,特别是在大数据处理和分析领域。它指的是数据在被分割并分配到多个计算节点上进行并行处理时,数据分布不均匀,导致某些节点处理的数据量远远大于其他节点的现象。在 MapReduce 中,数据倾斜也是比较常见的一个问题,稍不留意可能就会出现数据倾斜的问题。

明而决之 1524

Flink数据倾斜问题以及解决方法

1. 判断是否存在数据倾斜 相同 Task 的多个 Subtask 中,个别Subtask 接收到的数据量明显大于其他 Subtask 接收到的数据量,通过 Flink Web UI 可以精确地看到每个 Subtask 处理了多少数据,即可判断出 Flink 任务是否存在数据倾斜。通常,数据倾斜也会引起反压。 2.数据倾斜的解决 2.1 keyBy 之前发生数据倾斜 如果 keyBy 之前就存在数据倾斜,上游算子的某些实例可能处理的数据较多,某些实例可能处理的数据较少,产生该情况可能是因为数据源的数据本身

weixin_43805212的博客 7738

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

多数介绍数据倾斜的文章都是以大篇幅的理论为主,并没有给出具体的数据倾斜案例。当工作中遇到了倾斜问题,这些理论很难直接应用,导致我们面对倾斜时还是不知所措。今天我们不扯大篇理论,直接以例子来实践,排查是否出现了数据倾斜,具体是哪段代码导致的倾斜,怎么解决这段代码的倾斜。当执行过程中任务卡在 99%,大概率是出现了数据倾斜,但是通常我们的 SQL 很大,需要判断出是哪段代码导致的倾斜,才能利于我们解决倾斜。通过下面这个非常简单的例子来看下。

eli的博客 543

大数据领域Flink的数据倾斜问题解决

想象一下,你和9个朋友一起搬家,总共100个箱子需要搬。理想情况下,每人搬10个箱子,大家同时完工。但如果其中9个人只分到1个箱子,而你一个人要搬91个箱子,会发生什么?其他人很快就没事可做,而你却要累得半死,整个搬家过程的时间完全取决于你一个人。这就是分布式计算中"数据倾斜"的通俗写照——计算资源分配严重不均,导致整体效率低下。为什么会发生数据倾斜?如何准确识别数据倾斜?有哪些有效的解决策略?不同场景下应该选择哪种方案?

大数据洞察的博客 1103

人工智能顶会投稿指南:CCF-A类会议ACL、ICML、NeurIPS、ICLR的投稿周期与影响力解析

本文详细解析了CCF-A类会议ACL、ICML、NeurIPS、ICLR的投稿周期与影响力,涵盖各会议的投稿时间线、评审特点及录用率。ACL注重自然语言处理,ICML强调机器学习理论,NeurIPS覆盖神经信息处理,ICLR聚焦表征学习。文章还提供了实战投稿策略,帮助研究者提升投稿成功率。

weixin_29211309的博客 3345

解决Spark数据倾斜(Data Skew)的N种姿势

本文转发自技术世界,原文链接 http://www.jasongj.com/spark/skew/摘要本文结合实例详细阐明了Spark数据倾斜的几种场景以及对应的解决方案,包括避免数据源...

大数据星球-浪尖 1696

基于python+flask框架的基于微信小程序的CR公司建设项目信息管理系统-前台(开题+程序+论文) 计算机毕设

特别是随着移动互联网技术的普及,企业对便捷、高效的信息管理系统的需求日益迫切。另一方面,该系统集成了仓管、物料、财务、人事、供应商等多个模块,实现了数据的集中管理和信息共享,有助于企业实现精细化管理,降低运营成本,提升决策效率。:深入调研CR公司的业务需求,明确系统应具备的功能模块,包括仓管员管理模块(物料信息、退回记录、申请信息、仓库信息管理)、财务员管理模块(资金信息管理、采购与租赁款项处理)、人事管理模块、供应商管理模块、项目管理模块(项目信息、设备采购、物料采购、设备租赁)、以及考勤打卡模块等。

zhihao503的博客 960

大数据SQL优化之数据倾斜解决案例全集

1 什么是数据倾斜数据倾斜即指在大数据计算任务中某个处理任务的进程(通常是一个JVM进程)被分配到的任务量过多,导致任务运行时间超长甚至最终失败,进而导致整个大任务超长时间运行或者失败。外...

过往记忆大数据 6484

深入解析高通Adreno DPU的DRM/KMS驱动架构与硬件协同设计

本文深入解析了高通Adreno DPU的DRM/KMS驱动架构与硬件协同设计,详细介绍了Adreno DPU的核心模块组成、显示接口设计以及DRM驱动架构。通过实际案例和调试技巧,帮助开发者理解硬件与软件的协同工作原理,优化显示性能并解决常见问题。

weixin_29266679的博客 437

C语言入门系列:指针入门(超详细)

指针与内存是息息相关的,在学习指针之前,先回忆下内存相关的知识。内存是程序运行期间存储数据的硬件设备,为了方便管理,计算机将内存划分为一个个小的单元,每个单元的大小是一个字节。如果把内存比作一栋酒店大楼,内存单元就像是一个个小的房间,数据就住在小房间里。我们知道,为了客人能准确找到属于自己的房间,酒店房间是有房号的。同样,内存单元也是有编号的,这个编号在计算机中称之为“内存地址。

epitomizelu的专栏 3695

Hive 数据倾斜问题定位排查及解决(实际案例)

多数介绍数据倾斜的文章都是以大篇幅的理论为主,并没有给出具体的数据倾斜案例。当工作中遇到了倾斜问题,这些理论很难直接应用,导致我们面对倾斜时还是不知所措。 今天我们不扯大篇理论,直接以例子来实践,排查是否出现了数据倾斜,具体是哪段代码导致的倾斜,怎么解决这段代码的倾斜。 当执行过程中任务卡在 99%,大概率是出现了数据倾斜,但是通常我们的 SQL 很大,需要判断出是哪段代码导致的倾斜,才能利于我们解决倾斜。通过下面这个非常简单的例子来看下如何定位产生数据倾斜的代码。 表结构描述 先来了解下这些表中我

yumingzhu1的博客 3909

详解卷积神经网络(CNN)

卷积神经网络(Convolutional Neural Network, CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。

qq_25762497的博客 25万+

hive join 数据倾斜 真实案例

hive或者MR处理数据,不怕数据量大,就怕倾斜。hive里大表join的时候,数据倾斜就是个很头疼的问题。本博主就遇到了一个真实案例,特意记录下来,有需要的同学可以参考1.查了5个小时...

a934079371的博客 569

Android15车载系统开机冷启动流程源码解析

本文主要介绍Android15车机系统开机冷启动的流程,暂不包含bootloader,仅从kernel开始直至Launcher首页展示。

jidapenglin28的专栏 253

基于深度学习的图像修复系统,GAN图像修复,图像修复算法研究,并实现系统登录和注册,全网独发

近年来,深度学习已成为计算机视觉领域的研究热点,基于深度学习的图像修复技术弥补了传统修复方法长期存在的不足,显著提高了生成结果的质量。深度学习是指模仿人脑机制设计的具有深层结构的神经网络。深度学习作为一种表征学习,通过模仿人脑神经元之间的信息传递方式来学习输入数据的特征,并找到输入和输出数据之间的映射关系。通过在图像修复中应用深度学习技术,可以准确学习图像的语义信息,然后根据信息预测缺失的内容,大大克服了传统修复算法的不足,使结果更具逻辑性。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 8262

怎么解决数据倾斜问题?

本文面向的读者是从事数据分析、数据处理(ETL)等相关工作的朋友们,相信大家在工作中一定遇到过数据倾斜的问题,读完本文,你会了解到数据倾斜的定义及其危害、产生的原因及应对措施、常见倾斜场景及解决办法等知识,相信对你今后处理数据倾斜问题会有一定的帮助。 目前流行的大数据相关的计算框架之所以能够处理大量的数据和计算,基本上都是依赖分布式计算的思想,即由一个通过某种组织关系连接在一起的集群来共同完...

Mr_HHH的博客 5968

Sigrity Power Tree如何进行直流压降仿真分析操作指导

Sigrity Power Tree模式可以用于前仿真,在没有layout文件的情况下对电源进行直流压降仿真分析,用于评估原理图设计以及器件选型是否合理。Model:设置为Equal Current,设置为等电源模型,意思该负载每个电源pin都是等电流的。Current:设置每个负载的电流,U30为3A,U3-U6各为1A。Nominal Current:设置能够承载的最大电流,设置为10A。Upper/ Lower Tol:设置为压降范围为5%Output Current:设置输出电流为10A。

weixin_54787054的博客 732

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

Hive 数据倾斜怎么发现,怎么定位,怎么解决 多数介绍数据倾斜的文章都是以大篇幅的理论为主,并没有给出具体的数据倾斜案例。当工作中遇到了倾斜问题,这些理论很难直接应用,导致我们面对倾斜时还是不知所措。 本文首发在公众号【五分钟学大数据】 今天我们不扯大篇理论,直接以例子来实践,排查是否出现了数据倾斜,具体是哪段代码导致的倾斜,怎么解决这段代码的倾斜。 当执行过程中任务卡在 99%,大概率是出现了数据倾斜,但是通常我们的 SQL 很大,需要判断出是哪段代码导致的倾斜,才能利于我们解决倾斜。通过下

yuan_more的博客 1882

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Spark数据倾斜问题解决方案大全

1. 作业运行时间监控:当作业运行时间超过历史平均水平时触发告警2. 任务分布监控:监控Task运行时间标准差,超过阈值时告警3. 数据分布监控:定期分析核心表的Key分布,识别潜在倾斜风险4. 自动化诊断报告各Stage的Shuffle数据量分布最长任务与平均任务的时间比疑似倾斜Key列表及分布情况。

AI智能探索者的博客 891

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【Hadoop】(五)MapReduce 如何解决数据倾斜问题_mapreduce 数据倾斜

简单来说数据倾斜就是数据的key 的分化严重不均,造成一部分数据很多,一部分数据很少的局面。举个 word count 的入门例子,它的map 阶段就是形成 (“aaa”,1)的形式,然后在reduce 阶段进行 value 相加,得出 “aaa” 出现的次数。若进行 word count 的文本有100G,其中 80G 全部是 “aaa” 剩下 20G 是其余单词,那就会形成 80G 的数据量交给一个 reduce 进行相加,其余 20G 根据 key 不同分散到不同 reduce 进行相加的情况。

2401_84615578的博客 1233

MapReduce如何解决数据倾斜问题

前言:数据倾斜是日常大数据查询中隐形的一个BUG,遇不到它时你觉得数据倾斜也就是书本博客上的一个无病呻吟的偶然案例,但当你遇到它是你就会懊悔当初怎么不多了解一下这个赫赫有名的事故。 当然你和数据倾斜的缘分深浅还是看你公司的业务逻辑和数据量有没有步入数据倾斜的领地。   说明:关于数据倾斜的产生原因我将结合 map 和 reduce 阶段中的 shuffle 来讲解,若是对 shuffle 有...

wyqwilliam的博客 3870

hive解决数据倾斜问题_hive数据倾斜的解决办法

数据倾斜是进行大数据计算时常见的问题。主要分为map端倾斜和reduce端倾斜,map端倾斜主要是因为输入文件大小不均匀导致,reduce端主要是partition不均匀导致。在hive中遇到数据倾斜的解决办法:一、倾斜原因:map端缓慢,输入数据文件多,大小不均匀当出现小文件过多,需要合并小文件。可以通过set hive.merge.mapfiles=true来解决。set hive.map.a...

weixin_35785014的博客 2610
上一篇: hive mapjoin 原理
下一篇: Hive 如何实现行转列、列转行
走过冬季
博客等级 码龄9年 1609粉丝 341原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

走过冬季

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值