详细步骤解析
第1阶段:应用提交
步骤 1 & 2: 申请新应用ID
-
客户端(运行
hadoop jar命令的 JVM)向 ResourceManager 的ApplicationsManager发起 RPC 调用,申请一个新的应用程序 ID。 -
RM 返回一个唯一的 Application ID(如
application_1416425835806_0001)。
步骤 3: 上传应用资源
-
客户端将应用程序运行所需的资源上传到 HDFS 或其他分布式存储系统中。这些资源包括:
-
应用程序的 JAR 包
-
配置文件
-
依赖的库文件(如果适用)
-
其他分片元数据等
-
-
这些资源会被存储在一个由 Application ID 命名的目录下,以便后续由各个节点下载。
步骤 4: 提交应用程序
-
客户端构造一个
ApplicationSubmissionContext对象,其中包含了运行该应用的所有必要信息:-
Application ID
-
应用名称
-
队列和优先级信息
-
AM 的资源需求:运行 ApplicationMaster 所需的 Container 规格(例如:需要 2GB 内存和 1个 vCore)
-
AM 的启动命令:例如
java -cp ... org.apache.hadoop.mapreduce.v2.app.MRAppMaster -
HDFS 上资源文件的路径
-
-
客户端将此上下文对象提交给 RM。
第2阶段:ApplicationMaster 启动
步骤 5: RM 调度并启动 AM
-
RM 的
Scheduler收到提交请求后,将其放入调度队列。 -
当集群中有可用资源时,Scheduler 选择一个合适的 NodeManager(通常是负载较轻的节点)。
-
RM 通过 RPC 调用该 NodeManager,指令它启动一个 Container,并在该 Container 中运行客户端指定的 AM 启动命令。
步骤 6: NM 启动 AM 进程
-
被选中的 NodeManager 从 HDFS 下载应用资源(JAR 包等)。
-
它创建一个新的 Container 进程(一个独立的 JVM),并在其中执行 AM 的 main 方法(例如
MRAppMaster.main())。 -
此时,ApplicationMaster 正式启动,它将成为这个应用的“总经理”,负责管理应用内部的所有任务。
第3阶段:任务执行与管理
步骤 7: AM 注册并申请任务资源
-
AM 启动后,首先向 RM 注册自己,告知 RM 它已准备就绪。
-
接着,AM 根据应用程序的逻辑(例如,需要处理 100 个输入分片,所以需要 100 个 Map 任务)和配置,向 RM 的 Scheduler 发起一系列 资源请求。
-
每个资源请求指明了:
-
需要的 Container 数量
-
每个 Container 的资源规格(例如:每个 Map 任务需要 1GB 内存和 1个 vCore)
-
数据本地性偏好(优先选择存储有输入数据的节点)
-
步骤 8: RM 分配任务容器
-
RM 的 Scheduler 根据集群的可用资源和调度策略(如 Capacity 或 Fair),将满足要求的 Container 分配给 AM。
-
RM 以
Container对象的形式,将资源分配凭证(包含节点地址、资源量等)返回给 AM。
步骤 9: AM 启动任务
-
AM 收到 RM 分配的 Container 后,直接与对应的 NodeManager 通信。
-
AM 发送一个 ContainerLaunchContext 给 NM,其中包含了启动任务进程所需的所有信息(环境变量、依赖资源、启动命令等)。
-
NM 接收到命令后:
-
从 HDFS 下载任务所需的特定资源(如序列化的 Map 函数代码)。
-
在分配到的 Container 中启动一个子进程(例如
YarnChild类)来执行具体的任务(如 MapTask 或 ReduceTask)。 -
任务执行期间,会通过 AM 汇报进度和状态。
-
后续流程:监控与完成
-
进度监控:客户端可以通过向 RM 或 AM 查询来获取应用程序的实时状态。
-
任务容错:如果某个任务失败,AM 会检测到并重新向 RM 申请资源,在新的 Container 中重新运行该任务。
-
应用完成:当应用程序的所有任务都成功完成后,AM 会向 RM 注销并自行关闭。RM 随后会清理应用的状态记录,并通知客户端应用已最终完成。
总结
YARN 的任务提交流程体现了其清晰的职责分离思想:
-
Client:负责提交和监控。
-
ResourceManager:作为全局的资源仲裁者,负责调度和启动 AM。
-
ApplicationMaster:作为单个应用的管理者,负责内部任务的资源协商和执行。
-
NodeManager:作为单节点的执行者,负责启动和管理 Container 进程。
这种架构使得 YARN 能够高效、可靠地管理成千上万个并发应用,每个应用都可以有完全不同的计算模型。
YARN任务提交流程详解
307

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



