YARN (Yet Another Resource Negotiator) 是 Hadoop 的资源管理和作业调度平台,它的核心思想是将资源管理和作业调度/监控分离为两个独立的守护进程。

一、YARN 的核心架构组件

核心组件职责表

组件角色职责数量
ResourceManager (RM)全局总管资源分配、节点管理、作业调度集群唯一(可HA)
NodeManager (NM)单机管家容器管理、资源监控、状态上报每台机器一个
ApplicationMaster (AM)作业工头作业调度、任务监控、容错处理每个作业一个
Container资源单元封装CPU/内存/磁盘等资源动态创建销毁

二、YARN 工作流程(以 Flink 作业为例)

完整流程图

三、各阶段详细说明

📤 阶段1:作业提交

java

// 客户端代码示例(简化)
ApplicationSubmissionContext context = Records.newRecord(ApplicationSubmissionContext.class);
context.setApplicationId(rm.getApplicationId());
context.setResource(new Resource(memory, vCores));
context.setAMContainerSpec(amContainer);  // AppMaster启动命令

// 指定AppMaster运行参数(以Flink为例)
String command = "java -cp /hdfs/path/flink-dist.jar:/hdfs/path/job.jar " +
                 "org.apache.flink.yarn.YarnApplicationMasterRunner " +
                 "--jar job.jar --parallelism 4";
context.setCommand(command);

关键动作:

  • 客户端获取Application ID

  • 将作业JAR上传到HDFS(共享存储)

  • 构建启动ApplicationMaster的命令


🚀 阶段2:启动 ApplicationMaster

重要细节:

  • RM 不关心 AM 是什么应用(Flink/Spark/MapReduce)

  • NM 从 HDFS 动态拉取启动所需的 JAR

  • AM 启动后会立即向 RM 注册并发送心跳

java

// AM注册代码(Flink内部实现)
RegisterApplicationMasterRequest request = 
    RegisterApplicationMasterRequest.newInstance(
        appMasterHost, appMasterRpcPort, appMasterTrackingUrl);
RegisterApplicationMasterResponse response = 
    rmClient.registerApplicationMaster(request);

📦 阶段3:资源请求与分配

这是 YARN 最核心的调度机制:

资源请求类型:

请求类型说明使用场景
ANY任意节点无数据本地化要求
RACK_LOCAL同机架网络距离考虑
NODE_LOCAL指定节点数据本地性优化
OFF不需调度用于AM自身

🔧 阶段4:启动 TaskManager

NM创建容器时做的事:

bash

复制

下载

# 容器启动脚本(简化)
mkdir -p ${container_dir}
cd ${container_dir}
hadoop fs -get hdfs://nn/flink-dist.jar .
hadoop fs -get hdfs://nn/job.jar .
java -Xmx2048m -cp flink-dist.jar:job.jar \
     org.apache.flink.runtime.taskexecutor.TaskExecutorRunner

⚙️ 阶段5:任务执行与监控

关键参数配置:

参数默认值作用
yarn.nodemanager.heartbeat.interval-ms1000NM心跳间隔
yarn.am.liveness-monitor.expiry-interval-ms600000AM过期时间(10分钟)
yarn.resourcemanager.am.max-attempts2AM最大重试次数

🎯 阶段6:作业完成与资源释放


四、调度器详解

YARN 提供三种可插拔的调度器:

1. FIFO 调度器(已基本废弃)

缺点: 先来先服务,容易造成饥饿

2. 容量调度器 (Capacity Scheduler)

特点:

  • 多队列隔离

  • 弹性资源分配

  • 支持队列间借用/归还

3. 公平调度器 (Fair Scheduler)

特点:

  • 短作业优先

  • 自动平衡

  • 适合共享集群


五、实际运维视角的检查点

查看作业状态

# 列出所有作业
yarn application -list

# 查看作业详情
yarn application -status application_123456789_0001

# 查看日志
yarn logs -applicationId application_123456789_0001

# 终止作业
yarn application -kill application_123456789_0001

Web UI 查看

http://resourcemanager-host:8088/cluster

在这里可以看到:

  • 所有运行的Application

  • 每个Application的AM所在节点

  • Container的分配情况

  • NodeManager的健康状态


六、总结:YARN 的核心设计哲学

设计原则具体体现
资源与计算分离RM只管资源,不关心计算逻辑
调度与监控分离Scheduler只管分配,AM监控任务
高可用性RM可HA,AM可重启,NM故障自动处理
扩展性支持10000+节点,支持异构资源(GPU/FPGA)

一句话总结:YARN 就像一个高效的"酒店前台"——RM是总台分配房间,AM是随行管家负责具体事务,NM是楼层服务员管理房间状态,Container就是被分配的具体房间。

更多推荐