Yarn 的架构和原理
YARN 的基本设计思想是将 MapReduce V1 中的 JobTracker 拆分为两个独立的服务:ResourceManager 和 ApplicationMaster。ResourceManager 负责整个系统的资源管理和分配,ApplicationMaster 负责单个应用程序的的管理。
ResourceManager
RM 是一个全局的资源管理器,负责整个系统的资源管理和分配,它主要由两个部分组成:调度器(Scheduler)和应用程序管理器(Application Manager)。
调度器根据容量、队列等限制条件,将系统中的资源分配给正在运行的应用程序,在保证容量、公平性和服务等级的前提下,优化集群资源利用率,让所有的资源都被充分利用
应用程序管理器负责管理整个系统中的所有的应用程序,包括应用程序的提交、与调度器协商资源以启动 ApplicationMaster、监控 ApplicationMaster 运行状态并在失败时重启它。
ApplicationMaster
用户提交的一个应用程序会对应于一个 ApplicationMaster,它的主要功能有:
a.与 RM 调度器协商以获得资源,资源以 Container 表示。
b.将得到的任务进一步分配给内部的任务。
c.与 NM 通信以启动/停止任务。
d.监控所有的内部任务状态,并在任务运行失败的时候重新为任务申请资源以重启任务。
nodeManager
NodeManager 是每个节点上的资源和任务管理器,一方面,它会定期地向 RM 汇报本节点上的资源使用情况和各个 Container 的运行状态;另一方面,他接收并处理来自 AM 的 Container 启动和停止请求。
container
Container 是 YARN 中的资源抽象,封装了各种资源。一个应用程序会分配一个 Container,这个应用程序只能使用这个 Container 中描述的资源。
不同于 MapReduceV1 中槽位 slot 的资源封装,Container 是一个动态资源的划分单位,更能充分利用资源。
4.4 yarn 的任务提交流程
当 jobclient 向 YARN 提交一个应用程序后,YARN 将分两个阶段运行这个应用程序:一是启动 ApplicationMaster;第二个阶段是由 ApplicationMaster 创建应用程序,为它申请资源,监控运行直到结束。
具体步骤如下:
用户向 YARN 提交一个应用程序,并指定 ApplicationMaster 程序、启动 ApplicationMaster 的命令、用户程序。
RM 为这个应用程序分配第一个 Container,并与之对应的 NM 通讯,要求它在这个 Container 中启动应用程序 ApplicationMaster。
ApplicationMaster 向 RM 注册,然后拆分为内部各个子任务,为各个内部任务申请资源,并监控这些任务的运行,直到结束。
AM 采用轮询的方式向 RM 申请和领取资源。
RM 为 AM 分配资源,以 Container 形式返回
AM 申请到资源后,便与之对应的 NM 通讯,要求 NM 启动任务。
NodeManager 为任务设置好运行环境,将任务启动命令写到一个脚本中,并通过运行这个脚本启动任务
各个任务向 AM 汇报自己的状态和进度,以便当任务失败时可以重启任务。
应用程序完成后,ApplicationMaster 向 ResourceManager 注销并关闭自己
resourceManager 基本介绍
ResourceManager 负责集群中所有资源的统一管理和分配,它接收来自各个 NodeManager 的资源汇报信息,并把这些信息按照一定的策略分配给各个 ApplicationMaster。
1 RM 的职能
与客户端交互,处理客户端的请求。
启动和管理 AM,并在它运行失败时候重新启动它。
管理 NM,接收来自于 NM 的资源汇报信息,并向 NM 下达管理指令。
资源管理和调度,接收来自于 AM 的资源请求,并为它分配资源。
2 RM 的内部结构
用户交互模块:
clientRMService : 为普通用户服务,处理请求,如:提交应用程序、终止程序、获取程序状态
adminService : 给管理员提供的服务。普通用户交互模块是 ClientRMService,管理员交互模块是 AdminService,之所以要将两个模块分开,用不同的通信通道发送给 ResourceManager,是因为要避免普通用户的请求过多导致管理员请求被阻塞
WebApp : 更友好的展示集群资源和程序运行状态
NM 管理模块:
NMLivelinessMonitor : 监控 NM 是否活着,如果指定时间内未收到心跳,就从集群中移除。RM 会通过心跳告诉 AM 某个 NM 上的 Container 失效,如果 Am 判断需要重新执行,则 AM 重新向 RM 申请资源。
NodesListManager : 维护 inlude(正常)和 exlude(异常)的 NM 节点列表。默认情况下,两个列表都为空,可以由管理员添加节点。exlude 列表里的 NM 不允许与 RM 进行通信。
ResourceTrackerService : 处理来自 NM 的请求,包括注册和心跳。注册是 NM 启动时的操作,包括节点 ID 和可用资源上线等。心跳包括各个 Container 运行状态,运行 Application 列表、节点健康状态
AM 管理模块 :
AMLivelinessMonitor : 监控 AM 是否还活着,如果指定时间内没有接受到心跳,则将正在运行的 Container 置为失败状态,而 AM 会被重新分配到另一个节点上
ApplicationMasterLauncher: 要求某一个 NM 启动 ApplicationMaster,它处理创建 AM 的请求和 kill AM 的请求
ApplicationMasterService : 处理来自 AM 的请求,包括注册、心跳、清理。注册是在 AM 启动时发送给 ApplicationMasterService 的;心跳是周期性的,包括请求资源的类型、待释放的 Container 列表;清理是程序结束后发送给 RM,以回收资源清理内存空间;
Application 管理模块 :
ApplicationACLLsManager : 管理应用程序的访问权限,分为查看权限和修改权限。
RMAppManager : 管理应用程序的启动和关闭
ContainerAllocationExpirer : RM 分配 Container 给 AM 后,不允许 AM 长时间不对 Container 使用,因为会降低集群的利用率,如果超时(时间可以设置)还没有在 NM 上启动 Container,RM 就强制回收 Container。
状态机管理模块 :
RMApp : RMApp 维护一个应用程序的的整个运行周期,一个应用程序可能有多个实例,RMApp 维护的是所有实例的
RMAppAttempt : RMAppAttempt 维护一个应用程序实例的一次尝试的整个生命周期
RMContainer : RMContainer 维护一个 Container 的整个运行周期(可能和任务的周期不一致)
RMNode : RMNode 维护一个 NodeManager 的生命周期,包括启动到运行结束的整个过程。
安全模块 :
RM 自带了全面的权限管理机制。主要由 ClientToAMSecretManager、ContainerTokenSecretManager、ApplicationTokenSecretManager 等模块组成。
资源分配模块 :
ResourceScheduler:ResourceScheduler 是资源调度器,他按照一定的约束条件将资源分配给各个应用程序。RM 自带了一个批处理资源调度器(FIFO)和两个多用户调度器 Fair Scheduler 和 Capacity Scheduler
版权声明: 本文为 InfoQ 作者【五分钟学大数据】的原创文章。
原文链接:【http://xie.infoq.cn/article/d39c23f42360f81fb1576eee9】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论