热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

NodeManager专区NodeManager的基本特性和概述

概述NodeManager是运行在单个节点上的代理,它需要与应用程序的ApplicationMaster和集群的管理节点ResourceManager交互࿱

概述

       NodeManager是运行在单个节点上的代理,它需要与应用程序的ApplicationMaster和集群的管理节点ResourceManager交互:从ApplicationMaster上接收有关的container的命令并执行;向ResourceMansger汇报各个container运行状态和节点健康状况,并领取有关container的命令执行

       NodeManager是yarn中单个节点上的代理,它管理hadoop集群中单个计算节点,功能包括与ResourceManager保持通信、管理container和生命周期、监控每个container的资源使用情况、追踪节点健康状况、管理日志和不同应用程序用到的附属服务。


NodeManager职能

1、ResourceTrackerProtocol协议
       NodeManager通过该RPC协议向ResourceManager注册、汇报节点健康状况和container运行状况,并领取ResourceManager下达的命令,包括重新初始化、清理container占用资源等。在该RPC协议中,ResourceManager扮演RPC Server的角色,而NodeManager扮演PRC
client的角色,NodeManager总是周期性的主动向ResourceManager发送请求,并领取下达给自己的命令。ResourceTrackerProtocol协议主要提供了以下2个RPC函数

registerNodeManager
       NodeManager启动时通过该RPC函数向ResourceManager注册,注册信息由register-NodeManagerRequest封装的,包括3部分


  • httpPort: 该NodeManager对外提供的HTTP端口号,ResourceManager会在界面上提供一个可直接访问NodeManager web界面的超链接
  • NodeId: 该NodeManager所在的host和对外的RPC端口号
  • totalResource: 该NodeManager所在节点总的可分配资源,当前支持内存和虚拟CPU两种资源,管理员可通过参数yarn.nodemanager.resource.cpu-vcores和yarn.nodemanager.resource.memory-mb还可以通过参数yarn.nodemanager.vmem-pmem-ratio设置物理内存和虚拟内存使用比率,默认是2.1,即每使用1MB物理内存,最多可以使用2.1MB虚拟内存

       ResourceManager将还通过registerNodeManager函数向NodeManager返回一个Resister-NodeManagerResponse类型的对象,主要包含以下信息:


  • MasterKey: 新生成的container Token和Node Token的Master Key
  • NodeAction: ResourceManager向该NodeManager返回的下一步操作,主要包含NORMAL、RESYNC和SHUTDOWN三种,分别表示正常、重新同步信息和停止运行
  • rmIdentifier: ResourceManager的标识符。NodeManager通过该标识符判断ApplicationMaster发送的container来自原始的还是新启动的ResourceManager
  • diagnosticsMessage:NodeManager注册失败时,将收到一段诊断信息,告知具体的失败原因

nodeHeartbeat
       NodeManager启动后,定期通过该RPC函数向ResourceManager汇报container运行信息和节点健康状况,并领取新的命令,比如杀死一个container

2、ContainerManagermentProtocol协议
        应用程序的ApplicationMaster通过该RPC协议向NodeManager发起针对Container的相关操作,包括启动container、杀死container、获取container执行状态等。在该协议中,ApplicationMaster扮演RPC client的角色,而NodeManager扮演RPC server的角色,NodeManager与ApplicationMaster之间采用了Push模型,ApplicationMaster可以将container相关操作第一时间告诉NodeManager,相比Pull模型,可大大降低时间延迟,ContainerManagmentProtocol协议主要提供了三个RPC函数


  • startContainer: ApplicationMaster通过RPC要求NodeManager启动一个container,该函数有一个startContainerRequest类型的参数,封装了Container启动所需的本地资源,资源变量、执行命令、Token等信息。如果Container启动成功,则该函数返回一个StartContainerRequest对象
  • stopContainer: ApplicationMaster通过该RPC要求NodeManager停止(杀死)一个container。该函数有一个StopContainerRequest类型的参数,用于指定待杀死的ContainerID。如果Container被成功杀死,则该函数返回一个StopContainerRequest对象
  • getContainerStatus: ApplicationMaster通过该RPC获取一个Container的运行状态,该函数参数类型为GetContainerStatusReuqest,封装了目标Container的ID,返回值为封装了Container当前运行状态的类型为GetContainerStatusResponse的对象

NodeManager架构


  • NodeStatusUpdater: NodeStatusUpdater 是NodeManager与ResouceManager通信的唯一通道,当NodeManager启动时,该组件负责向ResouceManager注册,并汇报节点上总的可用资源,之后该组件周期性与ResouceManager通信,汇报各个container的状态更新,包括节点上正运行的container,已完成的container等信息,同时ResouceManager会为之返回待清理container列表、待清理应用程序列表、诊断信息、各种Token等信息
  • ContainerManager: ContainerManager是NodeManager中最核心组件之一,它由多个子组件构成,每个子组件负责一部分功能,协作共同管理运行在该节点上的所有container。 各个子组件如下
    • RPC Server: 该RPC Server实现了ContainerManagerProtocol协议,是ApplicationMaster与NodeManager通信的唯一通道,ContainerManager从各个ApplicationMaster上接收RPC请求以启动新的Container或者停止正在运行的Container。需要注意的是,任何Container操作均会经ContainerTokenSecretManager合法性验证,以防止ApplicationMaster伪造启动或者停止Container命令
    • ResourceLocalizationService: 负责Container所需要资源的本地化,它能够按照描述从HDFS上下载container所需额文件资源,并尽量将它们分摊到各个磁盘上以防止出现访问热点,此外,它会为下载的文件添加访问控制限制,并为之施加合适的磁盘空间使用份额。
    • ContainersLauncher: 维护了一个线程池以并行完成Container相关操作,比如启动或者杀死container,其中启动Container请求是由ApplicationMaster发起的,而杀死Container请求则可能是来自ApplicationMaster或者ResourceManager。
    • AuxServiceS: NodeManager允许用户通过配置附属服务的方式扩展自己的功能,这使德每个节点可以定制一些特定框架需要的服务,当然,这些服务是与NodeManager上其他服务隔离开的,附属服务需要在NodeManager启动之前配置好,并有NodeManager统一启动与关闭,典型的应用是MapReduce框架中用到的shuffle HTTP Server,其是通过封装成一个附属服务而有各个NodeManager启动的
    • ContainersMonitor: ContainersMonitor负责监控Container的资源使用率,为了实现资源隔离和公平共享,ResouceManager为每个Container分配了一定量的资源,而ContainersMonitor周期性探测它在运行过程中的资源利用量,一旦发现Container超出了它的允许使用份额上限,就向Container发送信号将其杀掉,这可以避免资源密集型的container影响同节点上其他正在运行的container。在YARN中,只有内存资源是通过ContainerMonitor监控的方式加以限制的,对于CPU资源,则采用了轻量级资源隔离方案Cgroups
    • LogHandler: 一个可插拨组件,用户可通过它控制container日志保存方式,可以是写本地磁盘上还是将其报告上传到一个文件系统中。
    • ContainerEventDispatcher: Application事件调度器,负责将ContainerEvent类型的事件调度给对应Container的状态机containerImpl
    • ApplicationEventDispatcher: application事件调度器,负责将ApplicationEvent类型的事件调度给对应Application的状态机ApplicationImpl
  • ContainerExecutor: ContainerExecutor可与底层操作系统交互,安全存放container需要的文件和目录,进而以一种安全的方式启动或者清除container对应的进程,目前,YARN提供了DefaultContainerExecutor和LinuxContainerExecutor两种实现。其中,DefaultContainerExecutor是默认实现,未提供任何权限安全措施,它以NodeManager启动着的身份启动和停止Container,而LinuxContainerExecutor则以应用程序拥有者的身份启动和停止container,因此更加安全,此外linux-ContainerExector允许用户通过Cgroup对CPU资源进行隔离
  • NodeHealthCheckerService: NodeHealthCheckerService通过周期性地运行一个自定义脚本和向磁盘写文件检查节点的健康状况,并将之通过NodeStatusUpdater传递给ResourceManager,一旦ResourceManager发现一个节点处于不健康状态,则会将它加入黑名单,此后不再为它分配任务,直到再次转为健康状态,需要注意的是,节点被加入黑名单后,正在运行的Container仍会正常运行,不会被杀死
  • DeletionService: NodeManager将文件删除功能服务化,即提供一个专门的文件删除服务异步删除实效文件,这样可避免同步删除文件带来的性能开销
  • Security: 安全模块是NodeManager中的一个重要模块,它包含两部分,分别是ApplicationACLsManager:确保访问NodeManager的用户是合法的,ContainerTokenSecrentManager:确保 用户请求的资源被ResourceManager授权过,具体如下:
    • ApplicationACLsManager: NodeManager需要为所有面向用户的API提供安全检查,如在Web UI上只能将Container日志显示给授权用户,该组件为每个应用程序维护了一个ACL列表,一旦收到类似请求后会利用该列表对其进行验证
    • ContainerTokenSecretManager: 检查收到的各种访问请求是合法性,确保这些请求操作已被ResourceManager授权
  • WebServer: 通过Web界面向用户展示该节点上所有应用程序运行状态、container列表、节点健康状况和container产生的日志等信息。

NodeManager事件与事件处理器

       NodeManager中主要组件之间是通过事件进行交互的,这使得多个组件可异步并发完成各自的功能,总体上讲,NodeManager中存在两个中央异步调度器,分别位于NodeManager和ContainerManagerImpl中,它们内部均包含一些事件处理器,这些事件处理器处理的事件类型和事件传递方式如下表格。


组件名称事件处理器/服务处理的事件类型输出事件类型
NodeStatusUpdater服务-ContainerManagerEventType
ContainerManager事件处理器服务ContainerManagerEventApplicationEventType、ContainerEventType
ResourceLocalizationService事件处理器服务LocalizationEventApplicationEventType、ResourceEventType、ContainerEventType
ContainersLauncher事件处理器服务ContainersLauncherEvent-
AuxServices事件处理器服务AuxServicesEvent-
ContainerMonitor事件处理器服务ContainerMonitorEventApplicationEventType、ContainerEventType
LogHandler事件处理器服务LogHandlerEventApplicationEventType
ContainerEventDispatcher事件处理器ContainerEvent-
ApplicationEventDispatcher事件处理器ApplicationEvent-
ContainerExecutor服务-ContainerEvent
NodeManager事件处理器服务NodeManagerEventContainerManagerEventType

NodeManager内部事件与事件处理器交互图

更多内容关注公众号"数据专场"
在这里插入图片描述


推荐阅读
author-avatar
听天由命____497
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有