Spark On YARN架构

【本文详细介绍了Spark On YARN的整体架构和各个组件,欢迎读者朋友们阅读、转发和收藏!】

Yarn 是一个资源管理系统,负责整个集群资源的管理和分配,主要包含三个组件 ResourceManager 、 NodeManager 和 ApplicationMaster 以及一个核心概念 Container 。

1. ResourceManager(RM)

就是所谓的资源管理器,每个集群一个,实现全局的资源管理和任务调度。它可以处理客户端提交计算作业的请求,启动并监听 ApplicationMaster ,监控 NodeManager ,进行资源分配与调度。每一个应用程序需要不同类型的资源,因此就需要不同的容器。这里的资源包括内存、 CPU 、磁盘、网络等。比如使用 spark-submit 执行程序 jar 包,就需要向 ResourceManager 注册,申请相应的容器,资源。ResourceManager 提供的调度器包括 FifoScheduler( 先进先出调度器 ) 、 CapacityScheduler (容量调度器)和 FairScheduler (公平调度器)。三种调度器简单总结如下 :

FifoScheduler:最简单的调度器,按照先进先出的方式处理应用。只有一个队列可提交应用,所有用户提交到这个队列。可以针对这个队列设置 ACL( 访问控制列表 ) 。没有应用优先级可以配置。

CapacityScheduler:可以看作是 FifoScheduler 的多队列版本。每个队列可以限制资源使用量。但是,队列间的资源分配以使用量作排列依据,按照队列的资源使用量最小的优先原则,使得容量小的队列有竞争优势。多用户的情况下,相对具有更大地集群的吞吐和利用率。

FairScheduler:多队列,多用户共享资源。特有客户端创建队列特性,根据队列设定的最小共享量或者权重等参数,按比例共享资源。具有资源抢占特性,具体是指调度器能够依据公平资源共享算法,计算每个队列应得的资源,将超额资源的队列的部分容器释放掉的特性。

2. NodeManager(NM)

节点管理器,每个节点一个,实现节点的监控与报告。处理来自 ResourceManager 的命令,也处理来自 ApplicationMaster 的命令,同时监控资源可用性,报告错误,管理资源的生命周期。NodeManager 是每一台机器框架的代理,是执行应用程序的容器,监控应用程序的资源使用情况 (CPU 、内存、硬盘、网络 ) 并向调度器汇报。

3. ApplicationMaster(AM)

应用控制器,每个作业或应用一个,实现应用的调度和资源协调。具体来说呢,它进行数据的切分,为应用申请资源并分配给任务,完成任务监控与容错。实际上,每个应用的 ApplicationMaster 是一个详细的框架库。它结合从 ResourceManager 获得的资源和 NodeManager 协同工作来运行和监听任务。ApplicationMaster 负责向 ResourceManager 索要适当的资源容器 (containter) 来运行任务,跟踪应用程序的状态和监控她们的进程,处理任务的失败原因。

4. Container

容器,封装了具体资源,包括内存、 CPU 、磁盘、网络等。每个任务会被分配一个容器,该任务只能在该容器中执行,并使用该容器封装的资源。当应用程序发出资源请求时, ResourceManager 并不会立刻返回满足要求的资源,需要 ApplicationMaster 与 ResourceManager 不断地通信,检测分配到的资源足够,才会进行分配。一旦分配完毕, ApplicationMaster 便可从 ResourceManager 处获取以 Container 表示的资源。(Container 可以看做一个可序列化的 Java 对象,包含字段信息 ) 一般来说,每个 Container 可用于执行一个任务。ApplicationMaster 在收到一个或多个 Container 后,再将该 Container 进一步分配给内部的某个任务,确定该任务后, ApplicationMaster 将该任务运行环境 ( 包含运行命令、环境变量、依赖的外部文件等 ) 连同 Container 中的资源信息封装到 ContainerLaunchContext 对象中,进而与对应的 NodeManager 通信,启动该任务。

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 注销并关闭自己。

AM 与 RM 交互过程具体描述:

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

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

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

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

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

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

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

总结:

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

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

Yarn 应用程序执行流程:

Yarn application 中的角色和接口:

三个角色:

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

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

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

三个 RPC 协议

1.ClientRMProtocols(ClientResourceManager) :客户端与 RM 通信的协议,该协议分别继承了 ApplicationClientProtocol,ApplicationMasterProtocol 和 ResourceManagerAdministrationProtocol ,里面有相关 API 可以启动,查询或者 kill AM 等操作。

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

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

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

扫码关注云+社区

领取腾讯云代金券