1. Yarn有两个核心长时间运行的守护程序:ResourceManager、NodeManager:
1.1 ResourceManager:
主要负责全局的资源管理,整个集群只有一个,主要有ApplicationManager和scheduler两个主要的组件:
1.1.1 ApplicationManager
- 主要负责管理已经提交的程序,在程序提交之后,ApplicationManager首先会检查集群现有的资源是否能够满足程序申请的资源;
- 然后确保没有其他的程序使用相同的ApplicationId;
- 最后,就会将提交的程序交给scheduler;
- ApplicationManager会分配第一个Containre来运行ApplicationMaster;
- 负责监控ApplicationMaster,在遇到失败时重启ApplicationMaster运行的Container;
- 除此之外,ApplicationManager还会在程序完成之后,在ResourceManager内存清除之前记录和管理这些已经完成的程序。
1.1.2 Scheduler
- ResourceManager专门进行资源管理的一个组件,负责分配NodeManager上的Container资源,可超拔的,不能重启因应用失败或者硬件错误而运行失败的任务;
- 主要有三种调度模式:Capacity Scheduler、Fair Scheduler和FIFO Scheduler。
1.2 NodeManager
1.2.1 主要功能:
- 运行在每个节点上,主要负责节点上container中的进程运行监控;
- 负责接收ResourceManager的资源分配请求,分配具体的container给应用(application);
- 负责与ResourceManager通信,上报自己的运行状态(自己的资源等信息)和任务状态,resourceManager通过收集每个NodeManager的信息来追踪整个集群是否是健康的,管理每个节点上的日志;
- 当一个节点启动之后,会向ResourceManager主动报告自己所有的资源;
- NodeManager只负责管理自身的Container,并不了解运行在上面的应用的信息,也就是说NodeManager监控的是节点的资源状态,并直接与ResourceManager沟通,负责管理应用的是ApplicationMaster;
- 其他的附属功能,例如MR中的shuffle。
1.2.2 主要组件
1.2.2.1 NodeStatusUpdater**:
在NodeManager启动时,该组件就会自动的向ResourceManager注册,并发送节点上可用的资源,NodeManager会通过心跳机制向ResourceManager通信,汇报各个Container的状态更新,包括节点上正在运行的container和已经完成的container。ResourceManager可以通过NodeStatusUpdater发送信号,用于杀死正在运行的container。
1.2.2.2 ContainerManager:
NodeManager中核心组件,主要由RPC server、ResourceLocalizationService 、ContainersLauncher、AuxServices、ContainersMonitor组成,ContainerManager实际上是个接口,真正的实现是ContainerManagerImpl类。
-
RPC Server:
ContainerManager从各个ApplicationMaster上接收RPC请求以启动container或者停止正在运行的Container,与ContainerTokenSecretManager合作,对所有请求进行合法性验证,所有作用在正在运行Container的操作都会写入到audit-log。RPC Server实际是RPC协议ContainerManager的server,AM可通过该协议通知某个节点启动或者释放container,ContainerManager定义了三个接口供AM使用:
StartContainerResponse startContainer(StartContainerRequest request); //启动container StopContainerResponse stopContainer(StopContainerRequest request); //释放container GetContainerStatusResponse getContainerStatus(GetContainerStatusRequest request);//获取container列表。
-
ResourceLocalizationService:
负责(从HDFS上)安全地下载和组织Container需要的各种文件资源,尽量将文件均匀的分摊到各个磁盘上,同时为下载的文件添加权限访问。
-
ContainersLauncher
维护一个线程池,随时准备启动container,当收到来自ResourceManager或者ApplicationMaster的清理container的请求的时,清理对应的container。
-
AuxServices
NodeManager提供了一个框架以配置附属服务扩展自己的服务,允许每个节点定制一些特定框架可能需要的服务,与NodeManager其他服务之间是隔离的。注意附属服务需要NodeManager启动之前就配置好,并由对应的应用程序的运行在本节点上的第一个Container触发启动。
-
ContainerMonitor
当一个container启动之后,该组件就会开始监控它在运行过程中的资源利用率,ResourceManager为了实现资源的隔离和公平分配,会为每一个container分配一定的资源。ContainerMonitor会在container使用的资源超过其允许的使用份额时,就会向container发送信号将其杀掉,从而避免其影响同一节点上其他的container的运行。ContainerMonitor也是一个接口,具体实现为ContainerMonitorImpl类。NodeManager启动一个container之后,ContainerMonitor会将container进程对一个pid添加到监控列表中,以监控以pid为根的真个进程树的使用资源情况,他周期性的从/etc/proc中获取进程树的使用的总资源,如果超过预期值,则会将其杀死。最新版中,使用Linux container对资源进行隔离。
-
LogHandler
可插拔组件,使用其可以选择将container日志写到本地磁盘还是将其打包之后上传到一个系统中。
-
1.2.2.3 ContainerExecutor:
与操作系统进行交互,存放container需要的文件和目录,进而以一种安全的方式启动和清楚container对应的进程。新版中,使用linux container对资源进行隔离。
1.2.2.4 NodeHealthCheckerService:
通过周期性地运行一个配置好的脚本检查节点的健康状况,同时也会周期性的在磁盘上创建临时文件一监控磁盘的健康状况。注:任何系统健康方面的改变都会通知NodeStatusUpdater,其会将信息传递给ResourceManager。
1.2.2.5 Security:
- ApplicationACLsManager NM需要为所有面向用户的API提供安全检查,如在Web-UI上只能将container日志显示给授权用户。该组件为每个应用程序维护了一个ACL列表,一旦收到类似请求后会利用该列表对其进行验证。
- ContainerTokenSecretManager 检查收到的各种访问请求的合法性,确保这些请求操作已被RM授权。
1.2.2.6 WebServer:
在给定时间点,展示该节点上所有应用程序和container列表,节点健康相关的信息和container产生的日志。
1.2.3 补充:
-
启动Container:
为了能够启动Container,NodeManager期望收到的container定义了关于它运行时所需的详细信息,包括:container命令、环境变量、所需的资源列表和安全令牌等等。一旦收到了container启动请求,如果yarn启用了安全模式,则NodeManager会首先验证请求的合法性以及对用户和正确的资源进行授权,然后开始启动container:
- 在本地拷贝一份运行container所需的所有资源(Distributed Cach额)
- 为container创建隔离的工作目录,并在这些目录中准备好所有的资源
- 运行命令启动container
-
日志收集
将所有的日志上传到每一个文件系统,例如HDFS,在某个NodeManager上,所有属于同一个应用程序的container日志经聚集后被写到一个FS上日志文件中,可以通过Yarn命令、WEB_UI或者直接通过FS访问这些日志。
-
附属服务
例如MR中的shuffle就是通过附属服务实现的,该股无回启东一个Netty server,其就会处理来自Reduce Task的MR相关的shuffle请求,MR和ApplicationMaster为shuffle服务定义了服务ID,和可能需要的安全令牌,二NodeManager向ApplicationMaster提供shuffle服务的运行端口号,并由ApplicationMaster传递给各个ReduceTask。
1.3 Container
-
Yarn对于计算机资源的抽象,包括一组CPU、内存,具体的任务运行在Container中,具体执行任务(task)基本单元,与节点的关系:
-
一个节点可以有多个container,但是不存在跨节点的container;
-
在Yarn框架中,ResourceManager只负责告知ApplicationMaster哪些container是可以使用的,ApplicationMaster需要找NodeManager请求分配具体的container;
1.4 ApplicationMaster
- 每一个具体的应用(application)都有一个ApplicationMaster实例;
- 与ResourceManager通信请求资源,来获得具体的运行的任务;
- 负责container的请求、发布、监控任务运行状态,遇到失败的任务还负责重启它,注意ApplicationMaster负责的是监控应用程序的状态,Nodemanager负责监控的是整个节点的资源使用情况。