YARN本身并不“知道”应用需要多少资源,而是由应用程序自己“告诉”YARN它需要什么。
YARN采用了一种 “申明式”的资源请求模型。它将资源管理的职责清晰地分离:
-
YARN (ResourceManager):作为资源的提供方,它只知道集群总共有多少资源,当前可用的资源是多少。它的职责是公平地满足各个应用提出的资源请求。
-
应用程序 (ApplicationMaster):作为资源的使用方,它最了解自己的计算逻辑、数据规模和工作流程。它的职责是准确地评估和请求自己所需的资源。
下面我们通过应用程序的生命周期来详细拆解这个过程。
资源请求的核心流程
整个资源协商过程始于应用提交,并在ApplicationMaster运行时持续进行。下图清晰地展示了这一核心交互流程:
详细步骤解析
第1阶段:应用提交 - 指定AM的资源需求
当客户端使用 hadoop jar 或通过REST API提交一个应用(如MapReduce或Spark作业)时,必须指明运行其 ApplicationMaster 所需的资源。
-
如何指定:在应用的配置中或提交命令中设置。
-
示例(MapReduce):
xml
<!-- 在 mapred-site.xml 中配置 --> <property> <name>yarn.app.mapreduce.am.resource.mb</name> <value>2048</value> <!-- AM需要2GB内存 --> </property> <property> <name>yarn.app.mapreduce.am.resource.cpu-vcores</name> <value>1</value> <!-- AM需要1个vCore --> </property>
-
此时YARN知道的:这个应用要启动一个AM,这个AM需要
<2048 MB, 1 vCore>的Container。这是YARN第一次知道关于这个应用的资源需求。
第2阶段:AM运行 - 动态请求任务资源
这是最关键的阶段。AM启动后,它作为应用的“大脑”,负责为具体的任务(如Map Task、Reduce Task)向RM申请资源。
1. AM评估资源需求:
-
AM根据应用程序的逻辑和输入数据来决定需要运行多少个任务,以及每个任务需要多少资源。
-
示例(MapReduce):
-
输入数据:AM读取输入数据的元信息(如HDFS上的文件,被分割成100个块)。
-
任务数量:它知道需要启动 100个Map任务 和 可能几个Reduce任务。
-
单任务资源:它从作业配置中读取每个Map任务和Reduce任务需要的资源。
xml
<property> <name>mapreduce.map.memory.mb</name> <value>1024</value> <!-- 每个Map任务需要1GB内存 --> </property> <property> <name>mapreduce.reduce.memory.mb</name> <value>2048</value> <!-- 每个Reduce任务需要2GB内存 --> </property>
-
2. AM向RM发送资源请求:
AM不会一次性请求所有资源,而是持续地、以“资源请求”的形式向RM申请。一个资源请求通常包含:
-
资源量:单个Container需要多少内存和CPU(例如:
<1024 MB, 1 vCore>)。 -
数量:需要多少个这样的Container(例如:需要10个)。
-
位置偏好/数据本地性:最关键的优化之一。AM会优先请求数据所在的节点,其次是数据所在的机架,最后是任意节点。
-
例如:为了处理HDFS块
hdfs://node1:9000/data/file.dat,AM会优先请求在node1上分配Container。
-
3. RM响应并分配资源:
-
RM收到AM的请求后,将其放入调度队列。
-
当集群中有满足要求的资源(如某个NodeManager上有可用的1GB内存和1个vCore,并且位置匹配)时,RM会向AM分配一个Container。
-
AM收到Container分配后,与对应的NodeManager通信,启动任务进程(如Java的MapTask)。
4. 动态调整与重试:
-
如果任务失败,AM会重新向RM申请资源,以便在新的Container中重新运行该任务。
-
对于像Spark这样更复杂的框架,AM可能会根据作业的阶段动态地申请和释放资源。
总结:YARN如何知道资源需求?
| 步骤 | 谁“知道”需求? | 谁提供资源? | 如何通信? |
|---|---|---|---|
| 1. 启动AM | 客户端(通过配置指定AM所需资源) | ResourceManager | 应用提交API |
| 2. 运行任务 | ApplicationMaster(根据应用逻辑、数据量和配置计算出任务资源需求) | ResourceManager | 资源请求(数量、资源量、位置) |
核心答案:YARN通过一种 “应用程序主动申明” 的机制来了解资源需求。它自己不做任何预测和计算,而是完全依赖于:
-
客户端 在提交时告知AM的资源需求。
-
ApplicationMaster 在运行时,根据应用程序自身的特性和配置,动态地向ResourceManager请求运行具体任务所需的资源。
这种设计使得YARN保持轻量和通用,而将复杂的资源需求评估工作交给了最了解自身需求的各种计算框架(MapReduce、Spark、Flink等),从而实现了一个集群同时高效运行多种工作负载的目标。

被折叠的 条评论
为什么被折叠?



