私は、分散シェルアプリケーションのモデルに従ってネイティブのYARNアプリケーションを作成しています。私のアプリケーションのマスターでは、私は次のように通常のループを使用して2個のコンテナを要求しています:異なるリソース機能を持つ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メソッドへのコールバック。割り当てられた2つの割り当てられたコンテナのリストこれは、同じリソース割り当てを持つ2つ以上のコンテナを求める場合にも発生しますが、問題のデモンストレーションが簡素化されるように、2つに保持しています。
しかし、私は異なる機能、例えば512と1000を要求してもコールバックを取得できますが、1つのコンテナしか割り当てられていないので、2番目のコンテナ要求。
私はAMRMClientAsyncとRMの間の通信が毎秒送信されるハートビートの先頭に乗っていることを知っていますので、2つのコンテナ要求の間にスリープを挿入しようとしました。
ここに私の睡眠コードがあります。
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と同じ通信に乗ってしまうことはありませんか?
これは、異なるリソース機能を持つさまざまなコンテナタイプがある場合、それらをグループ化して、異なるタイプの要求に少なくとも1つのハートビートがあることを確認する必要があると考えられます。これは、各自が要求しているリソースの能力に関係なく、単純なループでコンテナを要求するよりもはるかに複雑です。
ここに関連記事があります:post by yiheeとJIRAはYARN-314です。
私の質問に対する答えは、YARN-314の通りです。 "現在、同じコンテナと地域のリソース要求はすべて同じサイズになると予想されます。"したがって、異なるリソース要件のコンテナにタイトなループを要求するためには、要求されるリソースが異なる場合に異なる優先順位を持たなければならない。