介绍一下hadoop-yarn的工作流程
·
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-ms | 1000 | NM心跳间隔 |
yarn.am.liveness-monitor.expiry-interval-ms | 600000 | AM过期时间(10分钟) |
yarn.resourcemanager.am.max-attempts | 2 | AM最大重试次数 |
🎯 阶段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就是被分配的具体房间。
更多推荐

所有评论(0)