5.5 YARN 资源管理与调度


文档摘要

YARN 资源管理与调度:架构原理、调度策略与生产实践 核心摘要:YARN(Yet Another Resource Negotiator)是 Hadoop 3.x 及现代大数据平台的核心资源管理层,承担集群资源统一调度、多框架共存支撑与细粒度资源隔离三大关键职能。本文系统解析 ResourceManager 与 NodeManager 协同机制、CapacityScheduler/FairScheduler/FIFO 三大调度器的选型依据与生产级配置、动态资源申请实践、实时监控体系及性能调优方法论,助力构建高可用、高吞吐、可审计的企业级资源调度平台。 YARN 架构设计与核心组件 YARN 采用主从(Master-Slave)分层架构,解耦资源管理与应用执行,实现计算框架无关性。

YARN 资源管理与调度:架构原理、调度策略与生产实践

核心摘要:YARN(Yet Another Resource Negotiator)是 Hadoop 3.x 及现代大数据平台的核心资源管理层,承担集群资源统一调度、多框架共存支撑与细粒度资源隔离三大关键职能。本文系统解析 ResourceManager 与 NodeManager 协同机制、CapacityScheduler/FairScheduler/FIFO 三大调度器的选型依据与生产级配置、动态资源申请实践、实时监控体系及性能调优方法论,助力构建高可用、高吞吐、可审计的企业级资源调度平台。

1. YARN 架构设计与核心组件

YARN 采用主从(Master-Slave)分层架构,解耦资源管理与应用执行,实现计算框架无关性。其设计目标是支持 MapReduce、Spark、Flink、Presto 等异构计算引擎在统一资源池中协同运行。

1.1 核心角色与职责

组件 角色 关键职责 高可用保障
ResourceManager(RM) 全局资源调度中枢 统一管理集群资源总量;接收应用提交请求;通过 Scheduler 分配 Container;通过 ApplicationManager 管理应用生命周期 支持基于 ZooKeeper 的 Active/Standby 自动故障转移(HA 模式)
NodeManager(NM) 节点级资源执行代理 启动、监控、回收 Container 进程;周期性向 RM 上报节点资源使用(内存/CPU/磁盘/网络)与健康状态;执行容器日志聚合 支持动态节点上下线与资源热更新(无需重启)
ApplicationMaster(AM) 应用专属协调器 每个应用(如一个 Spark 作业)独占一个 AM;向 RM 申请资源;与 NM 协作启动任务容器;监控任务执行状态并容错重试 AM 容器自身受 RM 调度保护,支持失败后自动重启

关键演进:YARN 3.x 引入 Timeline Service v2YARN Service Framework,强化应用生命周期管理与服务化部署能力;YARN Native Services 支持直接部署微服务容器(如 Spring Boot),突破传统批处理边界。

2. 资源模型与分配机制

YARN 将物理资源抽象为可调度的 Container,每个 Container 封装独立的内存、CPU、磁盘与网络配额,实现强隔离。

2.1 资源维度定义

资源类型 配置参数 默认单位 生产建议
内存(Memory) yarn.nodemanager.resource.memory-mb MB 建议设为节点物理内存的 75%–85%,预留系统开销
CPU(vCores) yarn.nodemanager.resource.cpu-vcores 逻辑核数 建议与物理核心数一致,避免超售引发争抢
容器最小/最大规格 yarn.scheduler.minimum-allocation-mb
yarn.scheduler.maximum-allocation-mb
MB 最小值 ≥ 1024,最大值 ≤ 节点总内存 × 0.9
CPU 隔离 yarn.nodemanager.resource.percentage-physical-cpu-limit 百分比 启用 cgroups 时推荐设为 100,禁用则设为 0

2.2 资源分配流程

  1. 应用提交:客户端向 RM 提交 Application Submission Context,包含 AM 所需资源规格;
  2. AM 启动:RM 分配首个 Container 启动 AM;
  3. 资源协商:AM 向 RM 发送 ResourceRequest,声明所需 Container 数量、内存/CPU 规格、优先级及节点/机架偏好;
  4. 调度决策:Scheduler 根据策略(队列容量、公平份额、FIFO 顺序)匹配可用资源;
  5. 容器分配:RM 向对应 NM 下发 ContainerLaunchContext,NM 启动沙箱化容器;
  6. 心跳同步:NM 每秒向 RM 上报资源使用快照,RM 实时更新全局视图。

3. 调度器深度解析与配置实践

YARN 内置三大调度器,适用于不同业务场景与治理需求。

3.1 CapacityScheduler:多租户资源硬隔离

适用场景:企业级多部门共享集群,需严格保障各业务线资源配额与 SLA。

核心特性

  • 队列层级化(root → dept → team),支持父子队列资源继承与弹性借用;
  • 队列容量(capacity)与最大容量(maximum-capacity)双约束;
  • 用户/应用并发数限制(user-limit-factor, maximum-applications);
  • 基于权重的弹性资源借用(enable-user-metrics, user-limit-factor)。

生产级 capacity-scheduler.xml 配置示例

<configuration> <!-- 启用队列层级与弹性借用 --> <property> <name>yarn.scheduler.capacity.root.queues</name> <value>default,finance,marketing,ml-platform</value> </property> <!-- finance 队列:保障型业务,禁止弹性借用 --> <property> <name>yarn.scheduler.capacity.root.finance.capacity</name> <value>35</value> </property> <property> <name>yarn.scheduler.capacity.root.finance.maximum-capacity</name> <value>35</value> </property> <property> <name>yarn.scheduler.capacity.root.finance.user-limit-factor</name> <value>1</value> </property> <!-- ml-platform 队列:弹性计算,允许借用空闲资源 --> <property> <name>yarn.scheduler.capacity.root.ml-platform.capacity</name> <value>25</value> </property> <property> <name>yarn.scheduler.capacity.root.ml-platform.maximum-capacity</name> <value>70</value> </property> <property> <name>yarn.scheduler.capacity.root.ml-platform.user-limit-factor</name> <value>2</value> </property> <!-- 启用队列 ACL 控制 --> <property> <name>yarn.scheduler.capacity.root.finance.acl_submit_applications</name> <value>finance-team,admin</value> </property> <property> <name>yarn.scheduler.capacity.root.finance.acl_administer_queue</name> <value>finance-admin,admin</value> </property> </configuration>

运维提示:队列配置变更后需执行 yarn rmadmin -refreshQueues 生效,无需重启 RM。

3.2 FairScheduler:动态公平资源调度

适用场景:研究型集群、敏捷开发环境,强调作业响应速度与资源利用率均衡。

核心特性

  • 每个作业获得“公平份额”(Fair Share),资源按需动态调整;
  • 支持最小资源保障(minResources)与最大资源上限(maxResources);
  • 支持权重(weight)调节队列优先级;
  • 支持抢占(Preemption)机制,强制回收超额资源。

生产级 fairscheduler.xml 配置示例

<allocations> <!-- 默认队列:基础服务,保障最小资源 --> <queue name="default"> <minResources>2048mb,2vcores</minResources> <maxResources>8192mb,8vcores</maxResources> <weight>1.0</weight> </queue> <!-- high-priority 队列:实时作业,高权重与抢占优先级 --> <queue name="high-priority"> <minResources>4096mb,4vcores</minResources> <maxResources>16384mb,16vcores</maxResources> <weight>3.0</weight> <preemptable>true</preemptable> </queue> <!-- low-priority 队列:离线训练,允许被抢占 --> <queue name="low-priority"> <minResources>1024mb,1vcore</minResources> <maxResources>4096mb,4vcores</maxResources> <weight>0.5</weight> <preemptable>true</preemptable> </queue> <!-- 启用抢占(需在 yarn-site.xml 中设置 yarn.scheduler.fair.preemption=true) --> <fairSharePreemptionThreshold>0.8</fairSharePreemptionThreshold> <fairSharePreemptionInterval>30000</fairSharePreemptionInterval> </allocations>

关键参数fairSharePreemptionThreshold 表示当队列资源低于公平份额的 80% 时触发抢占;fairSharePreemptionInterval 控制抢占检查间隔(毫秒)。

3.3 FIFO Scheduler:极简队列模型

适用场景:单用户测试集群、CI/CD 流水线等轻量级场景,不推荐生产环境使用。

配置要点

  • 仅存在单一 default 队列;
  • 作业严格按提交时间排序;
  • 无资源配额与优先级控制,易导致长作业阻塞短作业。
<configuration> <!-- 指定调度器类 --> <property> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fifo.FifoScheduler</value> </property> <!-- 设置 default 队列最大资源 --> <property> <name>yarn.scheduler.fifo.maximum-allocation-mb</name> <value>8192</value> </property> </configuration>

4. YARN 应用开发与动态资源管理

4.1 标准应用提交流程(Java API)

Configuration conf = new Configuration(); // 指定 YARN 框架与 ResourceManager 地址 conf.set("mapreduce.framework.name", "yarn"); conf.set("yarn.resourcemanager.address", "rm-ha-nn1:8032"); conf.set("yarn.resourcemanager.scheduler.address", "rm-ha-nn1:8030"); // 构建作业实例 Job job = Job.getInstance(conf, "ETL-Job-Q4-2024"); job.setJarByClass(ETLDriver.class); // 设置 Mapper/Reducer 类与输出类型 job.setMapperClass(ETLMapper.class); job.setReducerClass(ETLReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(LongWritable.class); // 配置输入输出路径(支持 HDFS/S3/OSS) FileInputFormat.addInputPath(job, new Path("hdfs://nameservice1/data/raw/2024/Q4")); FileOutputFormat.setOutputPath(job, new Path("hdfs://nameservice1/data/processed/2024/Q4")); // 启动作业并阻塞等待完成 boolean success = job.waitForCompletion(true); System.exit(success ? 0 : 1);

4.2 动态资源申请(YARN Client API)

适用于 Spark/Flink 等需运行时扩缩容的框架:

// 初始化 YARN 客户端 YarnClient yarnClient = YarnClient.createYarnClient(); yarnClient.init(conf); yarnClient.start(); // 构建资源请求:优先级=1,规格=2GB内存+2核CPU Resource resource = Resource.newInstance(2048, 2); Priority priority = Priority.newInstance(1); ResourceRequest request = ResourceRequest.newInstance( priority, ResourceRequest.ANY, // 任意节点 resource, 1 // 请求1个Container ); // 发起资源分配请求 AllocateRequest allocateReq = AllocateRequest.newInstance( 0L, // responseId(首次为0) Collections.singletonList(request), Collections.emptyList(), // 已完成Container列表 Collections.emptyList(), // 已释放Container列表 1.0f // progress(0.0–1.0) ); AllocateResponse response = yarnClient.allocate(allocateReq); // 解析分配结果 List<Container> allocatedContainers = response.getAllocatedContainers(); for (Container container : allocatedContainers) { LOG.info("Allocated container: {} on node {}", container.getId(), container.getNodeId()); }

最佳实践:动态申请应配合 ContainerLaunchContext 设置 JVM 参数、环境变量与依赖 JAR,确保容器启动一致性。

5. 监控、诊断与故障排查

5.1 核心监控入口

监控维度 访问方式 关键指标 诊断价值
ResourceManager Web UI http://<rm-host>:8088 集群资源总量/已用/剩余、活跃应用数、队列资源使用率、AM/Container 状态分布 快速定位资源瓶颈、队列饥饿、AM 失败
NodeManager Web UI http://<nm-host>:8042 单节点资源使用率、Container 列表、日志聚合链接、健康状态(Disk/Network) 排查节点级资源泄漏、磁盘满、网络异常
YARN REST API GET /ws/v1/cluster/metrics JSON 格式集群指标、应用列表、队列状态、节点详情 自动化巡检、告警集成(Prometheus + Grafana)

5.2 关键诊断命令

# 实时资源视图(类 top 命令) yarn top # 查看所有应用(状态/用户/队列/内存/CPU) yarn application -list # 查看指定应用详情(含 AM 日志链接) yarn application -status application_1678899210123_0005 # 查看队列资源使用(CapacityScheduler) yarn queue -status root.finance # 强制终止异常应用 yarn application -kill application_1678899210123_0005

5.3 常见故障模式与修复

故障现象 根本原因 解决方案
应用长时间 Pending 队列资源耗尽、AM 资源请求超限、队列 ACL 拒绝 检查 yarn.scheduler.capacity.root.<queue>.capacity;验证 AM 内存请求是否 ≤ yarn.scheduler.maximum-allocation-mb;确认用户是否在队列 ACL 白名单
Container 频繁失败(Exit Code 143) JVM OOM、cgroups 内存超限、磁盘空间不足 调大 yarn.nodemanager.vmem-pmem-ratio;检查 /var/log/hadoop-yarn/ NM 日志;清理节点磁盘
RM Web UI 无法访问 RM 进程崩溃、端口被占用、ZooKeeper 连接中断 检查 yarn.resourcemanager.webapp.address 配置;jps -l 确认 RM 进程;netstat -tuln | grep 8088;查看 yarn-root-resourcemanager-*.log

6. 生产环境性能调优指南

6.1 资源参数调优

参数 推荐值 调优依据
yarn.nodemanager.resource.memory-mb 节点内存 × 0.8 预留 20% 给 OS、HDFS DataNode、ZooKeeper
yarn.scheduler.minimum-allocation-mb 2048 避免小容器引发调度开销激增
yarn.app.mapreduce.am.resource.mb 4096 AM 内存过小导致频繁 GC,影响调度吞吐
yarn.nodemanager.vmem-pmem-ratio 2.1 Hadoop 3.x 默认值,平衡虚拟内存与物理内存

6.2 调度器专项优化

  • CapacityScheduler:启用 yarn.scheduler.capacity.node-locality-delay(默认40)降低跨机架调度延迟;设置 yarn.scheduler.capacity.root.<queue>.scheduling-policydrf(Dominant Resource Fairness)提升多资源维度公平性。
  • FairScheduler:启用 yarn.scheduler.fair.preemption 并合理设置 fairSharePreemptionThreshold(0.8–0.9);为关键队列设置 minSharePreemptionTimeout 缩短抢占等待时间。

6.3 高可用与稳定性加固

  • RM HA:部署至少 2 个 RM 实例,通过 ZooKeeper 选举 Active;配置 yarn.resourcemanager.ha.automatic-failover.enabled=true
  • NM 容错:启用 yarn.nodemanager.recovery.enabled=true,故障恢复后自动重建 Container 状态。
  • 日志治理:配置 yarn.nodemanager.log.retain-seconds=604800(7天)与 yarn.log-aggregation-enable=true,集中归档至 HDFS。

7. 总结:构建企业级 YARN 调度平台的关键实践

YARN 已超越 Hadoop 生态资源管理器的原始定位,演进为云原生大数据平台的统一资源底座。成功落地需把握三大核心:

  1. 架构分层清晰化:严格区分 RM(全局调度)、NM(节点执行)、AM(应用自治)边界,避免功能混杂;
  2. 调度策略场景化:生产集群首选 CapacityScheduler 实现租户硬隔离与 SLA 保障;实验/开发集群可选用 FairScheduler 提升资源利用率与响应速度;彻底摒弃 FIFO 在生产环境的使用;
  3. 运维体系自动化:依托 REST API 与 Web UI 构建监控大盘,结合 yarn topyarn application 等 CLI 工具实现分钟级故障定位,通过参数调优与 HA 配置达成 99.95% 服务可用性。

演进趋势:YARN 正与 Kubernetes 深度融合(如 Apache YuniKorn、KubeRay),通过 CSI 插件统一调度 CPU/GPU/FPGA 资源,构建“大数据 + AI + 实时计算”三位一体的智能资源中枢。掌握 YARN 调度内核,是驾驭下一代数据基础设施的必备能力。


发布者: 作者: 转发
评论区 (0)
U