深入解析yarn架构设计与技术实现-Node Manager
NodeManager主要有两个职责:
- 从ApplicationMaster上接收有关Container的命令并执行
- ContainerManagermentProtocol协议,AppliationMaster是rpc client,会主动将信息发送给NM,这个好处是降低时间延迟
- 主要是startContainer,stopContainer和getContainerStatus三个函数
- 向ResourceManager汇报各个container的状态并领取相关container命令
- ResourceTrackerProtocol协议,其中ResourceManager是RPC server,NM周期性同步状态和领取命令
- 主要是registerNodemanager和nodeHeartbeat两个函数
总体架构
NM总体上分为这么几个部分:
- NodeStatusUpdater:NM与RM通信的唯一通道。初次启动会注册NM,之后会与RM维持心跳
- ContainerManager:管理NM上的container,有多个模块,是NM最核心的部分,后面在container部分会细讲
- NodeHealthCheckerService模块:通过周期性运行自定义脚本(NodeHealthScriptRunner)和向磁盘写文件(LocalDirsHandlerService)检查节点健康状态。
- security:安全模块
- ApplicationACLsManager,确保NM的用户是合法的
- ContainerTokenSecrtManager,确保用户请求的资源被RM授权过
- webserver:通过web界面展示NM相关信息
- DeletionService:异步删除文件
节点健康状况管理
自定义脚本
通过设置yarn.nodemanager.health-checker.script.path
指定脚本路径。该脚本如果输出以ERROR为前缀的message,则认为节点处于不健康的状态,rm会将其加入blacklist。yarn.nodemanager.health-checker.interval-ms
设定脚本执行间隔.yarn.nodemanager.health-checker.script.timeout-ms
设定脚本超时间隔,在该时间内没有响应则任务节点处于不健康的状态。yarn-nodemanager.health.script.opt
可以向脚本传递参数
检测磁盘
通过设置yanr.nodemanagerdisk-health-checker.enable
可以设置开启监测磁盘损坏数目的功能,该功能有LocalirsHandlerService服务提供。因为程序中间运行结果和日志一般都存在本地磁盘,所以需要监控磁盘的执行情况。
分布式缓存机制
yarn的分布式缓存主要是将用户的应用执行时所需的外部文件自动透明的加载到NodeManager上的机制。比如下图,一个任务启动时,第1,3,6步都是需要和hdfs交互来上传或者下载文件的。
按照资源的可见性,NodeManager将资源分为3类:
public:只要有一个用户将这些资源下载到本地,则该机器上的所有应用都可以直接使用
private:资源被下载后该用户的所有应用都可以使用该资源
application:该节点的同一应用的所有container可以共享该资源
按照资源类型的不同,可以分为archive(.jar等,会自动解压),file(普通文件),Pattern(之前两种都有)。对于mr来说,可以通过addCacheArchive(),addCachefile()等函数设置需要分布式缓存的文件。
在yarn-site.xml中,可以挂载很多硬盘,设置多个路径,如
|
|
就是挂载了7块硬盘,NodeManager通过轮询的方式将三类资源放在上面配置的路径中:
- public资源,放在
${yarn.nodemanager.local-dirs}/local-dirfilecache
目录下,资源权限为755 - private资源,放在
${yarn.nodemanager.local-dirs}/usercache/${user}/filecache
文件夹下,${user}
是应用的提交者。权限为710 - application资源,存放在
${yarn.nodemanager.local-dirs}、usercache/${user}/${appcache}/${appid}/filecache/
下。权限为710 - container的工作目录:在
${yarn.nodemanager.local-dirs}、usercache/${user}/${appcache}/${appid}/${containerid}
下,在container运行过程中需要用到的jar包等,会通过软连接连接到对应资源
public资源通过ResourceLocalizationService的PublicLocalizer下载,private和application资源通过ResourceLocalizationService的LocalizerRunner(每个container对应一个线程)下载.
过期缓存会被定时删除,时间有yarn.nodemanager.localizer.cache.cleanup-interval-ms决定。而container输出的中间数据会在application整个都结束时才统一清理,这是为了避免application内的container间的数据依赖(如reduce依赖map的输出)。
日志文件相对简单,存在${yarn.nodemanager.log-dirs}/${appid}/${containerid}
下。日志的清理机制分为定期删除(保留时间由yarn.nodemanager.log.retain-seconds
决定)和日志转存(yarn.log-aggregation-enable
开启)两种。
本文采用创作共用保留署名-非商业-禁止演绎4.0国际许可证,欢迎转载,但转载请注明来自http://thousandhu.github.io,并保持转载后文章内容的完整。本人保留所有版权相关权利。
本文链接:http://thousandhu.github.io/2016/08/22/深入解析yarn架构设计与技术实现-NodeManager1/