Hadoop YARN 详解
一、YARN 架构解析
1.1 核心设计理念
YARN (Yet Another Resource Negotiator) 是 Hadoop 2.0 引入的资源管理平台,解决了 Hadoop 1.0 的以下问题:
- JobTracker 单点故障问题
- 资源利用率低(Map/Reduce 插槽固定分配)
- 仅支持 MapReduce 计算模型
1.2 架构组成
核心组件:
组件 | 角色 | 关键功能 |
---|
ResourceManager (RM) | 集群资源总管 | 全局资源调度、应用管理 |
NodeManager (NM) | 节点代理 | 管理单节点资源、启动容器 |
ApplicationMaster (AM) | 应用管家 | 任务调度、容错管理 |
Container | 资源抽象 | 封装 CPU+内存+环境 |
二、ResourceManager 详解
2.1 核心功能模块
2.2 调度器类型
调度器 | 特点 | 适用场景 |
---|
FIFO Scheduler | 先进先出 | 测试环境 |
Capacity Scheduler | 队列资源隔离 | 多租户生产环境 (默认) |
Fair Scheduler | 公平分配资源 | 混合负载环境 |
2.3 高可用实现
三、NodeManager 工作机制
3.1 核心功能
3.2 关键配置参数
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>16384</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>8</value>
</property>
四、ApplicationMaster 深度解析
4.1 AM 生命周期
4.2 AM 类型示例
计算框架 | AM 实现 | 特点 |
---|
MapReduce | MRAppMaster | 支持Map/Reduce任务 |
Spark | SparkAppMaster | DAG任务调度 |
Flink | FlinkJobManager | 流处理优化 |
五、YARN 工作流程详解
5.1 应用提交完整流程
5.2 资源申请模型
Resource capability = Resource.newInstance(2048, 2);
ContainerRequest request = new ContainerRequest(
capability, null, null, Priority.newInstance(1));
amRMClient.addContainerRequest(request);
六、YARN 高级特性
6.1 资源调度优化
技术 | 描述 | 优势 |
---|
节点标签 | 节点分组标记 | 精细化资源分配 |
资源抢占 | 回收超额资源 | 保证高优先级任务 |
计划调度 | 预约资源 | 满足SLA要求 |
6.2 容器增强特性
6.3 日志聚合机制
七、YARN 命令与监控
7.1 常用命令
yarn jar <jar_path> <main_class> [args]
yarn application -list
yarn logs -applicationId <app_id>
yarn application -kill <app_id>
yarn node -list -all
7.2 监控指标
指标类型 | 关键指标 | 监控工具 |
---|
集群资源 | 总内存/CPU使用率 | Grafana + Prometheus |
应用状态 | 运行/等待应用数 | YARN ResourceManager UI |
节点健康 | 心跳丢失节点 | Ambari / Cloudera Manager |
八、配置优化指南
8.1 内存配置公式
最大容器内存 = min (yarn.scheduler.maximum-allocation-mb,
yarn.nodemanager.resource.memory-mb)
推荐容器大小 = 集群内存总量 / 并发容器数
8.2 核心配置参数
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1024</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>8192</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
九、故障排查与调试
9.1 常见问题排查
问题现象 | 排查方向 | 解决措施 |
---|
应用卡在ACCEPTED | 资源不足 | 增加资源或调整队列 |
AM频繁重启 | AM资源不足 | 增大AM容器资源 |
容器启动失败 | 端口冲突 | 检查yarn.nodemanager.local-dirs |
节点状态异常 | 健康检查失败 | 查看NM日志 |
9.2 调试技巧
export YARN_ROOT_LOGGER=DEBUG,console
yarn container -signal <container_id> -output_thread_dump
十、YARN 应用场景
10.1 多计算框架支持
10.2 典型应用模式
模式 | 描述 | 案例 |
---|
批处理 | 小时/天级任务 | 日志分析 |
交互查询 | 亚秒级响应 | Hive LLAP |
流处理 | 持续数据处理 | Flink实时风控 |
机器学习 | 迭代计算 | TensorFlow分布式训练 |
十一、最佳实践总结
-
队列规划:按业务划分资源队列,使用Capacity Scheduler
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>prod,dev,test</value>
</property>
-
资源隔离:启用Linux容器执行器
<property>
<name>yarn.nodemanager.container-executor.class</name>
<value>org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor</value>
</property>
-
监控告警:设置关键指标阈值
- 集群资源利用率 > 85%
- 待处理应用 > 10
- 节点不可用率 > 5%
-
滚动升级:使用YARN REST API平滑升级
yarn rmadmin -transitionToActive --forcemanual rm2
性能优化箴言:
“YARN配置的艺术在于平衡 - 容器大小要足够大以减少开销,又要足够小以实现并行最大化。”
推荐容器大小:内存4-8GB,vcores 2-4个,根据实际负载微调。