YarnScheduler是Yarn所有调度器必须实现的接口,因此,分析它所用的类对于理解调度器的功能,为以后自定义调度器打下了基础。
1. QueueInfo
QueueInfo 报告了一个队列在运行时的信息。
它包含以下信息:
队列名称。
队列中的容量。
队列的最大容量。
队列的当前容量。
子队列。
正在运行的程序。
队列的状态。
QueueState 是一个枚举类,有两个元素:
STOPPED --Stopped状态不接受任何新程序。
RUNNING --正常状态
public enum QueueState {
/**
* Stopped - Not accepting submissions of new applications.
*/
STOPPED,
/**
* Running - normal operation.
*/
RUNNING
}
QueueACL是一个枚举类,有两个元素:
SUBMIT_APPLICATIONS -- 可以把程序提交到这个队列的ACL。
ADMINISTER_QUEUE -- 管理这个队列的ACL。
public enum QueueACL {
/**
* ACL to submit applications to the queue.
*/
SUBMIT_APPLICATIONS,
/**
* ACL to administer the queue.
*/
ADMINISTER_QUEUE,
}
ApplicationAttemptId 就是ApplicationMaster的一次运行尝试,有两个成员,一个是ApplicationId,一个是int attemptId。
ApplicationId代表一个应用的全局唯一标识,标识的字符串内容为:appIdStrPrefix + this.getClusterTimestamp() + "_" + appIdFormat.get().format(getId());
其中:appIdStrPrefix = "application_";
cluster timestamp = start-time of theResourceManager
getId() 返回当前程序的ID,程序的ID用一个单向递增的计数器生成,然后再格式化成最少4位数的字符串。
allocate方法是最重要的方法,定义如下所示:
Allocation
allocate(ApplicationAttemptId appAttemptId,
List<ResourceRequest> ask,
List<ContainerId> release,
List<String> blacklistAdditions,
List<String> blacklistRemovals);
ResourceRequest: 代表一个应用程序向ResourceManager申请获得各种Container的请求。它包含
Priority: request的优先级(Priority )
Location: 所需要容器所在的服务器或者机架的位置。‘*’代表任何服务器都可以。
Resource: 以上条件下的容器的数量。
RelaxLocality: 是否可以宽松本地化,默认为true。
ContainerId: 代表一个容器在集群中的全局唯一标识, 包括ApplicationAttemptId appAttemptId, long containerId
SchedulerNodeReport getNodeReport(NodeId nodeId);
NodeId 是一个结点的唯一标识,包括结点的主机名称和端口。
SchedulerNodeReport有三个字段,第一个是已经使用了的资源,第二个是未分配的资源,第三个是正在运行的容器数量。
SchedulerAppReport有三个字段,第一个是正在使用的资源,第二个是保留的资源,第三个是是否处于暂停状态。
ApplicationResourceUsageReport 有以下字段:
numUsedContainers:已经使用了的容器数量。
numReservedContainers:已经保留了的容器数量。
usedResources:已经使用了的资源。
reservedResources:保留的资源。
neededResources: 需要的资源。
memory_seconds:程序分配的内存乘以运行的时间(以秒计)。
vcore_seconds:程序分配的cpu数乘以运行的时间(以秒计)。
public enum RMContainerState {
NEW,
RESERVED,
ALLOCATED,
ACQUIRED,
RUNNING,
COMPLETED,
EXPIRED,
RELEASED,
KILLED
}
Container代表一个集群中分配了的资源。ResourceManager有对应用分配容器的唯一权威。分配的Container总是在单个结点上,并且有唯一的ContainerId.它有一定量的资源。它包括以下内容:
ContainerId:全局唯一。
NodeId: 分配的结点。
nodeHttpAddress:结点的uri.
Resource:分配的资源。
Priority:优先级
Token:Container的Token.
一般来说,在资源协商过程中,ApplicationMaster从ResourceManager接收Container,然后和NodeManager交互来启动或者停止Container.
QueueEntitlement是队列的应得权益。 在FairScheduler中是weights,在CapacityScheduler中代表Capacity.