/home/by-natures/dev*

データ界隈で働くエンジニアとしての技術的なメモと、たまに普通の日記。

YARN の DRF スケジューリングについて

会社で Hadoop The Definitive Guide(いわゆる象本)の第4版を読んでいるのですが、その中の YARN の章で、ジョブスケジューリングのアルゴリズムである Dominant Resource Fairness (DRF) の説明があります。

YARN で複数のリソース(CPU, メモリなど)を扱う場合に、DRF では "dominant resource" を決めます。例えば、クラスタ全体が (100 CPU, 10 TB のメモリ) からなる場合に、アプリケーションA が (2CPU, 300GB) を要求すると、アプリケーションA はクラスタ全体の (2%, 3%) を要求しています。アプリケーションB が (6CPU, 100GB) を要求すると、これは全体の (6%, 1%) にあたります。ここで、それぞれの最大値を dominant resource として定め、アプリケーションA は 3%, アプリケーションB は 6% を要求する、と判断します。つまりアプリケーションB はアプリケーションAの2倍のリソースを要求することになります。

まとめるとこうなります:

  • Application A requests containers of (2 CPUs, 300 GB)
    • (2%, 3%) -> dominant is 3%
  • Application B requests containers of (6 CPUs, 100 GB)
    • (6%, 1%) -> dominant is 6%

この後の説明に、「YARN は アプリケーションA に 2倍のコンテナを割り当てる」とあるのですが、ここが分かるようで分からないようで… 輪読会中に参加者で悩んでしまいました。アプリケーションBが2倍のリソースを必要とするのだから、アプリケーションB に2倍のコンテナが割り当たるのでは?という疑問です。

この質問を Stackoverflow に投げたところ、以下の非常に丁寧な回答がありました:

stackoverflow.com

DRF は、各アプリケーションに dominant resource が均等に割り当たるようにコンテナを分配します。そのため、アプリケーションA に2倍のコンテナを割り当てると、3% の2倍で6%となり、B の dominant resource と一致する、という訳です。

 

Stackoverflow をよく使うのですが、丁寧な回答があると非常に勉強になりますね。