当前位置: 首页 > article >正文

数据倾斜的各种原因及处理方案

数据倾斜的本质是Shuffle 过程中 key 分布极度不均导致个别 Task 处理的数据量远超其他 Task成为整个作业的短板。一、业务数据本身分布不均热点 Key例子搜索日志中统计每个搜索词的点击量像热门词如“天气”、“淘宝”每天上亿次搜索而其他的只有几十次。处理1. 加盐两阶段聚合人为将同一个热点 Key 拆成多个“子 Key”使它们分散到不同的 Reduce 分区先局部聚合然后再将各局部结果合并为最终结果。局部聚合加盐分散 全局聚合-- 第一阶段加盐局部聚合 WITH salted_agg AS ( select salted_query, COUNT(1) AS local_cnt from ( SELECT -- 热点词加随机后缀 (0~99)非热点词保持不变 CASE WHEN query IN (天气, 淘宝) THEN CONCAT(query, _, CAST(FLOOR(RAND() * 100) AS INT)) ELSE query END AS salted_query FROM search_log ) as tmp group by salted_query ) -- 第二阶段去后缀全局聚合 SELECT CASE WHEN salted_query LIKE %\\_% THEN split(salted_query,_)[0] ELSE salted_query END AS query, SUM(local_cnt) AS total_click FROM salted_agg GROUP BY CASE WHEN salted_query LIKE %\\_% THEN split(salted_query,_)[0] ELSE salted_query END;2. Combiner在 Map 端预先聚合减少传输量但不能根治倾斜。3. 优化 Reduce 端内存与并行度增大 Reduce Task 的内存堆空间、提高 shuffle 缓冲区比例、增加并行拷贝线程数等只能让倾斜任务跑得“不那么容易 OOM”但无法改变它处理的数据量是别的 Task 几十倍的事实所以是辅助手段。二、Join 时连接键严重偏斜例子订单表10 亿行关联用户表其中用户user_id10086拥有 5 亿条订单其余用户只有几十条。处理1. 小表广播大表join小表如果是大表join小表的情况可以将小表进行广播到各节点在 Map 端完成 Join消除 Shuffle 和倾斜。维度HiveMap JoinSpark SQLBroadcast Hash Join自动转换开关hive.auto.convert.jointruespark.sql.autoBroadcastJoinThreshold非负值阈值控制hive.mapjoin.smalltable.filesize(25MB)autoBroadcastJoinThreshold(10MB)手动 Hint/* MAPJOIN(t) *//* BROADCAST(t) */合并多个小表hive.auto.convert.join.noconditionaltask如果多张表的大小总和不超过阈值允许将多个 Map Join 合并成一个 Map-Only 任务进一步提升效率。每个 Join 单独广播但 AQE 可优化底层实现Map 端内存哈希表Executor 内存广播变量 哈希表2. 倾斜键分离大表 Join 大表步骤如下步骤 1识别倾斜 Key通过采样找出出现次数远超平均值的连接键。例如发现user_id 10086是倾斜 Key。步骤 2分离数据将 orders 表和 user 表中的记录按“是否包含倾斜 Key”分别过滤形成倾斜部分orders_skew (user_id10086) 和 user_skew (user_id10086)正常部分orders_normal (user_id≠10086) 和 user_normal (user_id≠10086)步骤 3正常部分常规 Join正常部分没有热点直接走普通的 Shuffle Join 或者 Map Join如果 user_normal 足够小不会产生倾斜。步骤 4倾斜部分特殊处理——加盐膨胀对于倾斜部分采用加盐的思路但针对 Join 的特点需要将小表膨胀对 user_skew 中的那条user_id10086记录复制 N 份N 如 100每份加上一个随机后缀变成user_id_salt 10086_0, 10086_1, ..., 10086_99。这样小表由 1 条膨胀为 100 条。同时对 orders_skew 中user_id10086的订单记录每条也加上 0~99 之间的随机后缀生成user_id_salt。现在两表在user_id_salt字段上 Join由于加上了随机后缀原来的 3 亿条订单被均匀打散到 100 个 Reduce 上每个 Reduce 处理约 300 万条订单和 1 条用户记录负载均衡。步骤 5合并结果将 Step 3 和 Step 4 的输出用 Union All 合并得到完整的 Join 结果。3. Hive参数调优hive.optimize.skewjointrue自动检测倾斜键将其分离并启动独立的 Task 处理。hive.skewjoin.key指定倾斜键阈值默认 100000超过的记录数视为倾斜。4. Spark AQE 自适应优化spark.sql.adaptive.enabledtrue作用开启 AQE 总开关。原理Spark 在 Shuffle 完成后不再使用固定的并行度和计划而是根据每个分区的实际数据量动态进行运行时优化包括合并小分区将多个数据量很小的分区合并成一个减少 Task 数量避免资源浪费。自动切换 Join 策略如果发现某张表的数据量在 Shuffle 后变得很小可实时将 Sort Merge Join 切换为 Broadcast Hash Join。倾斜分区拆分允许下面的skewJoin优化生效。效果无需人工调参让 Spark 根据真实数据流动态决策提高稳定性和性能。spark.sql.adaptive.skewJoin.enabledtrue作用开启 AQE 下的倾斜 Join 自动拆分优化依赖总开关已开启。原理当 Spark 检测到某个 Join 分区的大小明显超过中位数分区大小的5倍默认可配置时会将该倾斜分区拆分成多个小分区并与另一张表对应的数据分别 Join然后将结果合并。效果自动解决 Join 时由于热点键导致某个 Task 数据量过大的数据倾斜问题无需手动加盐或设计分桶表。5. 分桶 SMB JoinSort-Merge Bucket Join分桶 SMB Join 是 Hive 中专门为大表 Join 大表设计的一种极致优化手段。它的核心思想是提前把数据按连接键分桶且排序Join 时直接按桶进行归并彻底消除 Shuffle 和 Reduce 阶段。SMB Join 是一种Map-Only 操作没有 Reduce它的执行过程很直接表必须是分桶表且按 Join Key 排序建表时用CLUSTERED BY (join_key) SORTED BY (join_key) INTO N BUCKETS定义。这样每个桶内部的数据已经按连接键排好序了。两表的分桶数必须一致或成比例最常见是两个表桶数相同这样每个桶 ID 一一对应直接配对 Join。Join 时Hive 启动 Map Task每个 Map Task 会读取两张表中相同桶 ID 的文件如 orders 的 bucket 0 和 users 的 bucket 0。因为桶内数据已按 key 排序Map Task 只需将它们进行归并排序式的归并连接就像归并两个有序链表边读边匹配内存占用很低且纯顺序 I/O。示意图orders 桶 0 和 users 桶 0 → Map Task 0orders 桶 1 和 users 桶 1 → Map Task 1...没有 Shuffle没有 Reduce所有工作都在 Map 端完成。注意两张表都必须是分桶排序表且分桶键和排序键需是 Join 键。桶的数量必须相等或者一方的桶数是另一方的整数倍此时多个小桶对应一个大桶。生产上通常设为相同桶数。如果桶数相等Join 的桶列数据类型和分桶算法必须一致避免逻辑桶号不匹配。表的数据不能频繁更新/追加否则需要重新分桶排序维护。三、分组聚合Group By时 Key 不均例子按城市分组统计人口大城如北京、上海的人口是普通县城的千倍聚合时对应 Reduce 数据量巨大。处理1. Combiner 预聚合Map 端合并Combiner 在 Map 端对province, 1做局部求和输出province, 局部总数。这样每个 Map Task 只发少量汇总记录给 Reducer大幅减少 Shuffle 数据量和倾斜 Reducer 的输入。2. 加盐两阶段聚合第一阶段 city 加随机后缀做局部聚合第二阶段去掉后缀做全局聚合。3. Hive参数调优hive.groupby.skewindata是 Hive 中一个专门用于应对Group By 聚合操作造成的数据倾斜的优化参数。当它被设置为true默认是false时Hive 会自动将存在倾斜的聚合操作拆分成两个 MapReduce Job来执行通过“分步聚合”的方式平衡 Reduce 端的负载4.Spark AQE 自适应优化spark.sql.adaptive.enabledtrue开启 AQE 总开关。四、去重/计数Distinct产生的倾斜例子SELECT COUNT(DISTINCT user_id) FROM orders;在大表上执行所有同一 user_id 的去重任务会聚集到一个 Reduce数据量大时严重倾斜。处理1. 改写为 Group ByCOUNT(DISTINCT col)之所以能通过改写为GROUP BY解决倾斜核心原因在于执行计划的本质差异前者通常限制在单任务做全局去重后者可以自然分散到多任务并行并利用 Map 端预聚合减少数据量。方式典型执行计划数据流向是否可预聚合COUNT(DISTINCT col)所有数据汇集到一个 Reducer严格去重后输出总条数全量数据单点汇集否去重必须看到全部数据SELECT COUNT(*) FROM (SELECT col FROM t GROUP BY col)Map 端先局部去重组合并Shuffle 到多个 Reducer 做全局分组最后再统计分组个数数据分散到多 Reducer是Map 端 Combiner 可局部去重2. 加盐两阶段聚合同前面局部聚合加盐分散 全局聚合3. Hive参数调优hive.optimize.distinct.rewritetrue(Hive 1.2.0)这个参数是为了解决早期版本中COUNT(DISTINCT)将所有数据拉到单个 Reducer 导致性能瓶颈的问题。作用它会对查询逻辑进行重写效果类似于手动将COUNT(DISTINCT col)改写为SELECT COUNT(*) FROM (SELECT col FROM table GROUP BY col) t。↔️分组场景如果GROUP BY字段的基数很高查询会被拆分为多个 MapReduce 任务虽然能避免单点瓶颈但也可能因任务增加而引入额外开销。✅适用场景主要针对没有 Group By或分组粒度较粗的查询可以有效缓解单Reducer过载问题。hive.optimize.countdistincttrue(Hive 3.0.0默认开启)这是Hive 3.0引入的更高级优化是对前者的补充和增强。作用它会根据数据量和基数信息进行基于成本的优化自动选择最优执行计划。即使原始查询中有多个count(distinct col)它也能智能地进行多次重写和聚合。多维优化能够处理多列去重、多Grouping Sets等复杂场景通过多级聚合模式实现比单一重写规则更好的优化效果。兼容性已知在部分版本中同时开启hive.optimize.countdistinct与hive.groupby.skewindata可能导致结果错误如果遇到问题可考虑关闭其中一个参数。4. Spark AQE自适应优化spark.sql.adaptive.skewJoin.enabledtrue5.approx_count_distinct(近似函数)业务允许误差如1-2%时使用approx_count_distinct()完全避开 Shuffle 和倾斜在 Hive 和 Spark 中均适用且性能极佳。五、大量空值或脏数据引起倾斜例子日志中user_id字段很多为 NULL导致所有 NULL 记录进入同一 Reduce数据量巨大。处理1. 直接过滤空值或脏数据若业务允许直接过滤掉空值或脏数据。2.加盐两阶段聚合若还是需要这部分数据还是采用加盐两阶段聚合的方式。六、总结口诀能过滤的直接过滤空值、脏数据能预聚合的先 Combiner求和、计数小表直接广播Map Join 消除 Shuffle大表加盐打散两阶段聚合、倾斜键分离膨胀引擎有自动优化的优先用Hive skewindata/skewjoin、Spark AQE

相关文章:

数据倾斜的各种原因及处理方案

数据倾斜的本质是 Shuffle 过程中 key 分布极度不均,导致个别 Task 处理的数据量远超其他 Task,成为整个作业的短板。一、业务数据本身分布不均(热点 Key)例子:搜索日志中统计每个搜索词的点击量,像热门词&…...

工厂停产1小时亏8万?AI+软件集成,设备故障提前预警,停产零损失

做制造业的老板、设备经理,谁没踩过“设备突发故障”的坑?某汽车零部件厂,冲压生产线电机轴承突然卡死,全线停机12小时,直接损失超80万元,订单交付延迟还赔了违约金;某家具厂更冤,同…...

vue.js 课程自己编写小游戏

一、太空大战<template><div class"game" keydown"onKey" tabindex"0"><div class"score">分数&#xff1a;{{ score }}</div><!-- 子弹 --><divclass"bullet"v-for"(b, i) in bulle…...

聚焦:Perfect Corp. 利用 NVIDIA TensorRT 和 NVENC 实现个性化的数字化美妆体验

增强现实 (AR) 和 AI 通过提供从虚拟试用到 AI 驱动的造型推荐等超个性化体验&#xff0c;正在彻底改变美妆和时尚行业。这些创新解决了一个长期难题&#xff1a;弥合数字购物与店内体验之间的差距。它们可以帮助消费者做出自信的购买决策&#xff0c;而无需亲自尝试产品。 实…...

AI大模型赋能财务小白:提升效率与风险防控收藏指南

本文探讨了如何利用GPT、Kimi、DEEPSEEK等免费AI通用大模型工具提升财务工作效率&#xff0c;涵盖财务报表编制、税务申报、数据分析、风险预警等实操应用。同时&#xff0c;详细阐述了数据脱敏、网络环境安全、权限管理等风险防控措施&#xff0c;帮助财务人员安全高效地运用A…...

2026年论文格式全攻略!GB/T 7713.1新国标解读+排版实战指南

2026年论文格式全攻略&#xff01;GB/T 7713.1新国标解读排版实战指南 论文格式到底是很多毕业生在提交论文前的"最后一关"&#xff0c;也是最容易被忽视的扣分项。我们对GB/T 7713.1-2025新国标及各高校最新格式要求进行了系统梳理&#xff0c;同时实测了知学术自动…...

DFT计算如何分析电子转移?

在DFT计算中&#xff0c;电子转移不是简单的电子从A跑到B&#xff0c;而是涉及电荷重新分布、成键极化、轨道相互作用、局域化特征等多层次的现象。单纯看总能量或几何结构&#xff0c;很难抓住本质。只有通过多维度波函数和电子密度分析&#xff0c;才能真正看清电子是怎么流动…...

Figma中文界面插件:让全球顶尖设计工具真正为你所用

Figma中文界面插件&#xff1a;让全球顶尖设计工具真正为你所用 【免费下载链接】figmaCN 中文 Figma 插件&#xff0c;设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 你是否曾经面对Figma的英文界面感到束手无策&#xff1f;那些复杂的专业…...

MacBook Touch Bar Windows驱动完全指南:解锁跨系统触控交互的终极方案

MacBook Touch Bar Windows驱动完全指南&#xff1a;解锁跨系统触控交互的终极方案 【免费下载链接】DFRDisplayKm Windows infrastructure support for Apple DFR (Touch Bar) 项目地址: https://gitcode.com/gh_mirrors/df/DFRDisplayKm 你是否在MacBook Pro上运行Win…...

第7章:流量获取与粉丝冷启动 /《程序员AI时代实现 直播知识付费实现月入100万的落地详细实战方案》

第7章:流量获取与粉丝冷启动 "我技术很好,但是根本没有人来看我直播怎么办?"这是在我微信私信和各个技术社群里被问得最多的一个问题。每次看到这个问题,我都能切身感受到那种无力感——自己明明在专业上花了这么多年时间,肚子里有东西,但就因为没人知道你的存…...

如何在Windows上快速安装和使用Poppler PDF处理工具

如何在Windows上快速安装和使用Poppler PDF处理工具 【免费下载链接】poppler-windows Download Poppler binaries packaged for Windows with dependencies 项目地址: https://gitcode.com/gh_mirrors/po/poppler-windows 还在为Windows系统上处理PDF文件而烦恼吗&…...

DM644x嵌入式Linux系统构建与优化实战

1. DM644x嵌入式Linux系统构建概述DM644x系列处理器是德州仪器(TI)推出的多媒体处理芯片&#xff0c;采用ARMDSP双核架构&#xff0c;广泛应用于视频监控、工业控制等领域。构建嵌入式Linux系统需要三个核心组件&#xff1a;引导程序(u-boot)、定制化Linux内核和根文件系统。与…...

基于OpenTelemetry与Prometheus构建Claude Code可观测性监控体系

1. 项目概述&#xff1a;为Claude Code构建可观测性监控体系如果你正在使用Claude Code进行AI辅助编程&#xff0c;并且对它的使用成本、效率以及内部运行状态感到好奇&#xff0c;那么今天分享的这个项目正是为你准备的。我最近花了不少时间&#xff0c;基于OpenTelemetry、Pr…...

AISMM模型首次公开拆解:4大维度、12项指标、1张决策图谱,专治“讲不清价值”顽疾

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AISMM模型与投资人沟通 核心价值对齐机制 AISMM&#xff08;AI-Driven Strategic Market Mapping&#xff09;模型通过结构化数据层、语义意图解析器和动态反馈环&#xff0c;将技术团队的工程语言实…...

AI Team OS:从被动助手到自主协作的AI团队操作系统深度解析

1. 项目概述&#xff1a;从“你问我答”到“自主运转”的AI团队操作系统如果你用过Claude Code、Cursor或者GitHub Copilot&#xff0c;那你一定熟悉这个场景&#xff1a;你输入一个指令&#xff0c;AI助手生成一段代码或一个建议&#xff0c;然后它就停在那里&#xff0c;等待…...

OpenClawUI:开源大模型现代化Web界面部署与实战指南

1. 项目概述&#xff1a;一个为开源AI模型打造的现代化Web界面最近在折腾本地部署大语言模型的朋友&#xff0c;估计都绕不开一个痛点&#xff1a;那些功能强大的开源模型&#xff0c;比如Llama、Qwen、Mistral&#xff0c;它们自带的交互方式要么是冷冰冰的命令行&#xff0c;…...

使用 Ollama 本地部署 Qwen3.5-4B 多模态模型

使用 Ollama 本地部署 Qwen3.5-4B 多模态模型 背景 对于大模型初学者来说&#xff0c;本地部署的第一步不一定是直接追求最大、最强的模型&#xff0c;而是先把完整流程跑通。一个比较完整的入门流程通常包括&#xff1a; 下载模型本地运行模型命令行对话API 调用图片输入测试查…...

嵌入式系统中ASN.1数据处理的优化策略与实践

1. ASN.1在嵌入式系统中的核心挑战在嵌入式系统开发中处理ASN.1数据面临着独特的挑战。与通用计算环境不同&#xff0c;嵌入式设备通常具有严格的内存限制、有限的处理能力和苛刻的实时性要求。让我们先看一个典型的场景&#xff1a;当设备需要处理X.509证书时&#xff0c;传统…...

声明式3D开发:基于React与Three.js构建Web三维场景

1. 项目概述&#xff1a;三维世界构建的新范式 最近在探索3D内容创作和Web交互领域时&#xff0c;一个名为 pmndrs/triplex 的项目引起了我的浓厚兴趣。这并非一个传统的3D建模软件或游戏引擎&#xff0c;而是一个基于现代Web技术栈&#xff08;特别是React和Three.js&#x…...

汽车OTA升级技术深度解析:从安全架构到工程实践

1. 汽车OTA升级&#xff1a;从概念到落地的深度拆解作为一名在汽车电子和嵌入式系统领域摸爬滚打了十几年的工程师&#xff0c;我亲眼见证了汽车从一个纯粹的机械产品&#xff0c;演变成一个高度复杂的、由软件定义的“轮上计算机”。在这个过程中&#xff0c;空中下载技术&…...

一码溯源坚守本心 京尚重构智慧厨房品质新生态

在消费升级与健康理念普及的当下&#xff0c;食品接触器具的品质与安全备受关注。京尚智慧厨房正式推出“一锅一码一匠心”全链条溯源体系&#xff0c;以数字化技术实现从泥到火的生产全程可追溯&#xff0c;用透明化管理彰显品牌责任与硬核实力&#xff0c;为行业树立品质新标…...

fast-mcp:基于MCP协议的高性能AI工具调用服务器实现

1. 项目概述&#xff1a;一个为AI应用提速的“高速公路”接口 最近在折腾AI应用开发的朋友&#xff0c;估计没少为“上下文管理”和“工具调用”这两件事头疼。你辛辛苦苦写了个Agent&#xff0c;让它去调用一个外部API获取数据&#xff0c;结果发现光是来回传递消息、解析指令…...

Taotoken用量看板与成本管理在团队API开支控制中的实际效果

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken用量看板与成本管理在团队API开支控制中的实际效果 对于小型技术团队而言&#xff0c;大模型API的调用成本是项目预算中一…...

构建青少年网络安全防护体系:从技术配置到风险认知培养

1. 项目概述&#xff1a;当网络安全教育遇上青少年社交网络使用最近在整理一些旧资料时&#xff0c;翻到一篇2012年关于儿童网络安全的行业评论&#xff0c;核心观点是&#xff1a;一项调查显示&#xff0c;高达88%的消费者希望向使用社交网络的儿童提供更多的安全建议。但文章…...

自然语言驱动自动化:nopua项目如何用LLM与Python解放重复劳动

1. 项目概述&#xff1a;一个为“懒人”设计的自动化工具最近在GitHub上闲逛&#xff0c;发现一个挺有意思的项目&#xff0c;叫nopua&#xff0c;来自wuji-labs。光看这个名字&#xff0c;就透着一股子“无为而治”的哲学味儿。点进去一看&#xff0c;果然&#xff0c;它的定位…...

基于NeoGPT构建本地知识库:RAG技术实战与调优指南

1. 项目概述&#xff1a;当本地大模型遇上你的个人知识库最近在折腾本地大模型的朋友&#xff0c;可能都遇到过类似的困境&#xff1a;模型本身能力不差&#xff0c;但一聊到公司内部文档、个人笔记或者某个特定领域的专业资料&#xff0c;它就立刻“露怯”&#xff0c;要么胡说…...

韩国AI应用付费爆发:开发者如何抢占AI出海高价值订阅增长窗口?

数字分析机构Sensor Tower披露的数据显示&#xff0c;截至2026年1月&#xff0c;韩国已跃升为谷歌生成式AI服务Gemini的全球第二大付费订阅市场&#xff0c;创收能力仅次于美国。 而Gemini的成功并非个例&#xff1a;许多AI应用开发者表示&#xff0c;尽管产品在韩国的下载量不…...

模拟信号隔离技术:工业自动化中的地环路干扰解决方案

1. 模拟信号隔离的工业需求与技术痛点在工业自动化现场&#xff0c;我们经常遇到这样的场景&#xff1a;一台PLC需要采集分布在车间不同位置的传感器信号&#xff0c;这些传感器可能分别接在不同配电柜的电源上。当把这些信号直接接入采集系统时&#xff0c;显示器上会出现莫名…...

NeoGPT实战:基于RAG构建本地私有知识库问答系统

1. 项目概述&#xff1a;当本地大模型遇上你的个人知识库最近在折腾本地大模型应用的朋友&#xff0c;估计都绕不开一个核心痛点&#xff1a;如何让这些动辄几十亿参数的“大聪明”真正理解并回答你私有的、特定领域的问题&#xff1f;比如&#xff0c;你想让它帮你分析公司内部…...

从2D到3D NAND:存储技术演进、控制器挑战与未来展望

1. 从平面到立体&#xff1a;一场关于存储密度的极限博弈 十多年前&#xff0c;当道格黄&#xff08;Doug Wong&#xff09;在EE Times的访谈中谈及存储行业的未来时&#xff0c;他描绘的图景在今天看来&#xff0c;许多已成为现实&#xff0c;而另一些则仍在深刻的演进之中。那…...