用户和平台第一交互点为客户端和ResourceManager的交互,涉及以下组件
该组件处理所有客户端到ResourceManager的远程过程调用(RPC)通信,包括:
ClientService在安全模式下确保用户请求都经过认真,且通过访问控制列表对用户进行授权。不支持认证的客户端也提供了ResourceManager代理令牌
管理员的操作需要比一般用户优先级更高,因此设计该接口,可以处理以下的操作:
管理每个应用程序的ACL,用户可以通过ApplicationSubmissionContext信息的一部分指定ACL
应用程序被接纳后,它负责拉起ApplicationMaster的状态机,ApplicationMaster启动后和ResourceManager通过以下组件通信
负责响应ApplicationMaster的所有请求,实现ApplicationMasterProtocol协议,负责以下任务:
ApplicationMaster Service保证ApplicationMaster任意时间点只有一个线程向ResourceManager发送请求
跟踪每个ApplicationMaster以及它最后的心跳时间,超过设定值没有心跳的ApplicationMaster被认为死亡
ResourceManager和节点通信涉及的组件如下
个人感觉类似于ApplicationMaster Service,主要负责:
新节点注册后,ResourceManager发送安全相关的主键,NodeManager需要验证ApplicationMaster提交的NodeManager令牌和Container令牌,主键会滚动更新,在心跳中NodeManager会获得这些更新
Rosource Tracker Service转发合法的心跳给YARN调度器,YARN调度器根据资源请求做调度决定
跟踪每个节点的标识符和最后心跳信息,最后心跳时间超时的节点被标记为死亡
是ResourceManager内存中的一个集合,包括有效的节点和被排除的节点
除了与外界通信的不同组件,还有一些核心组件如下
负责管理已经提交的应用程序集合。检查应用程序规格,拒绝资源请求不合法的应用,然后确定应用程序ID是否已经被使用,最后把应用程序转给调度器
该组件还负责记录管理结束的应用程序,在日志中记录ApplicationSummary
保存一个已结束应用程序的缓存,以便用户请求应用程序的数据
ApplicationMaster本身的Container是ResourceManager申请并在NodeManager上拉起的,该组件维护一个线程池且和NodeManager通信来拉起Applicationmaster(新的或之前失败的ApplicationMaster),它也在应用结束时告诉NodeManager清理ApplicationMaster
YARN调度器给运行的应用程序分配资源,默认调度器为Capacity调度器
为防止恶意程序申请Container而不使用,该组件包含一个分配但未启动的Container列表,超时不启动的Container被判定为死亡
安全组件负责管理令牌和私钥,对各个RPG接口的请求进行认证和授权
管理Container令牌,该令牌通过ApplicationMaster路由到NodeManager以防直接发送给NodeManager带来的显著延迟(只有Container分配后,ResourceManager才能生成ContainerToken)
ApplicationMaster可能传递错误信息给NodeManager伪造CPU或内核数量,因此ResourceManager在Container令牌里加密了Container相关信息,令牌包括下面字段:
为防止恶意程序模仿一个ApplicationMaster发送调度请求,ResourceManager使用AMRMToken令牌认证ApplicationMaster的请求
ApplicationMaster使用NMToken管理跟一个NodeManager的连接,该令牌由ResourceManager生成
负责给客户端生成令牌,由此令牌和ResourceManager通信
在安全模式下,ResourceManager通过Kerberos认证,且提供代表应用程序更新文件系统令牌的服务,该组件负责在应用程序运行期间更新应用程序的令牌(不理解,存疑,待日后研究)
负责和ResourceManager通信
NodeManager刚启动时,该组件向ResourceManager注册,发送本节点的可用资源、Web Server和RPC Server的监听端口。ResourceManager发送用于验证Container的KEY。后续该组件还继续向ResourceManager提供Container的相关信息
ResourceManager还可以通过该组件通知NodeManager杀死Container。当应用程序结束时,ResourceManager都会通知NodeManager清理应用程序的资源,发起日志聚集
NodeManager的核心组件
负责和ApplicationMaster通信
接受ApplicationMaster关于Container的请求,和其他安全模块协同对请求进行认证和鉴权。记录Container的所有操作,并记录日志。
下载Container需要的文件资源,尽可能将文件分散到各个可用磁盘上,还对下载文件进行访问控制和使用率控制。PUBLIC的资源文件存储在公共缓存,通过一组称为Public-Localizer的线程池处理,该线程池运行在NodeManager内部的地址空间。PRIVATE的资源存储在用户缓存内,通过ContainerLocalizer的独立进程完成,并不在NodeManager内部完成
维护用于准备及拉起Container的线程池,该组件也负责Container的清理工作,每个Container操作都由一个线程独立完成,因此一个NodeManager内的所有Container是隔离的
可以在NodeManager启动前配置一组可插拔的辅助服务,例如,Map和Reduce任务间传输中间数据的ShuffleHandler。当应用程序的第一个Container启动、任何Container启动或完成、应用程序完成时,都要通知辅助服务
监控Container运行过程中的资源使用率,超出资源分配值的Container会被该组件杀掉
保存Container日志在本地磁盘或上传文件系统
放置Container需要的文件和目录,启动和清理Container相关进程
检测节点健康度,通过NodeStatusUpdater传递给ResourceManager
维护ACL
验证启动Container的请求是否合法(顾名思义应该是通过Token)
通过NMToken验证所有来自API的请求
展示在给定时间点的应用程序、Container列表、节点健康、Container日志等(应该是平时用于查询的网页端业务组价)
应用程序被提交后在ResourceManager中申请一个Container来启动引导进程。一旦分配了Container,ApplicationMaster的启动器将直接与NodeMaanger通信来启动该Container,整个ApplicationMaster生命周期内的与其他部分互动如图所示,注意ApplicationMaster本身也是一个Container
更详细的叙述上篇博文已经写过https://blog.csdn.net/jiangxuege/article/details/81558975
ApplicationMaster的第一个操作是向ResourceManager注册,告知ResourceManager它的IPC地址和网页URL。ResourceManager返回YARN接受的资源大小范围、应用程序的ACL等信息
注册成功后,ApplicationMaster需要发送心跳信息,心跳信息超时会被ResourceManager认为停止运行并被杀死
应用程序需要的资源分为静态和动态
在提交申请时能确定,且ApplicationMaster运行后不会产生变化的资源称为静态资源,否则称为动态资源
资源需求明确后,ApplicationMaster发送请求到ResourceManager的调度器请求分配Container
ApplicationMaster积累足够资源请求或计时器超时,就通过API allocate向ResourceManager发送心跳(不知道这里为什么又不以组件的方式讲了),任何时刻只有一个线程可以调用allocate
ApplicationMaster通过ResourceRequest请求特定资源,ResourceRequest可能包含resourceAsks、Container ID或containersToBeReleased(先前从调度器分配但现在不再需要的Container)。响应信息包含新分配的Container列表、自ApplicationMaster和ResourceManager上次交互以来完成的应用程序相关的Container状态、集群中可用资源。ApplicationMaster可以根据Container的相关信息进行相关操作,还可以根据集群资源调节未来资源请求
ApplicationMaster有两种方式请求调度资源:
资源请求时ResourceRequest包含以下要素:
启动Container前构造ContainerLaunchContext对象,该对象包括分配资源的大小、安全令牌、启动Container的执行命令、进程环境、必要文件等。ApplicationMaster通过NodeManager通信,逐一启动Container,也可以批量运行
NodeManager通过StartContainerResponse回应,该回应包含启动成功的Container列表、失败的Container ID异常、allServicesMetaData映射(附加服务的名字到它们相应的元数据,这是个啥,不明)
ApplicationMaster可以向NodeManager发送StopContainersRequest,NodeManager通过类似的StopContainersResponse回应,该回应包含成功停止的Container列表、每个失败请求的Container ID异常
ApplicationMaster退出时,ResourceManager杀死所有正在运行的Container
ResourceManager以事件形式通知ApplicationMaster某个Container结束,ApplicationMaster收集已完成的Container信息并进行后续处理
框架如果支持多个Container争夺资源或输出提交,ApplicationMaster为他们提供同步原语,以便只有一个Container抢占资源或输出
ApplicationMaster完成工作后,向ResourceManager发送FinishApplicationRequest注销,然后做一些清理工作
YARN中的Container代表在应用中的一个工作单元(说好的一种资源分配的形式呢),根据运行时是否可以解析,Container包括的信息分为静态信息和动态信息
静态信息如下:
动态信息如下:
Container并不向NodeManager汇报任何信息,也不需要向ApplicationMaster汇报信息,很多情况下Container只是独立地运行。如果应用程序需要通信,则需要将Container配置成某种进程间通信,与ApplicationMaster交互