我正在按照分布式shell应用程序的模型编写本机YARN应用程序。在我的应用程序主机中,我使用通常的循环请求两个容器,如下所示:
for (int i = 0; i < appContainerList.size(); ++i)
{
ContainerRequest containerAsk = setupContainerAskForRM(i);
amRMClient.addContainerRequest(containerAsk);
appContainerList.setStatus(i, "requested");
}
只要两个容器请求相同数量的内存,比如512或1000,那么在这个循环运行后不久,我得到一个回调到我的AMRMClientAsync.CallbackHandler的onContainersAllocated方法,其中列出了两个已分配的容器分配。如果我要求两个以上的容器具有相同的资源分配,也会发生这种情况,但我将其保留为两个,以便简化问题的演示。
但是,如果我发出不同功能的请求,比如一个用于512而另一个用于1000,那么我也得到一个回调,但只分配了一个容器,我从来没有得到第二个容器请求的回调。
我知道AMRMClientAsync和RM之间的通信是在每秒发送的心跳之上进行的,因此我尝试在两个容器请求之间插入一个休眠,现在我得到两个回调,每个回调都有一个分配的容器。 / p>
这是我的睡眠代码。
for (int i = 0; i < appContainerList.size(); ++i)
{
ContainerRequest containerAsk = setupContainerAskForRM(i);
amRMClient.addContainerRequest(containerAsk);
appContainerList.setStatus(i, "requested");
try
{
Thread.sleep(5000);
}
catch (InterruptedException ex)
{
LOG.info("sleep interrupted " + ex);
}
}
这是正确的,是否无法在紧密循环中请求具有不同资源功能的容器?对具有不同资源功能的容器的请求是否需要在两者之间进行休眠,以便它们最终不会与RM进行相同的心跳同样的通信?
如果是这样,这似乎意味着如果我有许多不同的容器类型,具有不同的资源功能,我必须对它们进行分组,并确保不同类型的请求之间至少有一个心跳。这比简单地在紧密循环中请求容器要复杂得多,而不考虑每个人请求的资源能力。
我在此处找到了相关帖子:post by yihee和JIRA:YARN-314。
我的问题的答案似乎是,正如在YARN-314中所说: “目前,对同一容器和地区的资源请求预计都具有相同的大小。”因此,要在紧密循环中请求具有不同资源需求的容器,如果请求的资源不同,则它们必须具有不同的优先级。
答案 0 :(得分:0)
回答我自己的问题。基于我提到的其他引用,特别是YARN-314,我更改了我请求的容器的优先级,现在我可以在紧密的循环中请求容器,并且我在同一个onContainersAllocated回调处理程序的调用中分配了两个容器。 / p>