# Yarn shuffle OOM错误分析及解决是怎样的
## 引言
在大规模数据处理场景中,Apache Spark、Hadoop等分布式计算框架依赖Yarn进行资源调度。Shuffle阶段作为分布式计算的核心环节,经常因数据倾斜、资源配置不当等问题引发OOM(Out Of Memory)错误。本文将深入分析Yarn shuffle OOM的成因,并提供系统化的解决方案。
---
## 一、Yarn Shuffle机制概述
### 1.1 Shuffle过程解析
Shuffle是MapReduce/Spark中连接map和reduce任务的桥梁,主要分为以下阶段:
- **Map端**:数据分区、排序、溢写磁盘
- **Transfer**:通过HTTP协议跨节点传输数据
- **Reduce端**:拉取数据、合并、排序
```java
// 伪代码示例:Shuffle数据流转
mapOutput -> partition -> spill to disk -> fetch by reducers
Yarn通过以下组件协调资源: - ResourceManager:全局资源调度 - NodeManager:节点资源监控 - ApplicationMaster:任务生命周期管理
错误类型 | 发生阶段 | 典型报错信息 |
---|---|---|
Container内存溢出 | Map/Reduce任务 | Container killed by YARN |
Executor内存溢出 | Spark任务 | ExecutorLostFailure |
Direct Memory溢出 | Netty传输层 | OutOfDirectMemoryError |
user_id=0
的记录占比60%# 错误配置示例(实际内存 < 需求内存)
spark.executor.memory=4G
yarn.nodemanager.resource.memory-mb=8G
spark.shuffle.compress=false
(未启用压缩)mapreduce.task.io.sort.mb=1024
(排序内存过大)# 添加随机前缀解决Join倾斜
df = df.withColumn("salt", floor(rand() * 10))
-- Spark SQL参数
SET spark.sql.adaptive.enabled=true;
SET spark.sql.adaptive.coalescePartitions.enabled=true;
<!-- yarn-site.xml -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>物理内存的80%</value>
</property>
参数名 | 推荐值 | 说明 |
---|---|---|
spark.executor.memoryOverhead | executor内存的10% | 堆外内存缓冲区 |
spark.memory.fraction | 0.6 | 统一内存管理比例 |
sparkConf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
# 使用Netty替代默认传输
spark.shuffle.manager=sort
spark.shuffle.service.enabled=true
Shuffle Bytes Written/Read
GC Time/Count
Executor/Container Memory Used
# prometheus.yml 片段
scrape_configs:
- job_name: 'spark'
metrics_path: '/metrics'
现象:每日凌晨ETL任务频繁OOM
根因:
- 黑名单用户关联产生200:1的数据倾斜
- spark.sql.shuffle.partitions=200
(默认值)
解决方案:
1. 对黑名单用户预分桶
2. 调整分区数:
SET spark.sql.shuffle.partitions=2000;
效果:任务耗时从3.2h降至47min
解决Yarn shuffle OOM需要从数据分布、资源配置、参数调优等多维度系统化分析。随着Spark 3.0+的AQE、动态分区等特性成熟,结合硬件升级和架构优化,可显著提升作业稳定性。建议建立持续的性能基准测试体系,实现资源配置的弹性化管理。
最佳实践清单:
1. 始终监控Shuffle溢出文件数量
2. 生产环境必须设置memoryOverhead
3. 数据倾斜处理应作为ETL设计规范 “`
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/zyqjustin/blog/500226