このトピックでは、YARN のノードラベル、その使用方法、および一般的な問題について説明します。
背景情報
YARN のノードラベルは、YARN の NodeManager ノードをパーティション分割します。1 つのノードは 1 つのノードラベルにしか割り当てられないため、ノードラベルを使用して YARN クラスターを互いに素なノードのセットに分割できます。デフォルトでは、ノードは DEFAULT パーティション (partition=""、空文字列) に属します。
パーティションは、次の 2 種類のいずれかとして設定できます:
-
排他的パーティション:このパーティションを要求するコンテナのみが、そのノードにスケジューリングできます。
-
非排他的パーティション:このパーティション、DEFAULT パーティション、またはパーティションなしを要求するコンテナは、アイドル状態のリソースが利用可能な場合に、そのノードにスケジューリングできます。
キャパシティスケジューラは、ノードラベルを使用したパーティションベースのスケジューリングをサポートする唯一のスケジューラです。スケジューラを設定するか、コンピューティングエンジンの node-label-expression パラメーターを使用して、キューのコンテナをアクセス可能なパーティションに割り当てることができます。
ノードラベルの詳細については、「YARN ノードラベル」をご参照ください。
制限事項
-
このトピックは、
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モードを扱います。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 の Web 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] です。
キューパーティションの設定
キャパシティスケジューラを使用するには、「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 であるためです。したがって、その子キューがパーティション上でゼロ以外のキャパシティを持てるように、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> <!-- default キューが DEMO パーティションにアクセスできるようにする (必須) --> <name>yarn.scheduler.capacity.root.default.accessible-node-labels</name> <value>DEMO</value> </property> <property> <!-- default キューのすべての祖先キューに DEMO パーティションのキャパシティを設定する (必須) --> <name>yarn.scheduler.capacity.root.accessible-node-labels.DEMO.capacity</name> <value>100</value> </property> <property> <!-- default キューに DEMO パーティションのキャパシティを設定する (必須) --> <name>yarn.scheduler.capacity.root.default.accessible-node-labels.DEMO.capacity</name> <value>100</value> </property> <property> <!-- オプション:DEMO パーティション内の default キューの最大キャパシティを設定する。デフォルトは 100。 --> <name>yarn.scheduler.capacity.root.default.accessible-node-labels.DEMO.maximum-capacity</name> <value>100</value> </property> <property> <!-- オプション:default キューにサブミットされたジョブのコンテナリクエストのデフォルトパーティションを設定する。デフォルトは DEFAULT パーティション "" --> <name>yarn.scheduler.capacity.root.default.default-node-label-expression</name> <value>DEMO</value> </property> <configuration>
設定を編集して保存した後、YARN サービスページの [Status] タブで ResourceManager の refreshQueues 操作を使用して、スケジューラ設定をホットアップデートします。その後、ジョブが期待どおりに実行されることを確認します。ジョブが成功したら、ResourceManager の Web 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 |
Map タスクが使用するパーティション。 |
|
|
mapreduce.reduce.node-label-expression |
Reduce タスクが使用するパーティション。 |
|
|
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 クラスターでは、各ノードは最大で 1 つの NodeManager プロセスしか実行しないため、ポートの指定は不要です。不正なポートやランダムなポートを指定すると、replaceLabelsOnNode コマンドはノードをパーティションにマッピングできなくなります。yarn node -list -showDetails を実行して、ノードの現在のパーティションを表示できます。
ノードラベルのユースケース
ほとんどの場合、EMR クラスターでノードラベルは不要です。オープンソースの Hadoop YARN の多くのメトリクスはパーティションを考慮せず、DEFAULT パーティションのステータスのみを報告するため、運用の複雑さが増します。パーティションベースのスケジューリングは、全体的なリソース使用率を低下させ、リソースの無駄遣いにつながる可能性もあります。典型的なユースケースには、パーティションによるバッチジョブとストリーミングジョブの分離、重要なジョブの非弾性ノードへの固定、リソースの不均衡を防ぐための異なるインスタンスタイプの個別パーティションへの対応などがあります。
関連ドキュメント
パーティションごとにクラスターノードを管理するには、「ノードラベルを使用したノードのパーティション分割」をご参照ください。