在询问具有不同资源的容器时,纱线资源管理没有分配容器

时间:2016-01-31 16:30:00

标签: yarn

我在应用程序主机中使用了同步AMRMClient,使用AMRMClient的addContainerRequest方法添加容器请求,使用AMMMClient的getMatchingRequests和removeContainerRequest方法来删除容器请求。但是,当程序使用不同的资源添加容器请求时,资源管理器不再向应用程序主机分配任何资源,并导致死锁。有人曾经遇到过这样的问题吗?

1 个答案:

答案 0 :(得分:3)

具有相同优先级的容器请求现在应具有相同的资源要求。该问题的解决方法是使用具有不同优先级的不同资源要求。 JIRA问题YARN-314对此有更多的讨论。

以下详细代码分析适用于Hadoop 2.7.3。

问题的关键在于AppSchedulingInfo,它根据优先级和资源名称组织所有请求:

final Map<Priority, Map<String, ResourceRequest>> requests

因此,对于任何给定的优先级和资源名称,您只能拥有一个ResourceRequest,其中包含优先级,cpu,内存要求和容器数。

AMRMClientImpl容器中,请求保存在以下数据结构中:

class ResourceRequestInfo {
    ResourceRequest remoteRequest;
    ...
}

Map<Priority, Map<String, TreeMap<Resource, ResourceRequestInfo>>> remoteRequestsTable;

因此,对于具有不同资源要求的相同优先级和资源名称,最终会得到不同的ResourceRequest

当AM针对相同的资源需求调用AMRMClientImpl.addContainerRequest时,它将增加先前创建的ResourceRequest实例中的容器数量。为相同的优先级和资源名称添加不同的资源要求时,最终会得到ResourceRequest的不同实例,但只有最后一个将保留在AppSchedulingInfo中以进行调度。这就是为什么容器请求会丢失而从未分配的原因。