前面在hadoop之yarn详解(基础架构篇)这篇文章提到了yarn的重要组件有ResourceManager,NodeManager,ApplicationMaster等,以及yarn调度作业的运行过程,Yarn将它的功能分为两层:负责资源管理的平台层,叶称为第一层调度,以及二级调度的框架来协调应用程序的执行。运行在独立节点上的ResourceManager和NodeManager一起组成了yarn的核心且构成这个平台,ApplicationMaster和相应的Container一起组成了yarn的应用程序。那么这些组件具体的包含一些什么呢?又是根据什么通信的呢?
这篇文章主要进一步阐述yarn几个重要组件的重要成分,以及各个部分之间的通信情况。
一、ResourceManager
ResourceManager主要涉及到与客户端、ApplicationMaster以及NodeManager的通信组件、一些重要的组件,如ApplicationManager,scheduler等、以及安全相关组件。
1.1、Resourcemanager和客户端的交互通信
1.1.1、Client Service
该服务实现了基本的客户端到ResourceManager的接口ApplicationClientProtocol。该组件处理所有来自客户端到Resourcemanager的远程调用(RPC)通信。主要有如下操作:
1、应用程序的提交
2、应用程序的终止
3、获取应用程序,队列,集群统计,用户ACL及更多信息
4、在安全模式下,Client Server确保所有来自用户的请求都已认证过(比如kerberos认证),对于不能通过kerberos认证的,则通过resourcemanager代理令牌进行安全通信
1.1.2、Administration Service
为了确保管理员的请求不会被用户请求全部占有,提高优先级的操作指令。该组件的的通信协议是ResourceManagerAdministrationProtocol,主要包括如下一些操作:
1、刷新队列:比如对队列的增加,停止,属性修改
2、刷新ResourceManager节点列表:比如增加和移除节点
3、添加新用户,添加/更新管理员的ACL,修改超级用户列表等
1.1.3、Application ACL Manager
管理每个应用程序的ACL,确保它们得到实施。可以配置参数yarn.acl.enable为true开启应用程序的ACL
1.1.4、ResourceManager Web Application和WEB Service
ResourceManager有一个web应用程序用来输出集群的状态信息,指标,节点活跃列表,健康,非健康节点列表。应用程序的列表,它们的状态和结果。
1.2、ResourceManager和应用程序交互通信
我们知道应用程序主要有ApplicationMaster进行监控,所以在这里Resourcemanager与应用程序的交互主要是与ApplicationMaster的交互。
1.2.1、ApplicationMaster Service
该组件响应来自所有的ApplicationMaster的请求,实现了ApplicationMasterProtocol协议。这是ApplicationMaster和Resourcemanager通信协议,该组件的主要任务如下:
1、注册新的ApplicationMaster
2、来自任意正在结束的ApplicationMaster的终止/取消注册请求
3、认证来自不同ApplicationMaster的请求,确保只有合法的ApplicationMaster发送请求给ResourceManager中的应用程序
4、获取来自所有运行ApplicationMaster的container的分配和释放请求,异步转发给yarn调度器
5、该组件还确保在任意时候任意ApplicationMaster只有一个线程可以发送请求给ResourceManager
1.2.2、ApplicationMaster存活监控
这个监视器跟踪每个ApplicationMaster的最后心跳时间,如果在指定时间间隔内(默认10分钟)没有产生心跳,则在ResourceManager认为该ApplicationMaster超时,并且,所有分配给该ApplicationMaster的container也会被标记为死亡,Resourcemanager会在一个新的container中重新调用一个ApplicationMaster实例,默认两次重试
1.3、ResourceManager与NodeManager交互通信
1.3.1、Resource Tracker Service
该组件负责响应来自所有节点的RPC调用(心跳),实现了ResourceTracker接口并和所有的NodeManager通信。主要负责:
1、注册新节点
2、接收前面注册节点的心跳
3、确保只有“合法”的NodeManager和ResourceManager通信
1.3.2、NodeManager的存活监控
该组件会跟踪每一个节点的标识符(ID)和它最后的心跳时间,在指定时间间隔(10分钟)内没有向Resourcemanager发送心跳,Resourcemanager会认为该NodeManager死亡,在当前节点的container也会被标记为死亡,而不糊有新的container在该节点被调度了,一旦该节点重新启动,并注册,就回重新参与调度
1.3.3、Nodes-List Manager
该组件是ResourceManager在内存中的一个集合,包括有效的节点和被排除的节点,通过读取yarn.resourcemanager.nodes.include-path和yarn.resourcemanager.nodes.exclude-path查看主机配置,根据这些文件初始化节点列表。
1.4、ResourceManager的核心组件
1.4.1、ApplicationManager
该组件负责管理已提交应用程序的集合,在应用程序提交后,检查是否合法,是否有节点有足够的资源运行ApplicationMaster,是有应用程序ID有冲突,如果有一个不符合要求,则会拒绝ApplicationMaster的启动。
负责记录和管理已结束的应用程序,过一段时间才从ResourceManager中清除,保存一个已经结束应用程序的缓存,以便用户请求这些应用程序的数据,yarn.resourcemanager.max-completed-applications配置存储已结束的应用程序的最大数量。
1.4.2、ApplicationMaster Launcher
ResourceManager申请container,并在NodeManager上准备和启动ApplicationMaster,而其他的container都是由ApplicationMaster发起的。该组件主要维护一个线程池来设置环境,且和NodeManager通信拉起提交应用程序的ApplicationMaster。也会在一个程序正常结束作者要强行终止时。负责告诉NodeManager来清理ApplicationMaster--主要是杀掉主要进程
1.4.3、YarnScheduler
负责给正在运行的应用程序分配资源,是基于应用程序的资源需求来执行调度功能,这些资源包括内存,cpu等,后期会有磁盘以及网络,GPU等。
1.4.4、ContainerAllocationExpirer
负责确保Container最终被ApplicationMaster使用,并在相应的NodeManager上拉起,该组件包含一个已分配但还没有在相应的NodeManager上启动的Container列表,对任意的Container,在指定的时间间隔(默认10分钟)内,如果相应的NodeManager还没有报告给ResourceManager该Container已经运行,则在ResourceManager中判定该Container死亡且超时。
1.5、ResourceManager安全相关组件
ResourceManager有一系列的安全组件叫做SecretManager,负责管理令牌和私钥,这些令牌和私钥用来对各个RPC接口上的请求进行认证和授权。
1.5.1、ContainerToken SecretManager
负责管理ContainerToken,ResourceManager提供个ApplicationMaster的一个特殊令牌集合,这样ApplicationMaster可以在特定的节点上申请Container,在一个Container启动之前,我们不能信任ApplicationMaster传递正确的信息到NodeManager。为了避免这个问题,ResourceManager发送给ApplicationMaster之前在Container令牌里加密了Container的相关信息,一个Container的令牌主要包括如下内容:
1、Container ID
2、NodeManager地址
3、应用程序提交者
4、资源(内存,CPU等)
5、超时时间戳
6、主键标识符
7、ResourceManager标识符
1.5.2、AMRMToken 秘钥管理器
只有ApplicationMaster可以以Container的形式请求资源,为了避免恶意程序模拟ApplicationMaster请求资源,ResourceManager使用AMRMToken令牌,每一个ApplicationAttempt对一个令牌,秘钥管理器在本地内存中保存每个令牌知道ApplicationMaster结束,在此期间,可以用这些令牌认证来自ApplicationMaster进程请求。
1.5.3、NMToken秘钥管理器
来个启动Container的请求进行授权,这些请求来自ApplicationMaster。只有在启动Container而建立的ApplicationMaster到NodeManager的连接中有效。
1.5.4、RMDelegationToken 秘钥管理
该组件是ResourceManager代理令牌的秘钥管理器,负责给客户端生成代理令牌,该令牌可以传递给想要和ResourceManager通信但是没有经过Kerberos认证的应用程序
1.5.5、RMDelegationToken Renewer
在安全模式下,ResourceManager是通过Kerberos认证的,且提供应用代表程序跟新文件系统令牌服务
二、NodeManager
2.1、主要职责
1、保持与ResourceManager同步
2、跟踪节点的健康状况
3、管理节点各个Container得我生命周期,监控每个Container的资源使用情况
4、管理分布式缓存(对Container所需的Jar,库文件的本地文件系统缓存)
5、管理各个Container生成日志
6、不同的yarn应用程序可能需要的辅助服务
2.2、相关组件
2.2.1、NodeStatusUpdater
在NM刚启动的时候,该组件会向ResourceManager注册,发送本节点的可用资源,以及NodeManager的Web Server和RPC Server的监听端口,在注册的过程中,向NodeManager发出安全相关的key,NodeManager将这个key作为ApplicationMaster的请求Container认证,后续通信则是向ResourceManager更新Container的信息。而ResourceManager可以通过该组件通知NodeManager杀死某个正在运行中的Container。只要ResourceManager上的任何应用程序的结束,都会想NodeManager发出信号,要求清理该应用程序在本节点上对应的资源,然后发起应用程序日志的聚合。
2.2.2、ContainerManager
是NodeManager的核心组件,包含多个子组件,各个子组件分担管理运行在节点上的Container所需要的功能。
2.2.3、资源本地化服务
负责安全的下载和组织Container所要的各种文件资源,会尽可能的将文件分散到各个可以磁盘上,还强制对下载文件进行访问控制,并适当加入使用率限制。
2.2.5、Container Launcher
维护一个线程池,用于尽快的准备和拉起Container,以及用于清理需要清理的Container进程
2.2.6、Container Monitor
在Container的整个运行过程中监控它的资源使用率,每个Container都被ResourceManager分配一定的资源,如果Container超出了资源的分配值,该组件就会杀死该Container,避免不受控制的Container影响同一个节点上的正常Container的运行。
2.2.7、Log Handler
保存Container的日志在本地磁盘上,或者将它们打包上传到一个文件系统上
2.2.8、Container Executor
与底层操作系统交互,安全的放置Container所需要的文件和目录,随后以一个安全的方式启动和清理Container相关进程
2.2.9、Node Health Check Server
定期运行脚本对接点健康进行检查,任何健康值的改变都会发给NodeStatusUpdater,并传给ResourceManager
2.2.10、NodeManager安全组件
Application ACLs Manager:
NodeManager需要对用户API设置门禁指定某些用户访问
ContainerToken SecretManager:
同ResourceManager中的一样,验证各种请求,确保Container的请求是ResourceManager授权的
MNToken SecretManager :
验证所有来自于API的请求,保证这些请求都是MNToken认证的
Web Server:
展示在给定时间点,一个节点上运行的应用程序和Container列表,节点健康度相关信息,以及Container生成的日志。
还有些RPC相关组件以及辅助功能的组件。
三、ApplicationMaster
3.1、职责
1、初始化后向ResourceManager报告自己活跃信息的进程
2、计算应用程序的资源需求
3、将资源需求转换为yarn调度器可以识别的ReqsourceReqest
4、与调度器协调申请资源
5、与NodeManager合作使用分配的Container
6、跟踪Container的状态,监控它们的进程
7、对Container或节点失败的情况进行处理,在必要情况下重新申请资源
3.2、注册
1、当ApplicationMaster启动之后会向ResourceManager进行注册,在注册的过程中,会告诉ResourceManager它自己的IPC地址和网页URL,IPC地址是面向客户端的服务地址,URL方便客户端通过HTTP获取应用程序的状态和信息。
2、在相应注册的时候,ResourceManager会给ApplicationMaster返回一些有用的信息,如Yarn接收资源大小的范围,与用户提交应用程序相关的ACL。
3、注册成功后,ApplicationMaster周期性的向ResourceManager发送心跳确认自己的活跃状态和将康状态,如果在指定时间内(默认10分钟,由参数yarn.am.liveness-monitor.expiry-interval-ms控制)没有发送心跳给ResourceManager,则认为停止,将会被杀死,在配置该参数的时候,要考虑这个参数不能大于ApplicationMaster所在该节点失效的时间,节点失效的时间由参数yarn.nm.liveness-monitor.expiry-interval-ms控制,默认也是10分钟
3.3、资源申请
1、ApplicationMaster成功稳定的运行后,应用程序需要弄清楚自己的资源需求,是动态的呢,还是静态的。
静态资源指的是在提交申请的时候,大多数情况由客户端确定,而且ApplicationMaster运行后就不会改变了。
动态资源指的是在运行的过程中确定请求资源的数量。
当资源需求明确后,ApplicationMaster就会发送请求到调度器,然后安排分配的Container进行所需的工作
2、明确资源需求后,ApplicationMaster通过调用API allocate向ResourceManager请求资源,这里每个ApplicationMaster中只有一个线程可以调用API allocate,这些调用在ResourceManager中被串行化,解决多个线程调用请求资源,导致每个线程看到ResourceManager的全局资源不一致的问题。
3、在请求资源的过程中,ApplicationMaster通过一系列的resourceAsks,Container ID,或containerToBeReleased的ResourceRequest请求特定的资源,containerToBeReleased指的是之前调度器已经分配但是现在不需要的Container,其中响应信息会包括新分配的Container列表,自从ApplicationMaster和ResourceManager上次的交互完成的应用程序相关Container状态,集群可用资源的使用上限。ApplicationMaster可以根据Container的状态,收集Container完成的信息,处理失败的Container。
ApplicationMaster请求和调度资源的方式有两种:
告知ResourceManager所有的资源需求,让全局调度器做决定
与ResourceManager交互,让调度器采取全局调度,并根据资源的可用性和应用程序的业务逻辑性,对分配的Container再一次调度。
4、请求后,ApplicationMaster将收到以Container形式分配的特定节点的资源,基于从ResourceManager得到的Container,ApplicationMaster可以为其执行计划的一部分的任务分配Container,如果资源不够用,则ApplicationMaster会继续请求资源,如果资源满足时,更新请求发送给ResourceManager。
在ApplicationMaster请求资源的过程中,ApplicationMaster负责计算应用程序的资源需求,并把它们转换为调度器能够理解的ResourceRequest对象。该对象会包括如下要素:
1、请求的优先级
2、请求资源的位置,机架,机器名等
3、资源大小,每天Container的大小
4、Container的数目
5、布尔变量(relaxLocality,默认为true)表示是否本地松弛,指本地没有资源可以请求同机架的机器资源
4、Container启动和停止
在ApplicationMaster获取到资源之后,就可以根据需求启动Container了,但是在启动Container之前,首先会根据需要构造一个ContainerLauncherContext对象。该对象包含分配资源的大小,安全令牌,启动Container的命令,进程环境,必要的二进制文件/jar包/共享对象等。该对象与NOdeManager通信,逐一启动Container,也可以批量运行,向NodeManager调用StartContainerRequest来启动Container。
NodeManager通过StartContainerResponse回应,回应内容主要有:成功启动的Container列表,每个失败的StartContainerRequest对应的Container ID到异常的映射。这样ApplicationMaster就能获取到已提交但未启动的Container以及Container的更新状态,ApplicationMaster通过与NodeManager交互启动、停止Container,获取Container的状态。
ApplicationMaster可以向NodeManager发送StopContainerRequest来停止Container,该请求主要包含:Container ID,NodeManager通过StopContainerResponse回应,包含成功停止的Container以及每个失败请求中Container ID到异常的映射。
当ApplicationMaster退出时,ResourceManager会杀死正在运行没有被ApplicationMaster显示终止的Container。
当Container结束时,ResourceManager以事件的形式通知ApplicationMaster,ResourceManager并不关心Container的状态。
更多hadoop生态文章见: hadoop生态系列
参考:
《hadoop yarn权威指南》《hadoop技术内幕深入yarn架构设计与实现原理》