YARN集群架构
1.组成
YARN集群总体上是经典的主/从(Master/Slave)架构,主要由ResourceManager、NodeManager、ApplicationMaster和Container组成。
2.集群架构图
3.各个组件的解析
1.ResourceManager
以后台进程的形式运行,负责对集群资源进行统一管理和任务调度。主要职责:
1.接受来自客户端(client)的请求
2.启动和管理各个应用程序的ApplicationMaster
3.接收来自ApplicationMaster的资源申请,并为其分配Container
4.管理NodeManager,接收来自NodeManager的资源分配和节点健康情况汇报
2.NodeManager
集群中每个节点的资源和任务管理器,以后台进程的形式运行。他会定时向ResourceManager汇报本节点的资源(内存、CPU)使用情况和各个Container的运行状态,同时会接收并处理来自ApplicationMaster的Container启动/停止等请求。NodeManager不会监视任务,它仅仅监听Container中的资源使用情况,例如,如果一个Container消耗的内存比最初分配的多,他就会结束该Container。
3.Task
应用程序的具体执行任务,一个应用程序可能会有多个任务。
4.Container
YARN中资源分配的基本单位,封装了CPU和内存资源的一个容器,相当于是一个Task运行环境的抽象。从实现上看,Container是一个Java抽象类,定义了资源信息。应用程序的Task会发布到Container中运行,从而限定Task使用的资源量。Container的源码如下:
public abstract class Container implements Comparable<Container> {
public Container() {
}
@Private
@Unstable
public static Container newInstance(ContainerId containerId, NodeId nodeId, String nodeHttpAddress, Resource resource, Priority priority, Token containerToken) {
Container container = (Container)Records.newRecord(Container.class);
container.setId(containerId);
container.setNodeId(nodeId);
container.setNodeHttpAddress(nodeHttpAddress);
//Resource是Container类中定义的一个重要的属性类型,内存和CPU的资源信息就是存储在Resource类中。Resource类也是一个抽象类,其中定义了内存和CPU核心数
container.setResource(resource);
container.setPriority(priority);
container.setContainerToken(containerToken);
return container;
}
Resource类的源码如下:
public abstract class Resource implements Comparable<Resource> {
@Public
@Stable
public static Resource newInstance(int memory, int vCores) {
Resource resource = Records.newRecord(Resource.class);
resource.setMemory(memory);
resource.setVirtualCores(vCores);
return resource;
}
Container的大小取决于她所包含的资源量。一个节点上的Container数量由节点空闲资源总量(总CPU数和总内存数)决定的。
5.ApplicationMaster
应用程序管理者,主要负责应用程序的管理,以后后台的形式运行。为应用程序向ResourceManager申请资源(CPU、内存),并将资源分配给所管理应用程序的Task。
一个应用程序对应一个ApplicationMaster,在用户提交一个应用程序时,会启动一个ApplicationMaster实例,ApplicationMaster会启动所需要的Task来完成他负责的应用程序,并监视Task运行状态和运行进度。应用程序运行完成后,ApplicationMaster会关闭自己并释放自己的Container,以便其他应用程序的ApplicationMaster或Task转移至Container中运行,提高资源利用率。
总结:
ResourceManager管理整个集群,NodeManager管理集群中单个节点,ApplicationMaster管理单个应用程序