YARN架构解析与Hadoop资源调度优化实践
1. YARN:Hadoop生态系统的资源调度核心
第一次接触YARN是在2015年处理一个电商平台日志分析项目时。当时我们的Hadoop集群经常出现资源争抢问题,MapReduce任务和Hive查询互相阻塞,直到引入YARN后才真正实现了资源的统一管理和高效利用。作为Hadoop 2.0引入的关键组件,YARN(Yet Another Resource Negotiator)从根本上解决了早期Hadoop版本中资源管理粗放的问题。
YARN的核心价值在于将资源管理和作业调度/监控功能分离,形成了全局的ResourceManager(RM)和针对每个应用的ApplicationMaster(AM)。这种架构使得YARN能够支持多种计算框架(MapReduce、Spark、Flink等)在同一个集群上运行,共享底层资源。根据我的实测数据,在相同硬件条件下,使用YARN调度比直接使用Hadoop 1.x的调度方式可提升集群利用率30-45%。
2. YARN架构深度解析
2.1 核心组件协作机制
YARN采用主从架构设计,主要包含三个核心组件:
ResourceManager(RM):全局资源管理者,包含两个关键子组件:
- Scheduler:纯调度器,只负责分配资源,不监控应用状态
- ApplicationsManager:负责接受作业提交、协商第一个容器(用于AM)和重启失败的AM
NodeManager(NM):每个节点上的代理,负责:
- 容器生命周期管理
- 监控资源使用(CPU、内存等)
- 向RM汇报健康状况
ApplicationMaster(AM):每个应用特有的实例,负责:
- 向RM协商资源
- 与NM协作执行/监控任务
- 容错处理(失败任务重试)
关键点:AM的设计是YARN支持多计算框架的关键。例如Spark on YARN和Flink on YARN都有各自的AM实现。
2.2 资源请求模型
YARN采用"资源请求-分配"模型,主要参数包括:
| 参数 | 说明 | 典型值 |
|---|---|---|
| 虚拟CPU核数 | 1-16 | |
| 内存(MB) | 1024-8192 | |
| 优先级 | 0-20 | |
| <relax_locality> | 是否放松本地性 | true/false |
资源请求示例(通过REST API):
curl -X POST "http://rm-address:8088/ws/v1/cluster/apps" \ -H "Content-Type: application/json" \ -d '{ "am-container-spec": { "commands": { "command": "{{AM_COMMAND}}" }, "resource": { "memory": 2048, "vCores": 2 } }, "application-type": "SPARK", "application-name": "MySparkJob" }'3. 生产环境配置实战
3.1 关键参数调优
在/etc/hadoop/yarn-site.xml中需要特别关注的配置项:
<!-- 单个容器可申请的最大内存 --> <property> <name>yarn.scheduler.maximum-allocation-mb</name> <value>16384</value> </property> <!-- 单个容器可申请的最小内存 --> <property> <name>yarn.scheduler.minimum-allocation-mb</name> <value>1024</value> </property> <!-- NM可分配的物理内存比例 --> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>24576</value> <!-- 24GB --> </property> <!-- 虚拟CPU与物理CPU的比率 --> <property> <name>yarn.nodemanager.resource.cpu-vcores</name> <value>16</value> </property>经验法则:实际配置时应预留20%的系统资源给OS和其他服务。例如64GB内存的机器,建议配置不超过51GB给YARN。
3.2 多租户资源隔离
通过YARN Queue实现多团队/项目资源共享:
- 创建capacity-scheduler.xml:
<configuration> <property> <name>yarn.scheduler.capacity.root.queues</name> <value>dev,prod,research</value> </property> <property> <name>yarn.scheduler.capacity.root.dev.capacity</name> <value>30</value> </property> <property> <name>yarn.scheduler.capacity.root.prod.capacity</name> <value>50</value> </property> <property> <name>yarn.scheduler.capacity.root.research.capacity</name> <value>20</value> </property> </configuration>- 提交作业时指定队列:
spark-submit --queue prod ...4. 常见问题排查指南
4.1 资源不足错误
现象:AM或任务容器无法启动,日志显示"AM container is exited with exitCode: -104"
排查步骤:
- 检查NM日志:
grep -A 10 "Container killed" /var/log/hadoop-yarn/nodemanager/*.log - 常见原因:
- 内存超限:调整
yarn.app.mapreduce.am.resource.mb - 虚拟内存检查过严:设置
yarn.nodemanager.vmem-check-enabled=false
- 内存超限:调整
4.2 AM频繁重启
现象:RM日志显示"ApplicationMaster failed, attempt x of y"
解决方案:
- 增加AM重试次数:
<property> <name>yarn.resourcemanager.am.max-attempts</name> <value>5</value> </property> - 检查AM心跳超时设置:
<property> <name>yarn.am.liveness-monitor.expiry-interval-ms</name> <value>600000</value> </property>
5. 与其他技术的集成实践
5.1 Flink on YARN部署
以Application模式为例的完整部署流程:
- 准备Flink包:
wget https://archive.apache.org/dist/flink/flink-1.15.0/flink-1.15.0-bin-scala_2.12.tgz tar -xzf flink-*.tgz- 提交作业:
./bin/flink run-application -t yarn-application \ -Djobmanager.memory.process.size=2048m \ -Dtaskmanager.memory.process.size=4096m \ -Dtaskmanager.numberOfTaskSlots=2 \ -c org.example.MyJob \ ./examples/MyJob.jar5.2 Docker容器支持
YARN 3.1+支持Docker容器化任务:
- 配置NM启用Docker:
<property> <name>yarn.nodemanager.container-executor.class</name> <value>org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor</value> </property> <property> <name>yarn.nodemanager.linux-container-executor.resources-handler.class</name> <value>org.apache.hadoop.yarn.server.nodemanager.util.CgroupsLCEResourcesHandler</value> </property>- 提交Docker应用:
curl -X POST "http://rm:8088/ws/v1/cluster/apps" \ -H "Content-Type: application/json" \ -d '{ "container-spec": { "image": "my-docker-image:latest", "commands": ["/opt/app/start.sh"] }, "resource": { "memory": 4096, "vCores": 2 } }'6. 性能监控与优化
6.1 关键监控指标
通过YARN的Metrics API获取核心指标:
# 集群总体利用率 curl http://rm:8088/ws/v1/cluster/metrics # 单个应用详情 curl http://rm:8088/ws/v1/cluster/apps/application_123456789_0001推荐监控的黄金指标:
- 集群资源利用率(CPU/Memory)
- 待处理应用数
- 容器启动延迟
- AM存活时间
6.2 调度算法选择
YARN支持三种调度器,选择依据:
| 调度器 | 特点 | 适用场景 |
|---|---|---|
| FIFO | 简单,但资源利用率低 | 测试环境 |
| Capacity | 预分配队列,保证最小资源 | 多租户生产环境 |
| Fair | 动态平衡资源分配 | 突发负载场景 |
配置示例(启用Fair Scheduler):
<property> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value> </property>在最近的一个金融风控项目中,我们将调度器从Capacity改为Fair后,短作业的平均完成时间缩短了40%,特别是对分析师临时提交的即席查询作业效果显著。