#9 大数据计算 困难

Spark 作业里 Shuffle 是什么?常见 OOM / 数据倾斜怎么处理?

SparkShuffle倾斜

🎯 考察意图

大数据岗位常考。考察对分布式执行代价的理解,以及线上排障经验。

📐 回答框架

  1. 定义 Shuffle:跨节点按键重新分区交换数据。
  2. 为何贵:磁盘/网络/序列化,易成瓶颈。
  3. 倾斜表现:少数 task 极慢或 OOM。
  4. 治理:预处理、加盐、两阶段聚合、广播小表等。

💬 参考答案(口述版)

Shuffle 是宽依赖触发的数据重分布:按新的分区键把记录从 map 端拉到 reduce 端。join、groupBy、repartition 都可能触发。

它贵,因为涉及序列化、网络传输、磁盘落盘与大量内存缓冲,常是阶段耗时大头。

数据倾斜:某些 key 数据量远大于其他,导致个别 task 处理巨量数据 → 长尾或 OOM。

常见手段:
1. 先确认:看 stage 的 task 耗时分布、关键大小
2. 业务侧过滤无效热点 key / 预处理打散
3. 加盐:热点 key 加随机前缀再聚合,再去盐二次聚合
4. 两阶段聚合:先局部聚合再全局
5. join:小表广播(map-side join)避免大 shuffle;大表对大表考虑分桶/倾斜 join 策略
6. 内存:增大 executor memory、合理 partition 数、避免无必要 cache 大对象

回答要强调「先定位再优化」,不要一上来盲目加资源。

🔍 关键词

宽依赖倾斜加盐广播 Join两阶段聚合

💭 面试官可能的追问

追问 1:partition 是不是越多越好?

不是。太少并行不够、单分区过大;太多调度与小文件开销上升。通常按数据量与核数估算,再按实测调。

⚠️ 常见踩坑

  • 把 driver OOM 和 executor OOM 混为一谈
  • 忽略小文件问题,只追执行速度

🧠 记忆锚点

Shuffle 是分布式的税;倾斜是税里的尖刺,先定位热点 key。