すべてのプロダクト
Search
ドキュメントセンター

E-MapReduce:ノードラベルの使用

最終更新日:Sep 22, 2026

このトピックでは、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 設定モードでは、このプロパティはノードラベル情報のストレージパスを指定します。このパスはカスタマイズできます。

説明
  • このトピックでは、ノードラベルマッピングの動作原理を説明するために 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 パーティションのステータスのみを報告するため、運用の複雑さが増します。パーティションベースのスケジューリングは、全体的なリソース使用率を低下させ、リソースの無駄遣いにつながる可能性もあります。典型的なユースケースには、パーティションによるバッチジョブとストリーミングジョブの分離、重要なジョブの非弾性ノードへの固定、リソースの不均衡を防ぐための異なるインスタンスタイプの個別パーティションへの対応などがあります。

関連ドキュメント

パーティションごとにクラスターノードを管理するには、「ノードラベルを使用したノードのパーティション分割」をご参照ください。