跳到主要内容

YARN 基础

YARN(Yet Another Resource Negotiator)是 Hadoop 2.x 引入的资源管理系统,负责集群资源的统一管理和调度。本章将深入讲解 YARN 的架构和工作原理。

YARN 概述

为什么需要 YARN?

在 Hadoop 1.x 中,JobTracker 同时负责资源管理和任务调度:

Hadoop 1.x JobTracker 的问题:

  1. 单点故障:JobTracker 故障导致整个集群不可用
  2. 扩展性差:JobTracker 负载过重,限制了集群规模
  3. 资源利用率低:Map Slot 和 Reduce Slot 不能共享
  4. 不支持多框架:只能运行 MapReduce 作业

YARN 的解决方案:

将资源管理和任务调度分离,引入 ResourceManager 和 ApplicationMaster:

  • ResourceManager 负责全局资源管理
  • ApplicationMaster 负责单个应用的任务调度
  • 支持多种计算框架(MapReduce、Spark、Flink 等)

YARN 的优势

优势说明
高扩展性支持数千节点的集群
高可用性ResourceManager HA
多框架支持统一资源管理,支持多种计算框架
资源利用率高动态资源分配,按需使用
隔离性容器级别的资源隔离

YARN 架构

整体架构

核心组件

ResourceManager

ResourceManager 是 YARN 的主节点,负责整个集群的资源管理。

主要职责:

  1. 资源调度:根据调度策略分配资源
  2. 应用管理:接收应用程序提交,启动 ApplicationMaster
  3. 状态监控:监控集群资源使用情况

内部组件:

组件功能
Scheduler纯粹的资源调度器,负责资源分配
ApplicationsManager管理应用程序的提交和 ApplicationMaster 的启动
RMApp应用程序的状态机
RMContainer容器的状态管理

NodeManager

NodeManager 运行在每个节点上,负责单个节点的资源管理。

主要职责:

  1. 资源汇报:定期向 ResourceManager 汇报节点资源使用情况
  2. 容器管理:启动、监控、停止容器
  3. 资源隔离:保证容器之间的资源隔离
  4. 健康检查:监控节点健康状态

内部组件:

组件功能
ContainerExecutor执行容器的启动和停止命令
NodeStatusUpdater向 ResourceManager 汇报节点状态
ContainerManager管理容器生命周期
ResourceLocalizationService本地化资源文件
ContainerMonitor监控容器资源使用

ApplicationMaster

ApplicationMaster 是每个应用程序的管理者。

主要职责:

  1. 任务切分:将应用程序切分成多个任务
  2. 资源申请:向 ResourceManager 申请资源
  3. 任务调度:在分配的容器上调度任务
  4. 状态监控:监控任务执行状态
  5. 容错处理:任务失败时申请新资源重新执行

ApplicationMaster 生命周期:

Container

Container 是 YARN 中资源的抽象单位。

资源组成:

资源说明
Memory内存大小(MB)
CPU虚拟 CPU 核心数(vcores)
GPUGPU 资源(可选)
其他磁盘、网络等(可选)

Container 生命周期:

YARN 工作流程

应用程序执行流程

详细步骤:

  1. 提交应用:客户端向 ResourceManager 提交应用程序,包括 ApplicationMaster 程序、启动命令、资源需求等。

  2. 验证创建:ResourceManager 验证应用程序的合法性,创建应用记录。

  3. 分配 Container:ResourceManager 选择一个 NodeManager,为其分配一个 Container 用于启动 ApplicationMaster。

  4. 启动 ApplicationMaster:NodeManager 在分配的 Container 中启动 ApplicationMaster。

  5. 注册申请:ApplicationMaster 向 ResourceManager 注册,并申请执行任务所需的资源。

  6. 返回资源:ResourceManager 根据调度策略返回可用的 Container 列表。

  7. 启动任务:ApplicationMaster 与 NodeManager 通信,在 Container 中启动任务。

  8. 执行任务:任务在 Container 中执行。

  9. 汇报状态:NodeManager 向 ApplicationMaster 汇报任务执行状态。

  10. 注销应用:应用执行完成后,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-mb8192节点可用内存
yarn.nodemanager.resource.cpu-vcores8节点可用 CPU 核心数
yarn.nodemanager.resource.detect-hardware-capabilitiesfalse自动检测硬件资源

调度器资源配置

配置项默认值说明
yarn.scheduler.minimum-allocation-mb1024Container 最小内存
yarn.scheduler.maximum-allocation-mb8192Container 最大内存
yarn.scheduler.minimum-allocation-vcores1Container 最小 CPU
yarn.scheduler.maximum-allocation-vcores4Container 最大 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

访问地址:http://nodemanager:8042

主要功能:

  • 节点资源使用情况
  • 运行中的容器列表
  • 节点健康状态

小结

本章介绍了 YARN 的基础知识:

  1. 架构设计:ResourceManager、NodeManager、ApplicationMaster、Container 四大核心组件。

  2. 工作流程:应用程序提交、资源申请、任务执行的完整流程。

  3. 配置管理:资源配置、日志配置等关键配置项。

  4. 常用命令:应用管理、节点管理、日志查看等命令。

YARN 是 Hadoop 生态系统的资源管理核心,理解其架构和工作原理对于使用 Hadoop、Spark 等框架非常重要。下一章将介绍 YARN 调度器的配置和使用。