YARN(Yet Another Resource Negotiator)组件和工作流程
YARN(Yet Another Resource Negotiator)是Hadoop 2.x的核心资源管理系统,通过资源调度与作业执行分离的设计,支持多计算框架(如Spark、Flink)共享集群资源。其核心架构包括ResourceManager(全局调度器)、NodeManager(节点代理)和ApplicationMaster(应用管理者),以Container为资源分配单位实现隔离与高效
·
文章目录
一、YARN概述
1. 定义与定位
- YARN 是
Apache Hadoop 2.x
引入的集群资源管理系统,是Hadoop
的核心组件之一。 - 设计目标:将
Hadoop 1.x
中MapReduce
的资源调度与作业执行分离,支持多计算框架(如Spark、Flink、Storm
)共享集群资源。 - 核心优势:
- 资源隔离:通过容器(
Container
)实现资源隔离,避免不同应用互相影响。 - 多框架支持:统一管理集群资源,支持
MapReduce、Spark、Flink
等计算框架。 - 高扩展性:支持动态扩展节点,理论上可管理上万节点的集群。
- 资源隔离:通过容器(
2. 基本概念
- 资源抽象:
YARN
将CPU
、内存等资源抽象为"容器"(Container
),每个Container
包含固定的CPU
和内存资源。 - 应用程序:用户提交的计算任务(如
Spark
作业、MapReduce
作业)。 - 应用Master:每个应用程序的管理者,负责向
ResourceManager
申请资源并调度任务。 - 调度策略:支持容量调度(
Capacity Scheduler
)、公平调度(Fair Scheduler
)等多种策略。
二、YARN架构与组件
1. 核心组件
Client → ResourceManager → ApplicationMaster → NodeManager → Container
-
ResourceManager (RM):
- 全局资源调度器:负责整个集群的资源分配和调度,维护集群可用资源和分配状态。
- 两个核心服务:
- Scheduler:纯调度器,根据调度策略分配资源,不负责应用程序监控和状态跟踪。
- ApplicationsManager:接收应用程序提交请求,为应用分配初始
Container
并启动ApplicationMaster
。
-
NodeManager (NM):
- 节点代理:管理单个节点上的资源和
Container
生命周期。 - 功能:
- 启动和监控
Container
,汇报资源使用情况给ResourceManager
。 - 执行
Container
的启动、停止和资源隔离(通过Linux cgroups
实现)。
- 启动和监控
- 节点代理:管理单个节点上的资源和
-
ApplicationMaster (AM):
- 应用程序管理者:每个应用程序(如
Spark
作业)有独立的AM
,负责该应用的资源申请和任务调度。 - 功能:
- 向
ResourceManager
注册并申请资源(Container
)。 - 与
NodeManager
通信,启动和监控任务执行。 - 跟踪应用程序状态,向
ResourceManager
汇报进度。
- 向
- 应用程序管理者:每个应用程序(如
-
Client:
- 用户接口:提交应用程序、查询应用状态、终止应用等。
- 示例工具:
yarn application -list
、yarn application -kill
。
2. 资源抽象与容器
- Container:
YARN
的资源分配基本单位,包含固定的CPU
(以vCore
为单位)和内存(MB
)。- 由
NodeManager
管理,运行在单个节点上,支持资源隔离和监控。
- 资源请求模型:
AM
向RM
请求特定数量、特定位置(如节点或机架)的Container
。RM
根据调度策略分配Container
,AM
与对应NodeManager
通信启动任务。
三、YARN工作流程
1. 应用程序提交流程
- Client提交应用:
Client
向ResourceManager
提交应用程序,包括ApplicationMaster
的启动命令、资源需求(如内存、CPU
)。
- ResourceManager分配初始Container:
ResourceManager
为应用程序分配第一个Container
,并通知对应的NodeManager
启动ApplicationMaster
。
- ApplicationMaster注册与资源申请:
AM
启动后向ResourceManager
注册,开始为应用程序的任务申请资源(Container
)。
- 资源分配与任务执行:
ResourceManager
根据调度策略为AM
分配Container
,AM
向NodeManager
发送任务启动命令。
- 任务监控与完成:
AM
监控所有任务执行状态,任务完成后向ResourceManager
注销并释放资源。
2. 资源调度流程
- 资源汇报:
NodeManager
定期向ResourceManager
汇报节点资源使用情况和健康状态。 - 资源请求:
AM
向ResourceManager
发送资源请求(包含优先级、数量、位置偏好等)。 - 资源分配:
ResourceManager
的Scheduler
根据调度策略(如容量调度、公平调度)分配Container
给AM
。 - 任务执行:
AM
与NodeManager
通信,在分配的Container
中启动任务。
四、YARN调度器与调度策略
1. 主要调度器类型
-
FIFO Scheduler:
- 先进先出队列,按提交顺序调度应用程序。
- 缺点:长任务会阻塞后续短任务,不适合多用户共享集群。
-
Capacity Scheduler:
- 多队列分层调度:将集群资源划分为多个队列(如
prod、dev、test
),每个队列有固定容量。 - 资源弹性:当某个队列资源空闲时,可借给其他队列使用,提高资源利用率。
- 应用场景:适合多租户、多部门的生产环境,保证每个队列最低资源。
- 多队列分层调度:将集群资源划分为多个队列(如
-
Fair Scheduler:
- 公平共享资源:基于应用程序的资源需求和历史使用情况动态分配资源。
- 抢占机制:当高优先级应用需要资源时,可抢占低优先级应用的资源。
- 应用场景:适合交互式作业和批处理作业混合的场景,保证小作业快速响应。
2. 调度器配置与选择
调度器 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
FIFO | 简单易配置 | 不支持多队列 | 单用户、单队列场景 |
Capacity | 支持多队列、资源隔离 | 资源分配不够灵活 | 多租户、资源隔离要求高 |
Fair | 公平共享、支持抢占 | 配置复杂 | 交互式和批处理混合场景 |
五、YARN高级特性
1. 资源类型扩展
- 默认资源类型:
CPU(vCore)
和内存(MB
)。 - 扩展资源类型:
- 通过
yarn.nodemanager.resource-plugins
配置,支持GPU
、磁盘I/O
等资源类型。 - 应用场景:
AI
训练任务需要精确分配GPU
资源。
- 通过
2. 容器预热(Container Warmup)
- 目标:减少频繁启动
Container
的开销(如JVM
预热时间)。 - 机制:
- 预先启动"热容器"(
Warm Container
),任务需要时直接使用。 - 通过
yarn.nodemanager.container-executor.class
配置支持容器重用。
- 预先启动"热容器"(
3. 服务发现与应用生命周期管理
- 服务发现:
AM
注册服务信息到ResourceManager
,客户端可查询服务地址。- 结合
ZooKeeper
实现高可用的服务注册与发现。
- 应用生命周期管理:
- 支持应用程序的暂停、恢复、弹性扩缩容(如动态调整Spark Executor数量)。
4. 节点标签与资源分区
- 节点标签:为
NodeManager
打标签(如"high-memory"、"gpu"
),将集群划分为不同资源组。 - 资源分区:
- 通过
yarn.scheduler.capacity.root.queues
配置,将特定队列绑定到特定标签的节点。 - 应用场景:隔离关键任务与普通任务,避免互相影响。
- 通过
六、YARN性能优化
1. 关键配置参数
参数名 | 描述 | 默认值 |
---|---|---|
yarn.nodemanager.resource.memory-mb |
单个NodeManager可用总内存 | 8192MB |
yarn.nodemanager.resource.cpu-vcores |
单个NodeManager可用CPU核数 | 8 |
yarn.scheduler.minimum-allocation-mb |
最小Container内存分配 | 1024MB |
yarn.scheduler.maximum-allocation-mb |
最大Container内存分配 | 8192MB |
yarn.nodemanager.vmem-pmem-ratio |
虚拟内存与物理内存比例 | 2.1 |
yarn.log-aggregation-enable |
是否启用日志聚合 | false |
2. 性能调优策略
- 资源分配优化:
- 根据应用需求调整
Container
大小,避免资源浪费(如小任务使用大Container
)。 - 启用
yarn.scheduler.increment-allocation-mb
支持细粒度资源分配。
- 根据应用需求调整
- 调度器优化:
- 对于短任务占主导的场景,使用
Fair Scheduler
并配置fair-scheduler.xml
的minSharePreemptionTimeout
。 - 对于长任务占主导的场景,使用
Capacity Scheduler
并设置合理的队列容量。
- 对于短任务占主导的场景,使用
- NodeManager配置:
- 调整
yarn.nodemanager.pmem-check-enabled
和yarn.nodemanager.vmem-check-enabled
关闭内存检查(适用于内存使用波动大的应用)。 - 增加
yarn.nodemanager.resource.cpu-vcores
提高CPU
利用率。
- 调整
- 日志聚合:
- 启用
yarn.log-aggregation-enable
将Container
日志集中存储到HDFS
,便于后续分析和清理。
- 启用
七、YARN与其他组件的集成
- MapReduce:默认运行在
YARN
上,MR AppMaster
负责调度Map
和Reduce
任务。 - Spark:
- 通过
spark-submit --master yarn
将Spark
作业提交到YARN
集群。 Spark ApplicationMaster
动态申请资源,支持yarn-client
和yarn-cluster
两种模式。
- 通过
- Flink:
Flink
作业通过YARN
模式运行时,JobManager
作为ApplicationMaster
,TaskManager
运行在Container
中。- 支持会话模式(
Session Cluster
)和单作业模式(Per-Job Cluster
)。
- HBase:
HBase RegionServer
可运行在YARN
管理的Container
中,实现资源统一管理。- 通过
hbase-site.xml
配置hbase.regionserver.hostname
为0.0.0.0
启用YARN
模式。
八、YARN监控与故障排查
1. 监控工具
- ResourceManager Web UI:
- 默认地址:
http://rm-host:8088
,查看集群资源使用、应用状态等。
- 默认地址:
- NodeManager Web UI:
- 默认地址:
http://nm-host:8042
,查看节点资源使用、Container
运行情况。
- 默认地址:
- 命令行工具:
yarn application -list
:查看所有应用程序。yarn node -list
:查看节点状态。yarn logs -applicationId <appId>
:查看应用日志。
2. 常见问题与解决
- 资源不足:
- 现象:应用程序长时间等待资源。
- 解决:增加集群节点、调整调度器配置、优化应用资源请求。
- Container频繁失败:
- 原因:内存溢出、资源竞争、节点故障等。
- 解决:增加
Container
内存、检查节点健康状态、调整资源隔离参数。
- 调度性能瓶颈:
- 现象:
ResourceManager CPU
使用率高,调度延迟大。 - 解决:升级硬件、调整调度器参数(如
yarn.scheduler.capacity.maximum-applications
)。
- 现象:
九、YARN安全机制
1. 认证与授权
- Kerberos认证:
- 启用
Kerberos
后,所有组件(RM、NM、AM
)通过Kerberos
票据进行身份验证。 - 配置
core-site.xml
和yarn-site.xml
中的hadoop.security.authentication
为kerberos
。
- 启用
- ACL(访问控制列表):
- 通过
yarn.admin.acl
配置管理员权限,通过队列配置文件设置队列访问权限。 - 限制用户对特定队列的提交和查看权限。
- 通过
2. 数据安全
- Credential分发:
- 敏感信息(如数据库密码)通过
Credentials
对象加密传输,避免明文传递。 AM
从ResourceManager
获取安全令牌,用于访问HDFS
等服务。
- 敏感信息(如数据库密码)通过
- 容器隔离:
- 通过
Linux cgroups
实现Container
间的资源隔离,防止相互干扰。 - 配置
yarn.nodemanager.container-executor.class
为DockerContainerExecutor
支持Docker容器隔离。
- 通过
十、YARN的演进与未来方向
1. 最新特性(Hadoop 3.x)
- 改进的ResourceManager HA:
- 支持基于
ZooKeeper
的自动故障转移,减少人工干预。
- 支持基于
- 动态资源分配增强:
- 支持更细粒度的资源调整,如动态调整
Container
内存。
- 支持更细粒度的资源调整,如动态调整
- 异构资源支持:
- 原生支持
GPU、FPGA
等特殊硬件资源的调度和管理。
- 原生支持
2. 未来方向
- 云原生集成:
- 与Kubernetes深度集成,支持混合部署(如部分工作负载在YARN上,部分在K8s上)。
- AI工作负载优化:
- 增强对TensorFlow、PyTorch等AI框架的资源调度支持,优化GPU利用率。
- 轻量级调度框架:
- 开发更轻量级的调度器(如Apache Mesos、Kubernetes),满足多样化场景需求。
十一、YARN典型应用场景
- 多框架资源共享:在同一集群上运行MapReduce、Spark、Flink等不同计算框架。
- 多租户环境:通过容量调度器或公平调度器,为不同部门或用户分配专用资源。
- 资源隔离与优先级:关键任务优先执行,普通任务使用空闲资源,避免互相影响。
- 弹性计算:根据业务负载动态调整资源分配,如白天运行实时任务,夜间运行批处理。
更多推荐
所有评论(0)