YARN 基础
YARN(Yet Another Resource Negotiator)是 Hadoop 2.x 引入的资源管理系统,负责集群资源的统一管理和调度。本章将深入讲解 YARN 的架构和工作原理。
YARN 概述
为什么需要 YARN?
在 Hadoop 1.x 中,JobTracker 同时负责资源管理和任务调度:
Hadoop 1.x JobTracker 的问题:
- 单点故障:JobTracker 故障导致整个集群不可用
- 扩展性差:JobTracker 负载过重,限制了集群规模
- 资源利用率低:Map Slot 和 Reduce Slot 不能共享
- 不支持多框架:只能运行 MapReduce 作业
YARN 的解决方案:
将资源管理和任务调度分离,引入 ResourceManager 和 ApplicationMaster:
- ResourceManager 负责全局资源管理
- ApplicationMaster 负责单个应用的任务调度
- 支持多种计算框架(MapReduce、Spark、Flink 等)
YARN 的优势
| 优势 | 说明 |
|---|---|
| 高扩展性 | 支持数千节点的集群 |
| 高可用性 | ResourceManager HA |
| 多框架支持 | 统一资源管理,支持多种计算框架 |
| 资源利用率高 | 动态资源分配,按需使用 |
| 隔离性 | 容器级别的资源隔离 |
YARN 架构
整体架构
核心组件
ResourceManager
ResourceManager 是 YARN 的主节点,负责整个集群的资源管理。
主要职责:
- 资源调度:根据调度策略分配资源
- 应用管理:接收应用程序提交,启动 ApplicationMaster
- 状态监控:监控集群资源使用情况
内部组件:
| 组件 | 功能 |
|---|---|
| Scheduler | 纯粹的资源调度器,负责资源分配 |
| ApplicationsManager | 管理应用程序的提交和 ApplicationMaster 的启动 |
| RMApp | 应用程序的状态机 |
| RMContainer | 容器的状态管理 |
NodeManager
NodeManager 运行在每个节点上,负责单个节点的资源管理。
主要职责:
- 资源汇报:定期向 ResourceManager 汇报节点资源使用情况
- 容器管理:启动、监控、停止容器
- 资源隔离:保证容器之间的资源隔离
- 健康检查:监控节点健康状态
内部组件:
| 组件 | 功能 |
|---|---|
| ContainerExecutor | 执行容器的启动和停止命令 |
| NodeStatusUpdater | 向 ResourceManager 汇报节点状态 |
| ContainerManager | 管理容器生命周期 |
| ResourceLocalizationService | 本地化资源文件 |
| ContainerMonitor | 监控容器资源使用 |
ApplicationMaster
ApplicationMaster 是每个应用程序的管理者。
主要职责:
- 任务切分:将应用程序切分成多个任务
- 资源申请:向 ResourceManager 申请资源
- 任务调度:在分配的容器上调度任务
- 状态监控:监控任务执行状态
- 容错处理:任务失败时申请新资源重新执行
ApplicationMaster 生命周期:
Container
Container 是 YARN 中资源的抽象单位。
资源组成:
| 资源 | 说明 |
|---|---|
| Memory | 内存大小(MB) |
| CPU | 虚拟 CPU 核心数(vcores) |
| GPU | GPU 资源(可选) |
| 其他 | 磁盘、网络等(可选) |
Container 生命周期:
YARN 工作流程
应用程序执行流程
详细步骤:
-
提交应用:客户端向 ResourceManager 提交应用程序,包括 ApplicationMaster 程序、启动命令、资源需求等。
-
验证创建:ResourceManager 验证应用程序的合法性,创建应用记录。
-
分配 Container:ResourceManager 选择一个 NodeManager,为其分配一个 Container 用于启动 ApplicationMaster。
-
启动 ApplicationMaster:NodeManager 在分配的 Container 中启动 ApplicationMaster。
-
注册申请:ApplicationMaster 向 ResourceManager 注册,并申请执行任务所需的资源。
-
返回资源:ResourceManager 根据调度策略返回可用的 Container 列表。
-
启动任务:ApplicationMaster 与 NodeManager 通信,在 Container 中启动任务。
-
执行任务:任务在 Container 中执行。
-
汇报状态:NodeManager 向 ApplicationMaster 汇报任务执行状态。
-
注销应用:应用执行完成后,ApplicationMaster 向 ResourceManager 注销,释放资源。
资源申请流程
ApplicationMaster 申请资源的详细流程:
YARN 配置
核心配置文件
yarn-site.xml
<!-- ResourceManager 地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>resourcemanager</value>
</property>
<!-- ResourceManager Web UI 地址 -->
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>resourcemanager:8088</value>
</property>
<!-- NodeManager 辅助服务 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- NodeManager 资源配置 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>8192</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>8</value>
</property>
<!-- 最小/最大分配内存 -->
<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.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
mapred-site.xml
<!-- 指定 MapReduce 运行在 YARN 上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 历史服务器地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>historyserver:10020</value>
</property>
资源配置详解
NodeManager 资源配置
| 配置项 | 默认值 | 说明 |
|---|---|---|
yarn.nodemanager.resource.memory-mb | 8192 | 节点可用内存 |
yarn.nodemanager.resource.cpu-vcores | 8 | 节点可用 CPU 核心数 |
yarn.nodemanager.resource.detect-hardware-capabilities | false | 自动检测硬件资源 |
调度器资源配置
| 配置项 | 默认值 | 说明 |
|---|---|---|
yarn.scheduler.minimum-allocation-mb | 1024 | Container 最小内存 |
yarn.scheduler.maximum-allocation-mb | 8192 | Container 最大内存 |
yarn.scheduler.minimum-allocation-vcores | 1 | Container 最小 CPU |
yarn.scheduler.maximum-allocation-vcores | 4 | Container 最大 CPU |
日志配置
<!-- 启用日志聚合 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志保留时间(秒) -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<!-- 日志聚合检查间隔 -->
<property>
<name>yarn.log-aggregation.retain-check-interval-seconds</name>
<value>3600</value>
</property>
<!-- 日志服务器地址 -->
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/yarn/logs</value>
</property>
YARN 常用命令
应用管理
# 查看应用列表
yarn application -list
# 查看所有状态的应用
yarn application -list -appStates ALL
# 查看特定状态的应用
yarn application -list -appStates RUNNING,ACCEPTED
# 查看应用详情
yarn application -status application_1234567890_0001
# 杀死应用
yarn application -kill application_1234567890_0001
# 刷新应用队列
yarn application -refreshQueues
节点管理
# 查看节点列表
yarn node -list
# 查看节点详情
yarn node -status node1:8041
# 查看节点状态
yarn node -list -states RUNNING
日志查看
# 查看应用日志
yarn logs -applicationId application_1234567890_0001
# 查看特定容器的日志
yarn logs -applicationId application_1234567890_0001 -containerId container_1234567890_0001_01_000001
# 查看特定节点的日志
yarn logs -applicationId application_1234567890_0001 -nodeAddress node1:8041
队列管理
# 查看队列信息
yarn queue -status default
# 查看所有队列
yarn queue -list
YARN Web UI
ResourceManager Web UI
访问地址:http://resourcemanager:8088
主要功能:
- 集群概览:资源使用情况、节点数量
- 应用列表:查看所有应用状态
- 调度器:查看队列配置和使用情况
- 节点列表:查看所有节点状态
NodeManager Web UI
主要功能:
- 节点资源使用情况
- 运行中的容器列表
- 节点健康状态
小结
本章介绍了 YARN 的基础知识:
-
架构设计:ResourceManager、NodeManager、ApplicationMaster、Container 四大核心组件。
-
工作流程:应用程序提交、资源申请、任务执行的完整流程。
-
配置管理:资源配置、日志配置等关键配置项。
-
常用命令:应用管理、节点管理、日志查看等命令。
YARN 是 Hadoop 生态系统的资源管理核心,理解其架构和工作原理对于使用 Hadoop、Spark 等框架非常重要。下一章将介绍 YARN 调度器的配置和使用。