このトピックでは、YARN ノードラベル、その使用方法、および一般的な問題について説明します。
背景情報
YARN ノードラベルは、YARN NodeManager ノードをパーティション分割します。1 つのノードは 1 つのノードラベルにしか割り当てられないため、ノードラベルを使用して YARN クラスターを互いに素なノードのセットに分割できます。デフォルトでは、ノードは DEFAULT パーティション (partition=""、空の文字列) に属します。
パーティションは、次の 2 種類のいずれかとして設定できます。
-
排他的パーティション:このパーティションをリクエストするコンテナのみが、そのノードにスケジュールされます。
-
非排他的パーティション:このパーティション、DEFAULT パーティション、またはパーティションなしをリクエストするコンテナは、アイドル状態のリソースが利用可能であれば、そのノードにスケジュールされます。
Capacity Scheduler は、ノードラベルを使用したパーティションベースのスケジューリングをサポートする唯一のスケジューラです。スケジューラを設定するか、コンピュートエンジンの `node-label-expression` パラメーターを使用して、キューのコンテナをアクセス可能なパーティションに割り当てることができます。
ノードラベルの詳細については、「YARN Node Labels」をご参照ください。
制限事項
-
このトピックは、ご利用の `yarn-site.xml` ファイルの `yarn.node-labels.configuration-type` パラメーターが `centralized` に設定されている場合に限り、EMR-5.11.1 および EMR-3.45.1 より前の EMR バージョンに適用されます。
-
EMR バージョン 5.11.1 以降および 3.45.1 以降では、EMR コンソールでの YARN パーティションの管理がサポートされています。詳細については、「EMR コンソールでの YARN パーティションの管理」をご参照ください。
操作手順
コンソールでのノードラベルの有効化
EMR コンソールで、YARN サービスの設定ページに移動します。 yarn-site.xml タブで、次のプロパティを追加します。その後、設定を保存し、ResourceManager を再起動して変更を適用します。
|
キー |
値 |
説明 |
|
yarn.node-labels.enabled |
true |
ノードラベル機能を有効にします。 |
|
yarn.node-labels.fs-store.root-dir |
/tmp/node-labels |
`centralized` 設定モードでは、このプロパティはノードラベル情報のストレージパスを指定します。このパスはカスタマイズできます。 |
-
このトピックでは、ノードラベルマッピングの動作原理を説明するために `centralized` モードを取り上げます。EMR バージョン 5.11.1 以降および 3.45.1 以降では、デフォルトで `yarn.node-labels.configuration-type=distributed` が使用されます。これらのバージョンでは、このトピックで説明されている手動コマンドを使用せずに、EMR コンソールで YARN パーティションを管理できます。詳細については、「EMR コンソールでの YARN パーティションの管理」をご参照ください。その他の要件については、Hadoop コミュニティの公式ドキュメントをご参照ください。
-
yarn.node-labels.fs-store.root-dir プロパティに (完全な URL ではなく) スキームなしのパスを設定した場合、YARN は
fs.defaultFSで指定されたデフォルトのファイルシステムを使用します。この設定は${fs.defaultFS}/tmp/node-labelsと同等になります。EMR では、デフォルトのファイルシステムは通常 HDFS です。
コマンドを使用したノードラベルの追加とノードのマッピング
スケールアウト時にエラスティックノードグループの NodeManager ノードにパーティションを自動的に割り当てるには、パーティションを作成した後、そのノードグループのブートストラップスクリプトに replaceLabelsOnNode コマンドを追加します。このスクリプトは、ノードコンポーネントの起動後に実行されます。
コマンドの例:
# デフォルトの YARN 管理者 hadoop としてコマンドを実行
sudo su - hadoop
# パーティションの追加
yarn rmadmin -addToClusterNodeLabels "DEMO"
yarn rmadmin -addToClusterNodeLabels "CORE"
# YARN ノードのリスト表示
yarn node -list
# 特定のノードをパーティションにマッピング
yarn rmadmin -replaceLabelsOnNode "core-1-1.c-XXX.cn-hangzhou.emr.aliyuncs.com=DEMO"
yarn rmadmin -replaceLabelsOnNode "core-1-2.c-XXX.cn-hangzhou.emr.aliyuncs.com=DEMO"
コマンドが正常に実行された後、ResourceManager のウェブ UI で結果を確認します。
-
ResourceManager の [Nodes] ページで、2 つのコアノード (core-1-1 と core-1-2) の [Node Labels] 列に [DEMO] と表示され、[Node State] が RUNNING になっています。これは、ノードとラベルのマッピングが有効であることを示します。
-
Node Labels ページでは、テーブルに追加された 3 つのノードラベル
<DEFAULT_PARTITION>、CORE、DEMOが表示されます。これらの [Label Type] は [Exclusive Partition] です。
-
ResourceManager の [Nodes] ページで、2 つのコアノード (core-1-1 と core-1-2) の [Node Labels] 列に [DEMO] と表示され、[Node State] が RUNNING になっています。これは、ノードとラベルのマッピングが有効であることを示します。
-
Node Labels ページでは、テーブルに追加された 3 つのノードラベル
<DEFAULT_PARTITION>、CORE、DEMOが表示されます。これらの [Label Type] は [Exclusive Partition] です。
-
ResourceManager の [Nodes] ページで、2 つのコアノード (core-1-1 と core-1-2) の [Node Labels] 列に [DEMO] と表示され、[Node State] が RUNNING になっています。これは、ノードとラベルのマッピングが有効であることを示します。
-
Node Labels ページでは、テーブルに追加された 3 つのノードラベル
<DEFAULT_PARTITION>、CORE、DEMOが表示されます。これらの [Label Type] は [Exclusive Partition] です。
キューパーティションの設定
Capacity Scheduler を使用するには、yarn-site.xml ファイルの yarn.resourcemanager.scheduler.class プロパティが org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler に設定されていることを確認してください。
capacity-scheduler.xml ファイルで、次のプロパティを使用してキューのアクセス可能なパーティションとキャパシティを設定します。<queue-path> をキューパスに、<label> をパーティション名に置き換えてください。DEFAULT パーティションには、通常の `capacity` または `maximum-capacity` プロパティを使用できます。
|
パラメーター |
値 |
説明 |
|
yarn.scheduler.capacity.<queue-path>.accessible-node-labels |
パーティションのカンマ区切りリスト。 |
キューがアクセス可能なパーティションのリストを指定します。 |
|
yarn.scheduler.capacity.<queue-path>.accessible-node-labels.<label>.capacity |
値のルールについては、yarn.scheduler.capacity.<queue-path>.capacity をご参照ください。 |
指定されたアクセス可能なパーティションにおけるキューのリソースキャパシティを指定します。 重要
有効にするには、すべての親キューのキャパシティも設定する必要があります。 |
|
yarn.scheduler.capacity.<queue-path>.accessible-node-labels.<label>.maximum-capacity |
値のルールについては、yarn.scheduler.capacity.<queue-path>.maximum-capacity をご参照ください。デフォルト値は 100 です。 |
指定されたアクセス可能なパーティションでキューが使用できる最大リソースキャパシティを指定します。 |
|
yarn.scheduler.capacity.<queue-path>.default-node-label-expression |
パーティション名。デフォルトは空の文字列で、DEFAULT パーティションを表します。 |
このキューに送信されるジョブのコンテナリクエストで、パーティションが指定されていない場合に使用されるデフォルトのパーティションを指定します。 |
-
指定されたキューの実際のリソースキャパシティを 0 より大きくするには、そのすべての親キューで同じパーティションのキャパシティを設定する必要があります。これは、
yarn.scheduler.capacity.<queue-path>.accessible-node-labels.<label>.capacityパラメーターのデフォルト値が 0 であるためです。したがって、子キューがパーティション上で 0 以外のキャパシティを持つことができるように、yarn.scheduler.capacity.root.accessible-node-labels.<label>.capacity=100を設定する必要があります。(理論的には 0 より大きい任意の値で十分ですが、100 未満の値を設定すると、子キューの計算された実際のキャパシティが減少し、ほとんど意味がありません)。親キューのキャパシティ設定が欠落していてデフォルトの 0 になった場合、このパーティション上のターゲットキューの計算された実際のキャパシティも 0 になります。 -
yarn.scheduler.capacity.root.accessible-node-labels.<label>.capacityが 0 より大きい値に設定されると、通常のyarn.scheduler.capacity.<queue-path>.capacityプロパティと同じルールが適用されます。つまり、すべての直接の子キューにわたる同じパーティションの `capacity` 値の合計は 100 でなければなりません。設定例:
<configuration> <!-- XML でノードラベルのプロパティを追加 --> <property> <!-- デフォルトキューが DEMO パーティションにアクセスできるようにする (必須) --> <name>yarn.scheduler.capacity.root.default.accessible-node-labels</name> <value>DEMO</value> </property> <property> <!-- デフォルトキューのすべての親キューで DEMO パーティションのキャパシティを設定する (必須) --> <name>yarn.scheduler.capacity.root.accessible-node-labels.DEMO.capacity</name> <value>100</value> </property> <property> <!-- デフォルトキューの DEMO パーティションのキャパシティを設定する (必須) --> <name>yarn.scheduler.capacity.root.default.accessible-node-labels.DEMO.capacity</name> <value>100</value> </property> <property> <!-- オプション: DEMO パーティションにおけるデフォルトキューの最大キャパシティを設定します。デフォルトは 100 です。 --> <name>yarn.scheduler.capacity.root.default.accessible-node-labels.DEMO.maximum-capacity</name> <value>100</value> </property> <property> <!-- オプション: デフォルトキューに送信されるジョブのコンテナリクエストのデフォルトパーティションを設定します。デフォルトは DEFAULT パーティション "" です。 --> <name>yarn.scheduler.capacity.root.default.default-node-label-expression</name> <value>DEMO</value> </property> <configuration>
設定を編集して保存した後、YARN サービスページの [Status] タブで ResourceManager の `refreshQueues` 操作を使用して、スケジューラの設定をホットアップデートします。その後、ジョブが期待どおりに実行されることを確認します。ジョブが成功した後、ResourceManager のウェブ UI で結果を確認します。設定が有効になると、ResourceManager の [Scheduler] ページで、[Partition: DEMO] にリソース (memory:26214, vCores:16) が割り当てられていることがわかります。キューの構造は Queue: root > Queue: default です。これは、DEMO パーティションとそのキューキャパシティの設定が適用されていることを示します。
ほとんどのコンピュートエンジン (Tez を除く) も、ジョブ送信パラメーターを通じてノードラベルをサポートしていますが、このトピックでは取り上げません。
|
エンジン |
パラメーター |
説明 |
|
MapReduce |
mapreduce.job.node-label-expression |
ジョブ内のすべてのコンテナが使用するデフォルトのパーティション。 |
|
mapreduce.job.am.node-label-expression |
ApplicationMaster が使用するパーティション。 |
|
|
mapreduce.map.node-label-expression |
マップタスクが使用するパーティション。 |
|
|
mapreduce.reduce.node-label-expression |
リデュースタスクが使用するパーティション。 |
|
|
Spark |
spark.yarn.am.nodeLabelExpression |
ApplicationMaster が使用するパーティション。 |
|
spark.yarn.executor.nodeLabelExpression |
Executor が使用するパーティション。 |
|
|
Flink |
yarn.application.node-label |
ジョブ内のすべてのコンテナが使用するデフォルトのパーティション。 |
|
yarn.taskmanager.node-label |
TaskManager が使用するパーティション。Flink 1.15.0 以降でサポートされており、これは EMR-3.44.0 (3.x) および EMR-5.10.0 (5.x) に相当します。 |
よくある質問
HA クラスターにおけるノードラベルデータのストレージ
はい。高可用性 (HA) クラスターでは、ResourceManager は複数のノードにデプロイされます。デフォルトでは、オープンソースの Hadoop はノードラベルデータを file:///tmp/hadoop-yarn-${user}/node-labels/ のようなローカルディレクトリに保存します。フェイルオーバー後、新しいアクティブな ResourceManager は、以前のノードにローカルで保存されていたノードラベルデータを読み取ることができません。したがって、yarn.node-labels.fs-store.root-dir を /tmp/node-labels や ${fs.defaultFS}/tmp/node-labels のような分散ストレージパスに設定する必要があります。EMR では、デフォルトのファイルシステムは HDFS です。詳細については、「操作手順」をご参照ください。
カスタムの分散パスの場合、ファイルシステムサービスが正常であり、hadoop ユーザーが読み取りおよび書き込みアクセス権を持っていることを確認してください。そうでない場合、ResourceManager の起動に失敗します。
NodeManager ポートの指定
EMR クラスターでは、各ノードで実行される NodeManager プロセスは最大 1 つであるため、ポートを指定する必要はありません。不正なポートやランダムなポートを指定すると、`replaceLabelsOnNode` コマンドはノードをパーティションにマッピングすることに失敗します。yarn node -list -showDetails を実行して、ノードの現在のパーティションを表示できます。
ノードラベルのユースケース
ほとんどの場合、EMR クラスターでノードラベルは不要です。オープンソースの Hadoop YARN の多くのメトリックはパーティションを考慮しておらず、DEFAULT パーティションのステータスのみをレポートするため、運用の複雑さが増します。パーティションベースのスケジューリングは、全体的なリソース使用率を低下させ、リソースの無駄につながる可能性もあります。典型的なユースケースには、パーティションによるバッチジョブとストリーミングジョブの分離、重要なジョブを非エラスティックノードに固定すること、リソースの不均衡を防ぐために異なるインスタンスタイプを別々のパーティションに対応させることなどがあります。
関連ドキュメント
パーティションごとにクラスターノードを管理するには、「ノードラベルを使用したノードのパーティション分割」をご参照ください。