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

从MR迁移到Spark3:数据倾斜与膨胀问题的实战优化

背景介绍

最近在进行大规模数据任务从MapReduce向Spark3迁移的工作,遇到了一个典型的数据倾斜案例。本文将分享这个案例的具体情况、问题分析思路以及最终的解决方案,为类似场景的优化提供参考。

问题初现:迁移即遇阻

原始MR任务状态

在MapReduce环境下,该任务表现出明显的数据倾斜特征:

  • 任务执行时间异常漫长

  • 个别Reducer节点负载远高于其他节点

  • 整体性能受到严重拖累

Spark3首次运行碰壁

这个任务的迁移,sql逻辑不用更改,直接替换到spark3上执行,第一个任务跑起来就碰壁,看下截图。

根据报错(java.lang.OutOfMemoryError: Java heap space),结合MR的任务状态,看来还是因为倾斜导致的内存问题的,

初步应对:将spark.executor.memory从24G调整到40G,任务得以继续执行,但倾斜问题并未真正解决。

数据膨胀:新问题的出现

任务虽然能够运行完成,但产生了意外的数据膨胀:

  • MR输出结果:1249.9 GiB

  • Spark3输出结果:1959.2 GiB

  • 膨胀量:700+ GiB

这种程度的数据膨胀在生产环境中是不可接受的,需要深入分析根本原因。

深入分析:定位问题根源

原始sql逻辑

INSERT OVERWRITE TABLE test.tableD PARTITION(DAY=20250906)
SELECT m.device, m.duid, m.systime, m.apppkg, n.app_name AS apppkg_name
FROM (-- 复杂的多层子查询,涉及数据去重和排序
) m
LEFT JOIN (SELECT * FROM test.tableC WHERE DAY=20250908
) n ON m.apppkg = n.apppkg
WHERE size(split(nvl(n.app_name,''),'\u0001')) = 1AND size(split(nvl(m.apppkg,''),'\u0001')) = 1

问题定位

通过分析执行计划,确定核心问题:

  1. 数据倾斜:大表m与维表n进行JOIN时,apppkg字段存在严重的数据倾斜

  2. 热点Key:少数热门应用包Key对应海量数据,导致单个计算节点成为性能瓶颈

首先考虑,如果tableC表不大,可以走广播join,直接将其广播到每个计算节点,彻底避免 Shuffle,但是tableC表10几个GB的大小,显然这个大小的表不能强制广播,否则会拖垮Driver节点。

解决方案:分层优化策略

第一层:解决数据倾斜问题

优化思路:加盐散列(Salting)技术

通过"打散大表,膨胀维表"的策略,将热点Key的计算压力分摊到多个节点。

下面是优化后的sql:

INSERT OVERWRITE TABLE test.tableD PARTITION(DAY=20250906)
SELECT m.device, m.duid, m.systime, m.apppkg, n.app_name AS apppkg_name
FROM (SELECT device, duid, systime, apppkg,cast(rand() * 50 as int) as salt  -- 为左表添加随机盐值FROM (-- 原有复杂子查询逻辑保持不变) aWHERE a.rb < 6
) m
LEFT JOIN (SELECT apppkg, app_name,posexplode(split(space(49), ' ')) as (salt, _)  -- 维表膨胀50倍FROM test.tableCWHERE DAY = 20250908AND size(split(nvl(app_name, ''), '\u0001')) = 1
) n ON m.apppkg = n.apppkg AND m.salt = n.salt  -- 双向盐值JOIN
WHERE size(split(nvl(m.apppkg, ''), '\u0001')) = 1

优化原理

  • 左表加盐:为每条数据添加0-49的随机盐值,分散热点Key

  • 右表膨胀:将维表每条数据复制50份,每份对应特定盐值

  • 盐值JOIN:修改关联条件,同时匹配业务Key和盐值

优化效果

  • 倾斜的Stage执行时间:从1.8小时缩短到11分钟

  • 资源利用率:计算压力均匀分布到多个节点

  • 性能提升:彻底消除单点瓶颈

第二层:解决数据膨胀问题

数据条数相同但体积差异巨大,表明问题出在压缩算法上:

  • Hive默认:ORC + ZLIB压缩

  • Spark3默认:ORC + SNAPPY压缩

两种压缩算法的测试对比:参考https://bbs.huaweicloud.com/blogs/278702#H21

解决方案

修改spark的压缩算法和hive的一致:--conf spark.sql.orc.compression.codec=zlib

最后效果图:

最终效果:全面提升

经过双重优化后,任务表现出色:

  • 性能表现:执行时间大幅缩短,整个任务的执行时间从MR的6.7小时缩短到35分钟。

  • 稳定性:无内存溢出或长尾任务问题,任务可以稳定的运行。

--------

为什么选择涤生大数据?

  • 1.跟随行业专家学习:我们的导师不是传统的讲师,而是实际的行业专家。他们都是来自国内一线大厂的资深开发,大数据技术专家等。

  • 2.跟企业在职开发一起学习:涤生的社招学员目前60%+是企业在职进阶学员,基本各大厂的进阶学员都有,他们的薪资从10k,15k,20k,25k,30k,35k,40k。所以你会跟很多企业在职人员一起交流学习

  • 3.定制化课程设计:结合每位学员的进行定制化教学,学习规划,让你的学习更有重点;结合每个学员的时间规划学习进度,督促考核,让学习变得更加灵活。

  • 4.专业教学和平台:术业有专攻,企业怎么用,面试怎么面,我们就怎么学,涤生让大数据学习不迷惘。目前涤生采购10台服务器,自研提供一站式大数据平台供学习使用,拒绝虚拟机。

  • 5.专业的简历面试辅导:涤生内部所有同学简历面试辅导都包含在内,从学习到入职试用期全流程提供保障服务。2024年截止当前涤生到简历面试7级群的学员就业率98%+,2024年上岸200+同学,60+入职一线中大厂。当然也有不少培训找不到工作的同学,以及裁员的同学,空窗期太久,最终跟着我们搞顺利上岸

  • 6.不错的口碑:在涤生这,只要你不摆烂,我们不抛弃不放弃。目前涤生的学员大概有25%是老学员推荐和转化。

  • 7.专门的校招大数据:校招跟社招不一样。全网独家的校招大数据课程,专门的校招团队辅导,今年是第五届校招大数据,内部校招面试资料覆盖一线中大厂90%的面试。从校招规划+系统的大数据课程+实习面试辅导+简历面试辅导+实习期辅导+试用期辅导,一次收费一条龙全流程贯穿。2024春招+2025年春招累计50+同学拿到一线中大厂offer

http://www.dtcms.com/a/403704.html

相关文章:

  • 成都手机建站网站建设平台赚钱
  • Service :微服务通信、负载、故障难题的解决方案
  • 网站建设有什么理论依据外包公司会抽取多少工资
  • 积加科技音视频一面
  • phpstudy如何搭建网站萝岗微信网站建设
  • Spring Boot 高级特性:从原理到企业级实战​
  • 个人网站用凡科建站好吗wordpress只允许中文评论
  • Qt常用控件之按钮
  • 祝贺网站改版建设教育网站的目的
  • 网站建设验收需要注意什么怎样下载网页上的视频
  • 分布式专题——20 Kafka快速入门
  • SSH公钥私钥!进阶!SSH与Git!
  • 网站必须兼容哪些浏览器中核正式员工年收入
  • 珠海网站品牌设计公司简介网络新闻专题做的最好的网站
  • keepalived服务器
  • AI写的超级好用的课堂互动系统
  • 山东建设机械协会网站课程网站建设的设计报告
  • 第四部分:Netty核心源码解析(下)
  • 攻克 大 Excel 上传难题:从异步处理到并发去重的全链路解决方案
  • 【双光相机配准】红外相机与可见光相机配准方案
  • 中国建设银行网站个人客户wordpress 主题显示
  • 开源超级终端PuTTY改进之:增加点对点网络协议IocHub,实现跨网段远程登录
  • 帮别人做网站如何备案wordpress video plugin
  • 118. 杨辉三角(dp)
  • 济宁网站开发招聘威海建设集团官方网站
  • 【QT】QPainter的使用
  • 北京代理网站备案成都市建设工程交易中心网站
  • PyTorch 数据处理工具箱与可视化工具
  • python的高阶函数
  • Python请求示例JD商品评论API接口,json数据返回