网易首页 > 网易号 > 正文 申请入驻

本想靠扩集群提速,结果发现洗牌和倾斜才是性能杀手

0
分享至

一个用惯Spark的数据工程师在Databricks上跑批处理,发现join和聚合越来越慢。第一反应是加worker、扩内存,结果却发现时间几乎没缩短,花钱翻倍,效果为零。真正的问题不在集群大小,而在作业内部的洗牌(shuffle)和数据倾斜,加多少节点都治不好那个被单键严重拉偏的分区。

这篇文章会拆开一整套真实的零售订单聚合流水线,从原始事件读入、维度表关联、分组聚合,一直写到落盘成Delta Lake表,然后一步一步把shuffle阶段长什么样子、广播join为什么能救命、倾斜如何在groupBy里放大、Z‑Ordering又怎样让读性能翻盘等环节说清楚。所有表都注册在Unity Catalog下,权限与血缘集中管理,不需要在各workspace间来回拷贝授权。


流水线形态很简单:一批JSON or Parquet订单事件,读进DataFrame,跟一张小产品维度表做左连接,按customer_idcategory分组,算出总消费额和订单数,最终写回Delta格式的表。建表语句在Databricks SQL里就能执行,目录和schema先建好,两张表都指定了Delta存储位置:retail_analytics.events.raw_ordersretail_analytics.events.dim_products,并对分析师组授予SELECT权限。Unity Catalog让整个平台共享的权限模型代替了以前按workspace单独赋权的碎片模式,后续任何一个作业或BI工具只要引用相同的三级命名空间,权限就天然一致。

很多人看到shuffle这个词就只想到“数据会跨节点移动”,但对它在Spark里到底长什么样缺乏直观画面。一条作业被划分成若干阶段,每个阶段末尾如果遇到宽依赖(wide dependency)——比如join、groupByKey、repartition——就会触发全量数据重新分区,所有上游的分区输出被按key哈希后发给下游的reducer。在这个零售流水线里,发生宽依赖的地方正是groupBy("customer_id", "category")。Spark必须确保同一个customer_id和category组合的所有订单记录都落在同一个reducer上,才能算出正确的sum和count。

shuffle的代价远不止网络传输。每个map task会把中间结果序列化写入本地磁盘,等reduce端拉取。如果某个key对应的行数巨大——比如有一个测试账号人工刷了大量订单,或者一个B2B大企业客户的采购量占了全量数据的30%——那它所在的分区就会变成一场灾难:分配到这个分区的reducer需要读取、排序、合并远超同伴的数据量,其他任务几秒钟完成,这一个任务却要跑十几分钟。这种情况下,集群规模越大反而越暴露短板,因为更多executor空等,只有少数几个任务在苦苦挣扎。这个现象就是数据倾斜。

要消解shuffle带来的负担,第一步是审视是否根本不需要shuffle。订单表与产品维度表的join,若产品表体积很小,完全不需要让两张表都经历分区重洗。Spark自带基于成本的优化器会自动将小表广播到每个executor的内存中,但阈值默认只有10MB——当维度表悄悄涨过这条线时,自动广播就消失了,突然变成全表shuffle,作业时间可能暴涨数倍。因此,在代码里显式写上F.broadcast(products)是更稳妥的做法:不管表多大、阈值设成什么,join阶段都强制将产品表复制一份到每个节点,然后直接在内存中完成连接,避免多余的shuffle。

广播join能去掉的是join侧的shuffle,但groupBy带来的shuffle依然存在。在这个聚合里,倾斜通常发生在customer_id上,特别是测试号或大客户。解决思路不是用更多的节点硬顶,而是打散倾斜的key——可以在倾斜的key后面加一个随机后缀,让一个key变成多个key,落到不同reducer上并行处理,聚合后再把后缀去掉做最终汇总。这个策略被称作“加盐”(salting),本质上是用可控的小量数据冗余换来均匀分布的负载。Spark 3以后对倾斜join有自适应查询优化,但在自定义聚合里,手动加盐仍是最直接的手段。

数据一旦写完Delta Lake,性能优化可以延续到文件布局层面。Delta表底层由大量Parquet文件组成,查询过滤某个category或customer_id时,如果这些数据离散分布在成百上千个文件里,即使有分区裁剪也需要扫描大量无关数据。Z‑Ordering把多个列编织成一个多维索引,让同一列的值在物理存储上尽量靠近,查询时就能大幅降低需要读取的文件数量。在零售订单表中,对频繁过滤的customer_idcategory执行Z‑Ordering,意味着对应相同客户的订单记录被压缩到少数几个文件内,点查和范围扫描的延迟都会下降明显。

写回Delta表时,因为整个流已跑在Unity Catalog下,表的元数据、权限和血缘自动登记,不会出现“这张表是从哪个作业产出的”之类的困惑。任何后续读取直接用spark.table("retail_analytics.events.agg_customer_spend")即可,不必关心物理路径或临时视图。这一点在团队协作里比想象中重要得多:数据工程师建好流,分析师直接在SQL工具里查询,权限校验在Catalog层统一完成,不会因为换了workspace就突然读不到数据。

整个优化链条明确:先确认维度表是否可广播,解除join侧的shuffle;再检查聚合阶段是否因少数key倾斜导致任务长尾,必要时加盐处理;最后在存储层用Z‑Ordering压缩读取成本。这三个动作带来的提升往往远超简单地堆叠资源。当资源预算有限、业务时效却越来越紧时,把力气花在shuffle和倾斜上,比盯着集群节点数更有用。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
突发!英伟达一员工被拘留!涉嫌走私 B300

突发!英伟达一员工被拘留!涉嫌走私 B300

云头条
2026-07-28 14:06:48
距离8月1日越来越近!欠网贷的朋友,这几件事一定要提前安排

距离8月1日越来越近!欠网贷的朋友,这几件事一定要提前安排

侃故事的阿庆
2026-07-28 03:52:56
0时0分准时生效,特朗普宣布掀牌,中美谈崩了?中方官员已回国

0时0分准时生效,特朗普宣布掀牌,中美谈崩了?中方官员已回国

潘鍵旅行浪子
2026-07-28 16:39:23
欧盟罚阿里42.5亿,中国深夜回击,这次为何不忍了?

欧盟罚阿里42.5亿,中国深夜回击,这次为何不忍了?

李云飞Afey
2026-07-26 12:42:17
皇马天才铁卫转会市场无人问津,2000万欧都没人要,都不想做冤大头

皇马天才铁卫转会市场无人问津,2000万欧都没人要,都不想做冤大头

零度眼看球
2026-07-28 08:36:26
北大数学院王虹毕业合照曝光!网友:80多人,3级优秀毕业生,她是最低那个等级

北大数学院王虹毕业合照曝光!网友:80多人,3级优秀毕业生,她是最低那个等级

火山詩话
2026-07-28 16:30:12
烂番茄96%,Netflix这部硬核新剧又爆了

烂番茄96%,Netflix这部硬核新剧又爆了

天天美剧吧
2026-07-28 17:30:32
武汉大学口腔医院通报“24岁女孩正颌手术被做反”:当事医生已停诊,已成立专项调查组开展核查,将及时整改,并依法依规追责问责

武汉大学口腔医院通报“24岁女孩正颌手术被做反”:当事医生已停诊,已成立专项调查组开展核查,将及时整改,并依法依规追责问责

蓬勃新闻
2026-07-28 12:43:11
昨日肉签,今天30CM跌停

昨日肉签,今天30CM跌停

格隆汇
2026-07-28 15:35:24
黄磊9岁小儿子近期的正脸曝光,网友:黄磊小儿子长得好像黄磊

黄磊9岁小儿子近期的正脸曝光,网友:黄磊小儿子长得好像黄磊

韩小娱
2026-07-28 15:53:36
比菲律宾更危险?在中国教训菲律宾的时候,越南已经填了21个岛礁

比菲律宾更危险?在中国教训菲律宾的时候,越南已经填了21个岛礁

混沌录
2026-07-28 19:54:16
马斯克有句话点醒过我“如果今天我破产了,绝对不会去找工作,而是去做一件能快速产生现金流,并且可以复制放大的事。”

马斯克有句话点醒过我“如果今天我破产了,绝对不会去找工作,而是去做一件能快速产生现金流,并且可以复制放大的事。”

LULU生活家
2026-07-07 20:59:47
武汉大学口腔医院:当事医生已停诊配合调查

武汉大学口腔医院:当事医生已停诊配合调查

南方都市报
2026-07-28 13:17:51
我们村一个老实人打麻将输了8000块,没钱给,女麻友看他老实,硬性要求:要么立刻付清,要么这几天给我干活抵债

我们村一个老实人打麻将输了8000块,没钱给,女麻友看他老实,硬性要求:要么立刻付清,要么这几天给我干活抵债

球场指挥家
2026-07-28 09:59:12
LV一条道走到黑,回应在中国打官司,再现狂傲言论,被抵制急眼了

LV一条道走到黑,回应在中国打官司,再现狂傲言论,被抵制急眼了

寒士之言本尊
2026-07-28 15:28:14
国民党不抗日,南京不战而降?传播此类谣言良知何在?

国民党不抗日,南京不战而降?传播此类谣言良知何在?

涛哥锐评
2026-07-23 07:40:07
即将“称王”?“白海豚”成“超强台风”无悬念!最终归宿难定居

即将“称王”?“白海豚”成“超强台风”无悬念!最终归宿难定居

声情专递
2026-07-28 16:50:40
汪小菲抱5个月儿子外出散步,正脸被曝光,软软萌萌,胖乎乎的

汪小菲抱5个月儿子外出散步,正脸被曝光,软软萌萌,胖乎乎的

空樽对月花独瘦
2026-07-27 13:33:25
79岁中国文人易中天,深情告白、热泪悼念68岁日本作家东野圭吾,被网友怒斥:随他去吧!

79岁中国文人易中天,深情告白、热泪悼念68岁日本作家东野圭吾,被网友怒斥:随他去吧!

谭谈社会
2026-07-28 16:34:32
盒马鲜生北京8月集中闭店

盒马鲜生北京8月集中闭店

商业观察家
2026-07-28 00:09:47
2026-07-29 01:20:49
碳基打工人
碳基打工人
坐标北京,靠咖啡续命,靠小红书下饭的普通人类。
396文章数 63关注度
往期回顾 全部

科技要闻

Kimi K3开放权重,想本地部署,200万元起

头条要闻

博主"听泉赏宝"炒股亏光父母积蓄遭拉黑 称"再玩剁手"

头条要闻

博主"听泉赏宝"炒股亏光父母积蓄遭拉黑 称"再玩剁手"

体育要闻

35岁德甲球星,退役半年后成了一名农民

娱乐要闻

43岁演员王凯去世!独居公寓无人知晓

财经要闻

潘老板的算盘全砸了,欠的25亿跑不了了

汽车要闻

宾利托卡尔重塑百年菱形美学,将于9月全球首秀

态度原创

房产
健康
亲子
时尚
军事航空

房产要闻

拿下百亩宅地!又一河北民企,重仓海南!

中风急救吃安宫牛黄丸?千万别乱喂

亲子要闻

几年级能看出孩子是不是读书的料

夏天衣服买太多也是浪费,准备这几件露肩裙,显瘦优雅又提气质

军事要闻

特朗普:若谈判破裂将强力打击伊朗

无障碍浏览 进入关怀版