我在应用程序主机中使用了同步AMRMClient,使用AMRMClient的addContainerRequest方法添加容器请求,使用AMMMClient的getMatchingRequests和removeContainerRequest方法来删除容器请求。但是,当程序使用不同的资源添加容器请求时,资源管理器不再向应用程序主机分配任何资源,并导致死锁。有人曾经遇到过这样的问题吗?
答案 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
中以进行调度。这就是为什么容器请求会丢失而从未分配的原因。