未记录事实核验 · 状态:维护中
记录仅说明核验时间与维护状态,不保证适用于所有环境;使用前请留意正文中的版本、适用条件与风险提示。
warning 适用范围与待维护事项
本文适合已有HDFS、MapReduce基础的读者理解YARN架构并在隔离测试集群演练,不是生产部署清单。默认值和协议行为未按具体Hadoop/Spark版本核验;Fair启用步骤及Capacity队列容量配置未补全,MapReduce AM参数需在相应配置环境设置。14336 MB与12288 MB是不同预算示例,监控阈值不构成SLA。执行终止应用、资源超卖或调度器变更前,须核对权限、日志聚合、资源计算器及隔离配置;会员分级不表示内容已达生产交付质量。
🎛️ YARN资源管理架构 - 现代大数据平台的资源调度中枢
abstract 📋 本节概览
- 🎯 学习目标:理解YARN架构设计、资源调度机制和应用管理流程
- 📚 前置知识:MapReduce编程 | HDFS分布式文件系统 | 操作系统资源管理概念
- ⏱️ 预计用时:95分钟
- 🔧 技术重点:双层调度架构、Container资源模型、多租户管理
🏗️ 架构设计挑战
构建可靠的数据系统时,YARN资源管理架构是核心考虑因素,直接影响系统的稳定性和扩展性。
在实际工作环境中,这样的挑战每天都在发生。理解相关知识不仅能解决当前问题,更能提升整体的专业能力。
Hadoop 1.x vs YARN架构对比
%%{init: {"theme":"base","themeVariables":{"fontFamily":"PingFang SC, -apple-system, Source Han Serif SC, serif","fontSize":"16px","background":"#FDFBF5","primaryColor":"#FDFBF5","primaryTextColor":"#2D2A26","primaryBorderColor":"#6E6A60","secondaryColor":"#E8EFE8","secondaryBorderColor":"#8FA890","secondaryTextColor":"#2D2A26","tertiaryColor":"#FDFBF5","tertiaryBorderColor":"#9A9488","tertiaryTextColor":"#6E6A60","lineColor":"#6E6A60","textColor":"#2D2A26","mainBkg":"#FDFBF5","nodeBorder":"#2D5A3D","clusterBkg":"#F3EEDF","clusterBorder":"#9A9488","edgeLabelBackground":"#FDFBF5"},"flowchart":{"htmlLabels":true,"curve":"basis","padding":20,"nodeSpacing":60,"rankSpacing":70,"useMaxWidth":false},"themeCSS":".node rect, .node polygon, .node circle { stroke-width: 1.5px; } .edgePath .path { stroke-width: 1.5px; } .cluster-label .nodeLabel, .cluster-label foreignObject { color: #2D2A26 !important; } .edgeLabel, .edgeLabel foreignObject { color: #2D2A26 !important; background-color: #FDFBF5; } .edgeLabel rect { fill: #FDFBF5; }"}}%%
flowchart TB
classDef default fill:#FDFBF5,stroke:#6E6A60,color:#2D2A26,stroke-width:1.5px
classDef startend fill:#2D2A26,stroke:#2D2A26,color:#FDFBF5,font-weight:bold
classDef decision fill:#F6EAD8,stroke:#C08A1A,color:#2D2A26,font-weight:bold
classDef hub fill:#3B5A80,stroke:#3B5A80,color:#FDFBF5,font-weight:bold
classDef io fill:#E5EAF0,stroke:#3B5A80,color:#2D2A26
classDef accent fill:#A6432C,stroke:#A6432C,color:#FDFBF5,font-weight:bold
classDef storage fill:#F3EEDF,stroke:#9A9488,color:#2D2A26
subgraph "Hadoop 1.x架构"
JT[JobTracker<br/>作业调度+资源管理]
TT1[TaskTracker1<br/>Map/Reduce固定槽位]
TT2[TaskTracker2<br/>Map/Reduce固定槽位]
JT --> TT1
JT --> TT2
end
subgraph "YARN架构"
RM[ResourceManager<br/>全局资源调度]
NM1[NodeManager1<br/>节点资源管理]
NM2[NodeManager2<br/>节点资源管理]
AM1[ApplicationMaster1<br/>应用协调]
AM2[ApplicationMaster2<br/>应用协调]
RM --> NM1
RM --> NM2
AM1 --> NM1
AM2 --> NM2
end
class JT,TT1,TT2,RM,NM1,NM2,AM1,AM2 default
🏗️ YARN核心架构
组件关系图
%%{init: {"theme":"base","themeVariables":{"fontFamily":"PingFang SC, -apple-system, Source Han Serif SC, serif","fontSize":"16px","background":"#FDFBF5","primaryColor":"#FDFBF5","primaryTextColor":"#2D2A26","primaryBorderColor":"#6E6A60","secondaryColor":"#E8EFE8","secondaryBorderColor":"#8FA890","secondaryTextColor":"#2D2A26","tertiaryColor":"#FDFBF5","tertiaryBorderColor":"#9A9488","tertiaryTextColor":"#6E6A60","lineColor":"#6E6A60","textColor":"#2D2A26","mainBkg":"#FDFBF5","nodeBorder":"#2D5A3D","clusterBkg":"#F3EEDF","clusterBorder":"#9A9488","edgeLabelBackground":"#FDFBF5"},"flowchart":{"htmlLabels":true,"curve":"basis","padding":20,"nodeSpacing":60,"rankSpacing":70,"useMaxWidth":false},"themeCSS":".node rect, .node polygon, .node circle { stroke-width: 1.5px; } .edgePath .path { stroke-width: 1.5px; } .cluster-label .nodeLabel, .cluster-label foreignObject { color: #2D2A26 !important; } .edgeLabel, .edgeLabel foreignObject { color: #2D2A26 !important; background-color: #FDFBF5; } .edgeLabel rect { fill: #FDFBF5; }"}}%%
flowchart TB
classDef default fill:#FDFBF5,stroke:#6E6A60,color:#2D2A26,stroke-width:1.5px
classDef startend fill:#2D2A26,stroke:#2D2A26,color:#FDFBF5,font-weight:bold
classDef decision fill:#F6EAD8,stroke:#C08A1A,color:#2D2A26,font-weight:bold
classDef hub fill:#3B5A80,stroke:#3B5A80,color:#FDFBF5,font-weight:bold
classDef io fill:#E5EAF0,stroke:#3B5A80,color:#2D2A26
classDef accent fill:#A6432C,stroke:#A6432C,color:#FDFBF5,font-weight:bold
classDef storage fill:#F3EEDF,stroke:#9A9488,color:#2D2A26
subgraph "YARN集群"
subgraph "主节点"
RM[ResourceManager<br/>全局资源调度器]
end
subgraph "工作节点1"
NM1[NodeManager1<br/>节点资源管理器]
C11[Container1]
C12[Container2]
AM1[ApplicationMaster1]
end
subgraph "工作节点2"
NM2[NodeManager2<br/>节点资源管理器]
C21[Container3]
C22[Container4]
end
subgraph "工作节点3"
NM3[NodeManager3<br/>节点资源管理器]
C31[Container5]
AM2[ApplicationMaster2]
end
subgraph "客户端"
Client[应用客户端<br/>提交应用程序]
end
Client --> RM
RM --> NM1
RM --> NM2
RM --> NM3
AM1 --> RM
AM2 --> RM
AM1 --> NM2
AM2 --> NM1
end
class RM,NM1,C11,C12,AM1,NM2,C21,C22,NM3,C31,AM2,Client default
核心组件详解
1. ResourceManager - 全局资源调度器
note 💡 ResourceManager就像城市规划局
- 掌握整个城市的土地资源
- 根据申请审批土地使用权
- 监督土地使用情况
- 不参与具体建设工作
ResourceManager职责:
# 1. 全局资源管理
- 维护集群可调度资源视图(通常为内存、vCores;其他资源需按版本和配置显式支持,磁盘与网络监控不等于默认参与资源调度)
- 接收NodeManager的资源心跳报告
- 根据策略分配资源给应用程序
# 2. 应用程序管理
- 接收客户端提交的应用程序
- 为应用分配ApplicationMaster
- 监控ApplicationMaster的运行状态
# 3. 调度策略执行
- 支持多种调度器(FIFO、Fair、Capacity)
- 实现多租户资源隔离
- 提供队列管理和优先级控制
ResourceManager 内部组件分工:
ResourceManager 并非铁板一块,下面列出三个与应用管理和调度相关的组件;后续图中还包括接收 NodeManager 心跳的 ResourceTracker,并非完整内部组件清单:
| 子组件 | 职责 | 通信对象 |
|---|---|---|
| ApplicationManager | 接收客户端提交的应用并参与应用生命周期管理;AM Container 分配由调度器完成,AM 启动及失败重试由 RM 内部相关组件协作处理 | 客户端及 RM 内部组件 |
| ResourceScheduler | 根据调度策略(FIFO/Fair/Capacity)决定将哪些资源分配给哪个应用;不直接跟踪应用状态,只负责资源分配 | ApplicationMaster(通过心跳返回分配结果) |
| ApplicationMasterService | 接收 AM 的心跳和资源请求;向 AM 返回调度器的分配结果;处理 AM 的注册和注销 | ApplicationMaster |
%%{init: {"theme":"base","themeVariables":{"fontFamily":"PingFang SC, -apple-system, Source Han Serif SC, serif","fontSize":"16px","background":"#FDFBF5","primaryColor":"#FDFBF5","primaryTextColor":"#2D2A26","primaryBorderColor":"#6E6A60","secondaryColor":"#E8EFE8","secondaryBorderColor":"#8FA890","secondaryTextColor":"#2D2A26","tertiaryColor":"#FDFBF5","tertiaryBorderColor":"#9A9488","tertiaryTextColor":"#6E6A60","lineColor":"#6E6A60","textColor":"#2D2A26","mainBkg":"#FDFBF5","nodeBorder":"#2D5A3D","clusterBkg":"#F3EEDF","clusterBorder":"#9A9488","edgeLabelBackground":"#FDFBF5"},"flowchart":{"htmlLabels":true,"curve":"basis","padding":20,"nodeSpacing":60,"rankSpacing":70,"useMaxWidth":false},"themeCSS":".node rect, .node polygon, .node circle { stroke-width: 1.5px; } .edgePath .path { stroke-width: 1.5px; } .cluster-label .nodeLabel, .cluster-label foreignObject { color: #2D2A26 !important; } .edgeLabel, .edgeLabel foreignObject { color: #2D2A26 !important; background-color: #FDFBF5; } .edgeLabel rect { fill: #FDFBF5; }"}}%%
flowchart TD
classDef default fill:#FDFBF5,stroke:#6E6A60,color:#2D2A26,stroke-width:1.5px
classDef startend fill:#2D2A26,stroke:#2D2A26,color:#FDFBF5,font-weight:bold
classDef decision fill:#F6EAD8,stroke:#C08A1A,color:#2D2A26,font-weight:bold
classDef hub fill:#3B5A80,stroke:#3B5A80,color:#FDFBF5,font-weight:bold
classDef io fill:#E5EAF0,stroke:#3B5A80,color:#2D2A26
classDef accent fill:#A6432C,stroke:#A6432C,color:#FDFBF5,font-weight:bold
classDef storage fill:#F3EEDF,stroke:#9A9488,color:#2D2A26
subgraph "ResourceManager"
AM_SVC[ApplicationMasterService<br/>接收 AM 心跳/资源请求]
SCHED[ResourceScheduler<br/>FIFO / Fair / Capacity]
APP_MGR[ApplicationManager<br/>应用生命周期管理]
RT[ResourceTracker<br/>接收 NM 心跳]
end
subgraph "外部组件"
Client[客户端]
AM[ApplicationMaster]
NM[NodeManager]
end
Client -->|提交应用| APP_MGR
AM -->|心跳/资源申请| AM_SVC
AM_SVC -->|转发请求| SCHED
SCHED -->|分配决策| AM_SVC
AM_SVC -->|返回分配结果| AM
NM -->|心跳上报| RT
RT -->|更新资源视图| SCHED
APP_MGR -->|监控 AM 状态| AM
class AM_SVC,SCHED,APP_MGR,RT,Client,AM,NM default
2. NodeManager - 节点资源管理器
note 💡 NodeManager就像工厂的车间主任
- 管理本车间的设备和工人
- 接收总部的生产任务安排
- 监控生产过程和质量
- 定期向总部汇报车间状况
NodeManager职责:
# 1. 节点资源管理
- 监控本节点的CPU、内存、磁盘、网络使用情况
- 向ResourceManager汇报资源状态
- 执行Container的生命周期管理
# 2. Container管理
- 接收ApplicationMaster的请求启动任务Container;AM自身的Container由ResourceManager侧发起启动
- 监控Container的资源使用
- 检测和处理Container异常
# 3. 本地服务
- 提供日志聚合服务
- 执行节点健康检查
- 管理本地缓存和临时文件
3. ApplicationMaster - 应用协调器
note 💡 ApplicationMaster就像项目经理
- 负责单个项目的全程管理
- 向公司申请所需资源(人员、设备)
- 协调项目各环节的执行
- 监控项目进度和质量
ApplicationMaster职责:
# 1. 资源申请和管理
- 根据应用需求向ResourceManager申请Container
- 监控已分配Container的使用情况
- 在Container故障时重新申请资源
# 2. 任务调度和监控
- 将应用程序分解为具体任务
- 在Container中启动和监控任务执行
- 处理任务失败和重试逻辑
# 3. 应用生命周期管理
- 管理应用程序的启动、运行、完成
- 收集应用执行结果和统计信息
- 在应用完成后释放资源
ApplicationMaster 失败重试机制:
在由 YARN 管理 AM 的常规模式下,AM 本身也是跑在一个 Container 里的进程;如果 AM 崩溃,ResourceManager 会通过内部相关组件处理失败,并在未达到应用尝试次数上限等条件下启动新的 AM 尝试。
| 配置参数 | 默认值 | 说明 |
|---|---|---|
yarn.resourcemanager.am.max-attempts |
2 | AM 最大尝试总次数(全局,包含首次尝试) |
mapreduce.am.max-attempts |
2 | MapReduce AM 的最大尝试总次数(包含首次尝试) |
spark.yarn.maxAppAttempts |
继承 RM 全局值 | Spark AM 的最大尝试总次数(包含首次尝试) |
warning 注意:表中的 max-attempts 限制应用尝试总次数,包含首次尝试,不是额外重试次数,也不是单个 Task 的重试次数。ResourceManager 的 StateStore 用于 RM 自身的状态恢复,不是已完成任务状态的通用恢复来源;AM 重启后的任务恢复取决于应用框架及其恢复配置,例如 MapReduce 的作业历史恢复机制。
AM 与 RM/NM 的通信协议:
- AM → RM:通过
ApplicationMasterProtocol注册、发送心跳、申请/释放资源 - AM → NM:通过
ContainerManagementProtocol启动和停止 Container - 完成状态传递:NM 通过心跳向 RM 上报 Container 状态,AM 通过与 RM 的资源分配心跳响应获取完成状态;AM 也可向 NM 查询 Container 状态,应用任务进度通信由具体框架实现
4. Container - 资源容器
note 💡 Container就像标准化的工作间
- 提供固定规格的工作空间
- 包含CPU、内存、磁盘等资源
- 可以运行各种类型的任务
- 使用完毕后回收利用
资源模型:
YARN 的 Container 常用资源维度是内存和 vCores;支持自定义资源的版本还可扩展其他维度。下表保留原稿默认值记录,但未注明适用版本、发行版及核验依据,实际部署应以目标环境的配置为准:
| 资源维度 | 配置参数 | 默认值 | 说明 |
|---|---|---|---|
| 内存 | yarn.scheduler.minimum-allocation-mb |
1024 MB | Container 内存最小分配单位 |
| 内存 | yarn.scheduler.maximum-allocation-mb |
8192 MB | Container 内存最大上限 |
| 虚拟核心 | yarn.scheduler.minimum-allocation-vcores |
1 | Container vCores 最小分配单位 |
| 虚拟核心 | yarn.scheduler.maximum-allocation-vcores |
4 | Container vCores 最大上限 |
| 节点可用内存 | yarn.nodemanager.resource.memory-mb |
8192 MB | NodeManager 可分配给 Container 的总内存 |
| 节点可用核心 | yarn.nodemanager.resource.cpu-vcores |
8 | NodeManager 可分配给 Container 的总 vCores |
tip vCores 是 YARN 的抽象 CPU 资源计量单位,不保证与物理核心或硬件线程一一对应。调高 `yarn.nodemanager.resource.cpu-vcores` 可增加节点申报的调度容量,但是否形成 CPU 超卖及其实际限制效果取决于资源计算器、硬件检测和隔离配置,需结合实际 CPU 负载评估。
Container 完整生命周期:
%%{init: {"theme":"base","themeVariables":{"fontFamily":"PingFang SC, -apple-system, Source Han Serif SC, serif","fontSize":"16px","background":"#FDFBF5","primaryColor":"#FDFBF5","primaryTextColor":"#2D2A26","primaryBorderColor":"#6E6A60","secondaryColor":"#E8EFE8","secondaryBorderColor":"#8FA890","secondaryTextColor":"#2D2A26","tertiaryColor":"#FDFBF5","tertiaryBorderColor":"#9A9488","tertiaryTextColor":"#6E6A60","lineColor":"#6E6A60","textColor":"#2D2A26","mainBkg":"#FDFBF5","nodeBorder":"#2D5A3D","clusterBkg":"#F3EEDF","clusterBorder":"#9A9488","edgeLabelBackground":"#FDFBF5"},"flowchart":{"htmlLabels":true,"curve":"basis","padding":20,"nodeSpacing":60,"rankSpacing":70,"useMaxWidth":false},"themeCSS":".node rect, .node polygon, .node circle { stroke-width: 1.5px; } .edgePath .path { stroke-width: 1.5px; } .cluster-label .nodeLabel, .cluster-label foreignObject { color: #2D2A26 !important; } .edgeLabel, .edgeLabel foreignObject { color: #2D2A26 !important; background-color: #FDFBF5; } .edgeLabel rect { fill: #FDFBF5; }"}}%%
sequenceDiagram
participant AM as ApplicationMaster
participant RM as ResourceManager
participant NM as NodeManager
participant C as Container进程
AM->>RM: 1. 通过心跳申请 Container(指定内存/vCores/位置偏好)
RM->>AM: 2. 心跳响应中返回已分配的 Container 列表
AM->>NM: 3. 发送 StartContainerRequest(含启动命令、环境变量)
NM->>C: 4. 按执行器和隔离配置启动 Container 进程(cgroups 需另行启用)
C-->>AM: 5. Container 运行中(AM 通过轮询或回调获取进度)
NM->>RM: 6. NodeManager 心跳中上报 Container 状态
C->>NM: 7. Container 进程退出(成功或失败)
NM->>RM: 8a. 通过心跳上报 Container 完成状态及退出码
RM->>AM: 8b. 在 AM 的资源分配心跳响应中返回完成状态
AM->>RM: 9. 释放 Container(或申请新 Container 重试)
⚡ YARN应用提交流程
完整提交流程
%%{init: {"theme":"base","themeVariables":{"fontFamily":"PingFang SC, -apple-system, Source Han Serif SC, serif","fontSize":"16px","background":"#FDFBF5","primaryColor":"#FDFBF5","primaryTextColor":"#2D2A26","primaryBorderColor":"#6E6A60","secondaryColor":"#E8EFE8","secondaryBorderColor":"#8FA890","secondaryTextColor":"#2D2A26","tertiaryColor":"#FDFBF5","tertiaryBorderColor":"#9A9488","tertiaryTextColor":"#6E6A60","lineColor":"#6E6A60","textColor":"#2D2A26","mainBkg":"#FDFBF5","nodeBorder":"#2D5A3D","clusterBkg":"#F3EEDF","clusterBorder":"#9A9488","edgeLabelBackground":"#FDFBF5"},"flowchart":{"htmlLabels":true,"curve":"basis","padding":20,"nodeSpacing":60,"rankSpacing":70,"useMaxWidth":false},"themeCSS":".node rect, .node polygon, .node circle { stroke-width: 1.5px; } .edgePath .path { stroke-width: 1.5px; } .cluster-label .nodeLabel, .cluster-label foreignObject { color: #2D2A26 !important; } .edgeLabel, .edgeLabel foreignObject { color: #2D2A26 !important; background-color: #FDFBF5; } .edgeLabel rect { fill: #FDFBF5; }"}}%%
sequenceDiagram
participant Client as 客户端
participant RM as ResourceManager
participant NM as NodeManager
participant AM as ApplicationMaster
participant Container as Container
Note over Client,Container: 1. 应用提交阶段
Client->>RM: 请求新应用ID及资源能力信息
RM->>Client: 返回ApplicationID等信息
Note over Client: 将jar包等资源上传到HDFS等存储并构造提交上下文
Client->>RM: 提交应用上下文(含资源位置及AM启动信息)
RM->>RM: 验证并接收应用
Note over Client,Container: 2. ApplicationMaster启动
RM->>NM: 申请启动AM的Container
NM->>AM: 启动ApplicationMaster
AM->>RM: 注册ApplicationMaster
Note over Client,Container: 3. 资源申请与分配
AM->>RM: 申请执行任务的Container
RM->>AM: 分配Container资源
AM->>NM: 请求启动Container
NM->>Container: 启动Container并执行任务
Note over Client,Container: 4. 执行监控
Container->>AM: 报告任务进度
AM->>RM: 报告应用进度
NM->>RM: 报告节点状态
Note over Client,Container: 5. 应用完成
Container->>AM: 任务完成
AM->>RM: 注销ApplicationMaster
Client->>RM: 查询应用状态
RM->>Client: 返回应用完成状态
详细步骤说明
# 步骤1:客户端提交应用
1. 客户端连接ResourceManager并请求新应用ID
2. ResourceManager返回ApplicationID及资源能力信息
3. 客户端上传应用程序文件到HDFS等存储并构造提交上下文
4. 客户端向ResourceManager提交应用上下文
# 步骤2:启动ApplicationMaster
5. ResourceManager在某个NodeManager上启动AM Container
6. NodeManager下载应用程序文件
7. 启动ApplicationMaster进程
8. ApplicationMaster向ResourceManager注册
# 步骤3:资源申请
9. ApplicationMaster分析应用需求
10. 向ResourceManager申请Container资源
11. ResourceManager根据调度策略分配资源
12. 返回Container分配信息给ApplicationMaster
# 步骤4:任务执行
13. ApplicationMaster联系对应的NodeManager
14. NodeManager启动Container并运行任务
15. 任务向ApplicationMaster报告进度
16. ApplicationMaster监控任务执行
# 步骤5:清理资源
17. 任务完成后释放Container
18. ApplicationMaster向ResourceManager注销
19. ResourceManager清理应用相关资源
🎚️ YARN调度器
调度器类型对比
note 💡 调度器就像不同的排队规则
- FIFO:先来先服务,简单但可能饿死小任务
- Fair:轮流服务,保证公平但可能效率不高
- Capacity:分组服务,既保证公平又考虑优先级
| 调度器 | 多租户支持 | 优先级控制 | 资源抢占 | 适用场景 | 优势 | 劣势 |
|---|---|---|---|---|---|---|
| FIFO | 缺少多队列租户隔离 | 可按应用优先级及提交顺序排序,具体支持需核对版本 | 不支持 | 单用户/开发测试环境 | 实现简单 | 大作业可能占用大量资源,小作业长时间等待 |
| Fair Scheduler | 支持(用户/队列级别公平共享) | 支持权重(weight)控制 | 支持抢占(preemption) | 多用户交互式查询、混合型工作负载 | 公平共享、支持动态队列;响应效果取决于负载和配置 | 吞吐量取决于负载与配置,不能普遍认定低于 Capacity |
| Capacity Scheduler | 支持(按队列隔离,队列间可弹性借用) | 支持队列优先级和用户限额 | 支持抢占(需配置) | 企业多部门/多团队共享集群 | 可按队列规划资源容量,支持 SLA 相关资源策略但不保证达标 | 配置复杂,静态队列需手动调整 |
tip 生产环境选型建议:企业内多团队共享集群首选 **Capacity Scheduler**,它是 Hadoop 默认调度器,配合动态队列可以兼顾隔离性和弹性;大数据平台提供公平调度给多个用户时可选 **Fair Scheduler**;**FIFO** 仅适合学习和单一作业的测试场景。
1. FIFO调度器
%%{init: {"theme":"base","themeVariables":{"fontFamily":"PingFang SC, -apple-system, Source Han Serif SC, serif","fontSize":"16px","background":"#FDFBF5","primaryColor":"#FDFBF5","primaryTextColor":"#2D2A26","primaryBorderColor":"#6E6A60","secondaryColor":"#E8EFE8","secondaryBorderColor":"#8FA890","secondaryTextColor":"#2D2A26","tertiaryColor":"#FDFBF5","tertiaryBorderColor":"#9A9488","tertiaryTextColor":"#6E6A60","lineColor":"#6E6A60","textColor":"#2D2A26","mainBkg":"#FDFBF5","nodeBorder":"#2D5A3D","clusterBkg":"#F3EEDF","clusterBorder":"#9A9488","edgeLabelBackground":"#FDFBF5"},"flowchart":{"htmlLabels":true,"curve":"basis","padding":20,"nodeSpacing":60,"rankSpacing":70,"useMaxWidth":false},"themeCSS":".node rect, .node polygon, .node circle { stroke-width: 1.5px; } .edgePath .path { stroke-width: 1.5px; } .cluster-label .nodeLabel, .cluster-label foreignObject { color: #2D2A26 !important; } .edgeLabel, .edgeLabel foreignObject { color: #2D2A26 !important; background-color: #FDFBF5; } .edgeLabel rect { fill: #FDFBF5; }"}}%%
flowchart TD
A[作业队列]
B[作业1<br/>大作业,运行中]
C[作业2<br/>小作业,等待]
D[作业3<br/>中作业,等待]
E[作业4<br/>小作业,等待]
A --> B
B --> C
C --> D
D --> E
style B fill:#ff9999
style C fill:#ffcc99
style D fill:#ffcc99
style E fill:#ffcc99
2. Fair调度器
%%{init: {"theme":"base","themeVariables":{"fontFamily":"PingFang SC, -apple-system, Source Han Serif SC, serif","fontSize":"16px","background":"#FDFBF5","primaryColor":"#FDFBF5","primaryTextColor":"#2D2A26","primaryBorderColor":"#6E6A60","secondaryColor":"#E8EFE8","secondaryBorderColor":"#8FA890","secondaryTextColor":"#2D2A26","tertiaryColor":"#FDFBF5","tertiaryBorderColor":"#9A9488","tertiaryTextColor":"#6E6A60","lineColor":"#6E6A60","textColor":"#2D2A26","mainBkg":"#FDFBF5","nodeBorder":"#2D5A3D","clusterBkg":"#F3EEDF","clusterBorder":"#9A9488","edgeLabelBackground":"#FDFBF5"},"flowchart":{"htmlLabels":true,"curve":"basis","padding":20,"nodeSpacing":60,"rankSpacing":70,"useMaxWidth":false},"themeCSS":".node rect, .node polygon, .node circle { stroke-width: 1.5px; } .edgePath .path { stroke-width: 1.5px; } .cluster-label .nodeLabel, .cluster-label foreignObject { color: #2D2A26 !important; } .edgeLabel, .edgeLabel foreignObject { color: #2D2A26 !important; background-color: #FDFBF5; } .edgeLabel rect { fill: #FDFBF5; }"}}%%
flowchart TB
classDef default fill:#FDFBF5,stroke:#6E6A60,color:#2D2A26,stroke-width:1.5px
classDef startend fill:#2D2A26,stroke:#2D2A26,color:#FDFBF5,font-weight:bold
classDef decision fill:#F6EAD8,stroke:#C08A1A,color:#2D2A26,font-weight:bold
classDef hub fill:#3B5A80,stroke:#3B5A80,color:#FDFBF5,font-weight:bold
classDef io fill:#E5EAF0,stroke:#3B5A80,color:#2D2A26
classDef accent fill:#A6432C,stroke:#A6432C,color:#FDFBF5,font-weight:bold
classDef storage fill:#F3EEDF,stroke:#9A9488,color:#2D2A26
subgraph "Fair Scheduler"
A[总资源池]
B[用户1<br/>50%资源]
C[用户2<br/>50%资源]
D[作业1]
E[作业2]
F[作业3]
A --> B
A --> C
B --> D
B --> E
C --> F
end
class A,B,C,D,E,F default
<!-- fair-scheduler.xml -->
<allocations>
<!-- 默认队列配置 -->
<queue name="default">
<maxResources>4096mb,4vcores</maxResources>
<maxRunningApps>2</maxRunningApps>
<weight>1.0</weight>
</queue>
<!-- 高优先级队列 -->
<queue name="priority">
<maxResources>8192mb,8vcores</maxResources>
<maxRunningApps>5</maxRunningApps>
<weight>2.0</weight>
<minResources>1024mb,1vcores</minResources>
</queue>
<!-- 用户限制 -->
<user name="hdfs">
<maxRunningApps>10</maxRunningApps>
</user>
<!-- 队列放置规则 -->
<queuePlacementPolicy>
<rule name="specified" />
<rule name="user" />
<rule name="default" queue="default" />
</queuePlacementPolicy>
</allocations>
3. Capacity调度器
%%{init: {"theme":"base","themeVariables":{"fontFamily":"PingFang SC, -apple-system, Source Han Serif SC, serif","fontSize":"16px","background":"#FDFBF5","primaryColor":"#FDFBF5","primaryTextColor":"#2D2A26","primaryBorderColor":"#6E6A60","secondaryColor":"#E8EFE8","secondaryBorderColor":"#8FA890","secondaryTextColor":"#2D2A26","tertiaryColor":"#FDFBF5","tertiaryBorderColor":"#9A9488","tertiaryTextColor":"#6E6A60","lineColor":"#6E6A60","textColor":"#2D2A26","mainBkg":"#FDFBF5","nodeBorder":"#2D5A3D","clusterBkg":"#F3EEDF","clusterBorder":"#9A9488","edgeLabelBackground":"#FDFBF5"},"flowchart":{"htmlLabels":true,"curve":"basis","padding":20,"nodeSpacing":60,"rankSpacing":70,"useMaxWidth":false},"themeCSS":".node rect, .node polygon, .node circle { stroke-width: 1.5px; } .edgePath .path { stroke-width: 1.5px; } .cluster-label .nodeLabel, .cluster-label foreignObject { color: #2D2A26 !important; } .edgeLabel, .edgeLabel foreignObject { color: #2D2A26 !important; background-color: #FDFBF5; } .edgeLabel rect { fill: #FDFBF5; }"}}%%
flowchart TB
classDef default fill:#FDFBF5,stroke:#6E6A60,color:#2D2A26,stroke-width:1.5px
classDef startend fill:#2D2A26,stroke:#2D2A26,color:#FDFBF5,font-weight:bold
classDef decision fill:#F6EAD8,stroke:#C08A1A,color:#2D2A26,font-weight:bold
classDef hub fill:#3B5A80,stroke:#3B5A80,color:#FDFBF5,font-weight:bold
classDef io fill:#E5EAF0,stroke:#3B5A80,color:#2D2A26
classDef accent fill:#A6432C,stroke:#A6432C,color:#FDFBF5,font-weight:bold
classDef storage fill:#F3EEDF,stroke:#9A9488,color:#2D2A26
subgraph "Capacity Scheduler"
A[root 100%]
B[engineering 60%]
C[marketing 40%]
D[dev 50%]
E[test 30%]
F[ops 20%]
G[campaign 70%]
H[analysis 30%]
A --> B
A --> C
B --> D
B --> E
B --> F
C --> G
C --> H
end
class A,B,C,D,E,F,G,H default
<!-- capacity-scheduler.xml -->
<configuration>
<!-- 队列层次结构 -->
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>engineering,marketing</value>
</property>
<!-- engineering队列配置 -->
<property>
<name>yarn.scheduler.capacity.root.engineering.capacity</name>
<value>60</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.engineering.maximum-capacity</name>
<value>80</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.engineering.queues</name>
<value>dev,test,ops</value>
</property>
<!-- dev子队列配置 -->
<property>
<name>yarn.scheduler.capacity.root.engineering.dev.capacity</name>
<value>50</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.engineering.dev.user-limit-factor</name>
<value>2</value>
</property>
</configuration>
🔧 YARN配置优化
资源配置
<configuration>
<!-- NodeManager资源配置 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>14336</value>
<description>NodeManager可用内存总量</description>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>8</value>
<description>NodeManager可用虚拟CPU核心数</description>
</property>
<!-- Container资源限制 -->
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>512</value>
<description>Container最小内存分配</description>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>8192</value>
<description>Container最大内存分配</description>
</property>
<!-- ApplicationMaster资源 -->
<property>
<name>yarn.app.mapreduce.am.resource.mb</name>
<value>1024</value>
<description>MapReduce ApplicationMaster内存</description>
</property>
<!-- 调度器选择 -->
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
</configuration>
内存配置计算
# 假设节点总内存:16GB
# 1. 系统预留内存(1-2GB)
系统内存 = 2GB
# 2. NodeManager进程内存(1GB)
NodeManager内存 = 1GB
# 3. 其他Hadoop进程内存(如DataNode,1GB)
其他进程内存 = 1GB
# 4. YARN可用内存 = 16GB - 2GB - 1GB - 1GB = 12GB
# 5. Container内存配置
yarn.nodemanager.resource.memory-mb = 12 * 1024 = 12288MB
# 6. Container最小内存(通常为1GB的因子)
yarn.scheduler.minimum-allocation-mb = 1024MB
# 7. Container数量
仅按内存估算的Container数上限 = 12288 / 1024 = 12个(假设每个Container申请1024MB;实际并发数还受AM占用、vCores、队列限额及其他资源约束)
📊 YARN监控与调试
Web界面监控
# ResourceManager Web UI
http://resourcemanager-host:8088
主要功能:
- 集群概览(节点数、应用数、资源使用率)
- 应用程序列表(运行中、已完成、失败)
- 调度器信息(队列状态、资源分配)
- 节点信息(活跃节点、资源详情)
# NodeManager Web UI
http://nodemanager-host:8042
主要功能:
- 节点资源使用情况
- Container列表和日志
- 本地目录使用情况
- 节点健康状态
命令行监控
# 1. 查看集群信息
yarn node -list
yarn node -status <node-id>
# 2. 查看应用程序
yarn application -list
yarn application -status <application-id>
yarn application -kill <application-id>
# 3. 查看日志
yarn logs -applicationId <application-id>
yarn logs -applicationId <application-id> -containerId <container-id>
# 4. 队列管理
yarn queue -status <queue-name>
# 5. 资源使用统计
yarn top
性能调优指标
以下数值保留为原稿未核实的教学示例,不是通用推荐阈值或性能承诺;实际目标须按工作负载、测量口径、资源余量和业务SLA制定。
# 1. 集群资源利用率(以下“应”仅表示该教学示例的假设目标)
- CPU利用率:应保持在70-80%
- 内存利用率:应保持在70-85%
- 网络I/O:监控带宽使用情况
- 磁盘I/O:监控读写延迟
# 2. 应用程序指标
- 应用排队时间:应尽量短
- Container启动时间:应在几秒内
- 任务失败率:应低于5%
- 数据本地性:应高于80%
# 3. 调度器效率
- 资源分配延迟:应在毫秒级
- 队列吞吐量:根据业务需求评估
- 抢占频率:应控制在合理范围
🔗 下一步学习
理解YARN架构后,建议继续学习:
最后更新:2024-06-29