前面在hadoop之yarn详解(基础架构篇)这篇文章提到了yarn的重要组件有ResourceManager,NodeManager,ApplicationMaster等,以及yarn调度做业的运行过程,Yarn将它的功能分为两层:负责资源管理的平台层,叶称为第一层调度,以及二级调度的框架来协调应用程序的执行。运行在独立节点上的ResourceManager和NodeManager一块儿组成了yarn的核心且构成这个平台,ApplicationMaster和相应的Container一块儿组成了yarn的应用程序。那么这些组件具体的包含一些什么呢?又是根据什么通讯的呢?html
这篇文章主要进一步阐述yarn几个重要组件的重要成分,以及各个部分之间的通讯状况。node
ResourceManager主要涉及到与客户端、ApplicationMaster以及NodeManager的通讯组件、一些重要的组件,如ApplicationManager,scheduler等、以及安全相关组件。web
该服务实现了基本的客户端到ResourceManager的接口ApplicationClientProtocol。该组件处理全部来自客户端到Resourcemanager的远程调用(RPC)通讯。主要有以下操做:sql
一、应用程序的提交
二、应用程序的终止
三、获取应用程序,队列,集群统计,用户ACL及更多信息
四、在安全模式下,Client Server确保全部来自用户的请求都已认证过(好比kerberos认证),对于不能经过kerberos认证的,则经过resourcemanager代理令牌进行安全通讯缓存
为了确保管理员的请求不会被用户请求所有占有,提升优先级的操做指令。该组件的的通讯协议是ResourceManagerAdministrationProtocol,主要包括以下一些操做:安全
一、刷新队列:好比对队列的增长,中止,属性修改
二、刷新ResourceManager节点列表:好比增长和移除节点
三、添加新用户,添加/更新管理员的ACL,修改超级用户列表等网络
管理每一个应用程序的ACL,确保它们获得实施。能够配置参数yarn.acl.enable为true开启应用程序的ACL架构
ResourceManager有一个web应用程序用来输出集群的状态信息,指标,节点活跃列表,健康,非健康节点列表。应用程序的列表,它们的状态和结果。app
咱们知道应用程序主要有ApplicationMaster进行监控,因此在这里Resourcemanager与应用程序的交互主要是与ApplicationMaster的交互。框架
该组件响应来自全部的ApplicationMaster的请求,实现了ApplicationMasterProtocol协议。这是ApplicationMaster和Resourcemanager通讯协议,该组件的主要任务以下:
一、注册新的ApplicationMaster
二、来自任意正在结束的ApplicationMaster的终止/取消注册请求
三、认证来自不一样ApplicationMaster的请求,确保只有合法的ApplicationMaster发送请求给ResourceManager中的应用程序
四、获取来自全部运行ApplicationMaster的container的分配和释放请求,异步转发给yarn调度器
五、该组件还确保在任意时候任意ApplicationMaster只有一个线程能够发送请求给ResourceManager
这个监视器跟踪每一个ApplicationMaster的最后心跳时间,若是在指定时间间隔内(默认10分钟)没有产生心跳,则在ResourceManager认为该ApplicationMaster超时,而且,全部分配给该ApplicationMaster的container也会被标记为死亡,Resourcemanager会在一个新的container中从新调用一个ApplicationMaster实例,默认两次重试
该组件负责响应来自全部节点的RPC调用(心跳),实现了ResourceTracker接口并和全部的NodeManager通讯。主要负责:
一、注册新节点
二、接收前面注册节点的心跳
三、确保只有“合法”的NodeManager和ResourceManager通讯
该组件会跟踪每个节点的标识符(ID)和它最后的心跳时间,在指定时间间隔(10分钟)内没有向Resourcemanager发送心跳,Resourcemanager会认为该NodeManager死亡,在当前节点的container也会被标记为死亡,而不糊有新的container在该节点被调度了,一旦该节点从新启动,并注册,就回从新参与调度
该组件是ResourceManager在内存中的一个集合,包括有效的节点和被排除的节点,经过读取yarn.resourcemanager.nodes.include-path和yarn.resourcemanager.nodes.exclude-path查看主机配置,根据这些文件初始化节点列表。
该组件负责管理已提交应用程序的集合,在应用程序提交后,检查是否合法,是否有节点有足够的资源运行ApplicationMaster,是有应用程序ID有冲突,若是有一个不符合要求,则会拒绝ApplicationMaster的启动。
负责记录和管理已结束的应用程序,过一段时间才从ResourceManager中清除,保存一个已经结束应用程序的缓存,以便用户请求这些应用程序的数据,yarn.resourcemanager.max-completed-applications配置存储已结束的应用程序的最大数量。
ResourceManager申请container,并在NodeManager上准备和启动ApplicationMaster,而其余的container都是由ApplicationMaster发起的。该组件主要维护一个线程池来设置环境,且和NodeManager通讯拉起提交应用程序的ApplicationMaster。也会在一个程序正常结束做者要强行终止时。负责告诉NodeManager来清理ApplicationMaster--主要是杀掉主要进程
负责给正在运行的应用程序分配资源,是基于应用程序的资源需求来执行调度功能,这些资源包括内存,cpu等,后期会有磁盘以及网络,GPU等。
负责确保Container最终被ApplicationMaster使用,并在相应的NodeManager上拉起,该组件包含一个已分配但尚未在相应的NodeManager上启动的Container列表,对任意的Container,在指定的时间间隔(默认10分钟)内,若是相应的NodeManager尚未报告给ResourceManager该Container已经运行,则在ResourceManager中断定该Container死亡且超时。
ResourceManager有一系列的安全组件叫作SecretManager,负责管理令牌和私钥,这些令牌和私钥用来对各个RPC接口上的请求进行认证和受权。
负责管理ContainerToken,ResourceManager提供个ApplicationMaster的一个特殊令牌集合,这样ApplicationMaster能够在特定的节点上申请Container,在一个Container启动以前,咱们不能信任ApplicationMaster传递正确的信息到NodeManager。为了不这个问题,ResourceManager发送给ApplicationMaster以前在Container令牌里加密了Container的相关信息,一个Container的令牌主要包括以下内容:
一、Container ID
二、NodeManager地址
三、应用程序提交者
四、资源(内存,CPU等)
五、超时时间戳
六、主键标识符
七、ResourceManager标识符
只有ApplicationMaster能够以Container的形式请求资源,为了不恶意程序模拟ApplicationMaster请求资源,ResourceManager使用AMRMToken令牌,每个ApplicationAttempt对一个令牌,秘钥管理器在本地内存中保存每一个令牌知道ApplicationMaster结束,在此期间,能够用这些令牌认证来自ApplicationMaster进程请求。
来个启动Container的请求进行受权,这些请求来自ApplicationMaster。只有在启动Container而创建的ApplicationMaster到NodeManager的链接中有效。
该组件是ResourceManager代理令牌的秘钥管理器,负责给客户端生成代理令牌,该令牌能够传递给想要和ResourceManager通讯可是没有通过Kerberos认证的应用程序
在安全模式下,ResourceManager是经过Kerberos认证的,且提供应用表明程序跟新文件系统令牌服务
一、保持与ResourceManager同步
二、跟踪节点的健康情况
三、管理节点各个Container得我生命周期,监控每一个Container的资源使用状况
四、管理分布式缓存(对Container所需的Jar,库文件的本地文件系统缓存)
五、管理各个Container生成日志
六、不一样的yarn应用程序可能须要的辅助服务
在NM刚启动的时候,该组件会向ResourceManager注册,发送本节点的可用资源,以及NodeManager的Web Server和RPC Server的监听端口,在注册的过程当中,向NodeManager发出安全相关的key,NodeManager将这个key做为ApplicationMaster的请求Container认证,后续通讯则是向ResourceManager更新Container的信息。而ResourceManager能够经过该组件通知NodeManager杀死某个正在运行中的Container。只要ResourceManager上的任何应用程序的结束,都会想NodeManager发出信号,要求清理该应用程序在本节点上对应的资源,而后发起应用程序日志的聚合。
是NodeManager的核心组件,包含多个子组件,各个子组件分担管理运行在节点上的Container所须要的功能。
负责安全的下载和组织Container所要的各类文件资源,会尽量的将文件分散到各个能够磁盘上,还强制对下载文件进行访问控制,并适当加入使用率限制。
维护一个线程池,用于尽快的准备和拉起Container,以及用于清理须要清理的Container进程
在Container的整个运行过程当中监控它的资源使用率,每一个Container都被ResourceManager分配必定的资源,若是Container超出了资源的分配值,该组件就会杀死该Container,避免不受控制的Container影响同一个节点上的正常Container的运行。
保存Container的日志在本地磁盘上,或者将它们打包上传到一个文件系统上
与底层操做系统交互,安全的放置Container所须要的文件和目录,随后以一个安全的方式启动和清理Container相关进程
按期运行脚本对接点健康进行检查,任何健康值的改变都会发给NodeStatusUpdater,并传给ResourceManager
Application ACLs Manager:
NodeManager须要对用户API设置门禁指定某些用户访问
ContainerToken SecretManager:
同ResourceManager中的同样,验证各类请求,确保Container的请求是ResourceManager受权的
MNToken SecretManager :
验证全部来自于API的请求,保证这些请求都是MNToken认证的
Web Server:
展现在给定时间点,一个节点上运行的应用程序和Container列表,节点健康度相关信息,以及Container生成的日志。
还有些RPC相关组件以及辅助功能的组件。
一、初始化后向ResourceManager报告本身活跃信息的进程
二、计算应用程序的资源需求
三、将资源需求转换为yarn调度器能够识别的ReqsourceReqest
四、与调度器协调申请资源
五、与NodeManager合做使用分配的Container
六、跟踪Container的状态,监控它们的进程
七、对Container或节点失败的状况进行处理,在必要状况下从新申请资源
一、当ApplicationMaster启动以后会向ResourceManager进行注册,在注册的过程当中,会告诉ResourceManager它本身的IPC地址和网页URL,IPC地址是面向客户端的服务地址,URL方便客户端经过HTTP获取应用程序的状态和信息。
二、在相应注册的时候,ResourceManager会给ApplicationMaster返回一些有用的信息,如Yarn接收资源大小的范围,与用户提交应用程序相关的ACL。
三、注册成功后,ApplicationMaster周期性的向ResourceManager发送心跳确认本身的活跃状态和将康状态,若是在指定时间内(默认10分钟,由参数yarn.am.liveness-monitor.expiry-interval-ms控制)没有发送心跳给ResourceManager,则认为中止,将会被杀死,在配置该参数的时候,要考虑这个参数不能大于ApplicationMaster所在该节点失效的时间,节点失效的时间由参数yarn.nm.liveness-monitor.expiry-interval-ms控制,默认也是10分钟
一、ApplicationMaster成功稳定的运行后,应用程序须要弄清楚本身的资源需求,是动态的呢,仍是静态的。
静态资源指的是在提交申请的时候,大多数状况由客户端肯定,并且ApplicationMaster运行后就不会改变了。
动态资源指的是在运行的过程当中肯定请求资源的数量。
当资源需求明确后,ApplicationMaster就会发送请求到调度器,而后安排分配的Container进行所需的工做
二、明确资源需求后,ApplicationMaster经过调用API allocate向ResourceManager请求资源,这里每一个ApplicationMaster中只有一个线程能够调用API allocate,这些调用在ResourceManager中被串行化,解决多个线程调用请求资源,致使每一个线程看到ResourceManager的全局资源不一致的问题。
三、在请求资源的过程当中,ApplicationMaster经过一系列的resourceAsks,Container ID,或containerToBeReleased的ResourceRequest请求特定的资源,containerToBeReleased指的是以前调度器已经分配可是如今不须要的Container,其中响应信息会包括新分配的Container列表,自从ApplicationMaster和ResourceManager上次的交互完成的应用程序相关Container状态,集群可用资源的使用上限。ApplicationMaster能够根据Container的状态,收集Container完成的信息,处理失败的Container。
ApplicationMaster请求和调度资源的方式有两种:
告知ResourceManager全部的资源需求,让全局调度器作决定
与ResourceManager交互,让调度器采起全局调度,并根据资源的可用性和应用程序的业务逻辑性,对分配的Container再一次调度。
四、请求后,ApplicationMaster将收到以Container形式分配的特定节点的资源,基于从ResourceManager获得的Container,ApplicationMaster能够为其执行计划的一部分的任务分配Container,若是资源不够用,则ApplicationMaster会继续请求资源,若是资源知足时,更新请求发送给ResourceManager。
在ApplicationMaster请求资源的过程当中,ApplicationMaster负责计算应用程序的资源需求,并把它们转换为调度器可以理解的ResourceRequest对象。该对象会包括以下要素:
一、请求的优先级
二、请求资源的位置,机架,机器名等
三、资源大小,天天Container的大小
四、Container的数目
五、布尔变量(relaxLocality,默认为true)表示是否本地松弛,指本地没有资源能够请求同机架的机器资源
在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架构设计与实现原理》