Spark on Yarn学习之Yarn运行过程和Yarn应用的实现

【本文详细介绍了Spark On Yarn 中Yarn运行过程和Yarn应用的实现,欢迎读者朋友们阅读、转发和收藏!】

1. Yarn 的启动流程

1.1 Yarn 启动流程步骤

整体流程如下:

1. 提交应用及其使用到的资源

用户向 YARN 中( RM )提交应用程序,其中包括 ApplicationMaster 程序、启动 ApplicationMaster 的命令、用户程序等。客户端将应用程序所需的文件资源 ( 外部字典、 JAR 包、二进制文件等 ) 提交到 HDFS.

2. 启动 ApplicationMaster

ResourceManager 为该应用程序分配第一个 Container ,并与对应的 NodeManager 通信,要求它在这个 Container 中启动应用程序的 ApplicationMaster 。ApplicationMaster 与 ResouceManager 通信,以请求和获取资源。ApplicationMaster 获取到资源后,与对应的 NodeManager 通信以启动任务。如果该应用程序第一次在给节点上启动任务,则 NodeManager 首先从 HDFS 上下载文件缓存到本地,然后启动该任务。

注:分布式缓存并不是将文件缓存到集群中各个结点的内存中,而是将文件换到各个结点的磁盘上,以便执行任务时候直接从本地磁盘上读取文件。

3. 注册应用

ApplicationMaster 首先向 ResourceManager 注册,表明自己启动成功,这样用户可以直接通过 ResourceManage 查看应用程序的运行状态,然后它将为各个任务申请资源,并监控它的运行状态,直到运行结束,即重复步骤 4~7 。

4. 为任务申请资源

ApplicationMaster 采用轮询的方式通过 RPC 协议向 ResourceManager 申请和领取资源。

5. 与 NM 通信启动各个任务

一旦 ApplicationMaster 申请到资源后, ApplicationMaster 就会将启动命令交给 NodeManager, 要求它启动任务。启动命令里包含了一些信息使得 Container 可以与 Application Master 进行通信。

6.NM 启动任务

NodeManager 为任务设置好运行环境(包括环境变量、 JAR 包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务( Container )。

7. 执行任务

在 Container 内执行用户提交的代码,各个 Container 通过某个 RPC 协议向 ApplicationMaster 汇报自己的状态和进度,以让 ApplicationMaster 随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。

8. 任务状态查询

在应用程序运行过程中,用户可随时通过 RPC 向 ApplicationMaster 查询应用程序的当前运行状态。

9. 运行完毕

应用程序运行完成后, ApplicationMaster 向 ResourceManager 注销并关闭自己。

1.2 AM 与 RM 的详细交互

1. 用户向 YARN ResourceManager 提交应用程序, RM 收到提交申请后,先向资源调度器申请用以启动 AM 的资源,待申请到资源后,再由 ApplicationMasterLauncher 与对应的 NodeManager 通信,从而启动应用程序的 ApplicationMaster.

2.ApplicationMaster 启动完成后, ApplicationMasterLaucher 会通过事件的形式,将刚刚启动的 Application Master 注册到 AMLiveMonitor ,以启动心跳监控。

3.ApplicationMaster 启动后,先向 ApplicatinMaterService 注册,并将自己所在 host 、端口号等信息汇报给它。

4.AM 运行过程中,周期性地向 ApplicationMaserService 回报心跳信息(信息中包含想要申请的资源描述)。

5. ApplicationMasterService 每次收到 ApplicationMaster 心跳信息好后,将通知 AMLivelinessMonitor 更新应用程序的最新回报心跳的时间。

6. 应用程序运行完成后, AM 向 AMService 发送请求,注销自己。

7.AMService 收到注销请求后,标注应用程序运行状态完成,同时通知 AMLivelinessMonitor 移除对它的心跳监控。

总结:

当用户向 YARN 中提交一个应用程序后, YARN 将分两个阶段运行该应用程序:第一个阶段是启动

ApplicationMaster ;第二个阶段是由 ApplicationMaster 创建应用程序,为它申请资源,并监控它的整个运行过程,直到运

行完成。

2.Yarn Application 的实现

2.1 Yarn application 中的角色和接口

Yarn 是一个资源管理系统,负责整个集群资源的管理和分配。如果需要在一个 yarn 集群上运行程序 :

首先得有个客户端 client 来提交 job 到 ResourceManager(RM) 申请资源。Client 通过 RMProtocol 协议来与 RM 通信,将应用程序运行所需的一些信息,比如 local file/jars ,执行的命令,参数,环境变量等提供给 RM 来运行应用的第一个 container 也就是 ApplicationMaster(AppMaster) 。

如果申请到了资源, RM 就在第一个 container 上启动 AppMaster 。AppMaster 然后通过 AMRMProtocol 协议与 ResourceManager 通讯,注册自身,然后继续申请资源。

如果获得了 containers , AppMaster 会通过 ContainerManager 类与 NodeManager 通信,为任务启动 container 。AppMaster 同时也会提供启动 container 需要的一些信息,比如命令行,环境变量等。任务完成后, AppMaster 会通过 AMRMProtocol::finishApplicationMaster 来通知 RM 任务完成。同时, client 可以通过查询 RM 来获取 job 的状态信息,或者如果 AppMaster 支持也可以直接从 AppMaster 查询信息。如果需要, client 可以通过 ClientRMProtocol::forceKillApplication 来 kill 掉 application 。

三个角色

1. client 即客户端,负责将应用程序提交到 RM 。

2. AppMaster 即整个应用程序的核心,负责与 RM 通信,申请资源,启动 containers 。并监控 containers 的执行情况,在 container 执行失败后做 failover 的处理。

3. container 就是具体干活的,和具体业务相关的一些处理逻辑。

三个 RPC 协议

1. ClientRMProtocol(ClientResourceManager) :客户端与 RM 通信的协议,可以启动 AppMater ,查询或者 kill AppMaster 。

2. AMRMProtocol(ApplicationMasterResourceManager) :AppMaster 与 RM 通信, AppMaster 可以向 RM 注册和注销自己,也可以向 RM 申请资源以启动 container 。

3. ContainerManager(ApplicationMaster NodeManager) :AppMaster 与 NM 通信,可以启动或者停止一个 container ,也可以获取 container 的执行状态。

我知道你在看

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200521A0041K00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券