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

E-MapReduce:ノードラベルを使用したノードのパーティション分割

最終更新日:Jun 23, 2026

YARN のノードラベルを使用すると、スケジューリング中にノードをパーティション分割して、さまざまな種類のジョブを物理的に分離できます。このトピックでは、ビジネス要件とノードタイプに基づいてノードラベルを作成する方法について説明します。

背景情報

YARN では、キューとノードラベルはリソース管理とスケジューリングにおける 2 つの主要な戦略です。これらは、クラスターリソースの管理においてそれぞれ異なる目的を果たします。

  • キューはリソースを論理的に分割する方法であり、事前定義された比率に基づいてクラスターのコンピューティングリソースを異なるユーザーグループやアプリケーションに割り当てることができます。これにより、共有クラスター環境であっても、さまざまなチームやワークロードがリソースの公平なシェアを確保できます。

  • ノードラベルを使用すると、クラスター内の特定のノードにタグを付け、これらのタグに基づいてより詳細なリソース割り当ての決定を行うことができます。これは、GPU や高メモリノードなど、特定のハードウェアの特徴を必要とするアプリケーションにとって特に重要です。

実際には、キューとノードラベルを組み合わせて、より柔軟で効率的なリソース管理とジョブスケジューリングを実現できます。

ビジネスニーズとクラスターの状況に基づいてノードのパーティション分割戦略を選択し、クラスターリソースを効果的に管理およびスケジュールできます。ノードラベルを使用した一般的なパーティション分割のアプローチには、ビジネスワークロードタイプ (データ同期ジョブ、バッチジョブ、リアルタイムジョブなど) による分類や、クラスターノードのインスタンスタイプ (CPU 最適化、メモリ最適化、GPU アクセラレーションなど) による分類があります。

前提条件

  • YARN サービスが有効になっているクラスターを作成済みであること。詳細については、「クラスターの作成」をご参照ください。

  • クラスターの YARN スケジューラは Capacity Scheduler である必要があります。現在、ノードラベルを使用したパーティションベースのスケジューリングをサポートしているのは Capacity Scheduler のみです。

シナリオ

ある組織が、チームのリソースニーズに基づいて、クラスターキューをデータウェアハウスキュー (`warehouse`) とデータ分析キュー (`analysis`) に分割します。また、クラスターリソースを `batch` と `streaming` の 2 つのパーティションに分割します。データウェアハウスチームは `batch` リソースの 60% と `streaming` リソースの 70% を使用します。データ分析チームは `batch` リソースの 30% と `streaming` リソースの 20% を使用します。ラベルなしのリソースについては、`warehouse` キューに 60%、`analysis` キューに 30% が割り当てられ、残りの 10% は他のニーズのために予約されます。次の図は、このパーティション分割を示しています。

この例では、キューとラベルを組み合わせて柔軟なリソース管理を実現し、オフラインジョブを物理的に分離して、他のタスクのパフォーマンスと安定性に影響を与えないようにする方法を示します。以下の手順では、EMR-5.16.0 データレイククラスターを使用します。他のクラスタータイプでも手順は同様です。

ステップ 1: リソースキューの編集

  1. EMR on ECS コンソールにログインします。対象クラスターの 操作 列で、Services をクリックし、次に [YARN] をクリックします。

  2. YARN サービスページで、Edit Resource Queue タブをクリックし、次に Manage Queues をクリックします。

  3. Manage Child Queues ページで、`warehouse` キューと `analysis` キューを追加します。

    • `warehouse` キューの Queue Capacity は 60%、`analysis` キューの Queue Capacity は 30% です。残りの 10% はデフォルトキューに割り当てられます。すべてのキューの Status は [有効] に設定されます。

    • ページは次のように表示されます。

      [リソースキューの編集] ページには、現在のスケジューラが capacity-scheduler であることが示されます。root キューの下には、analysis (キューキャパシティ 30%、最大キャパシティ 100%)、warehouse (キューキャパシティ 60%、最大キャパシティ 100%)、default (キューキャパシティ 10%、最大キャパシティ 100%) の 3 つのサブキューがあります。3 つすべてのキューのステータスは [実行中] です。ページ上部の YARN サービスの横に [未適用] ラベルが表示され、設定変更がまだデプロイされていないことを示します。

  4. 有効化の保留中 をクリックします。保留中の設定 ダイアログボックスで、[refresh_queues] をクリックしてキュー設定を適用します。

    [カスタム有効化設定] テーブルで、ResourceManager コンポーネントと `capacity-scheduler.xml` 設定ファイルに対応する行を見つけます。

ステップ 2: ノードパーティションの作成

  1. Partitions タブをクリックし、Add Partition をクリックして `streaming` パーティションを追加します。

    • Add Partition ダイアログボックスで、パーティション名 を指定し、Partition Type を選択し、Associated Node Groups を選択します。

      パラメーター

      説明

      パーティション名

      この例では、パーティション名は `streaming` です。

      パーティションタイプ

      この例では、`exclusive` を選択します。これにより、一致するパーティションをリクエストするコンテナのみがこれらのノードでスケジュールされるようになります。

      関連付けられたノードグループ

      この例では、`streaming` パーティションは `emr-task-3` に関連付けられています。このクラスターの emr-task-3 ノードグループは、メモリ最適化インスタンスタイプで構成されており、大量の中間データを低レイテンシーで保存する必要があるリアルタイムジョブに適しています。特定のビジネス特性とノードインスタンスタイプに基づいてノードグループを割り当てる必要があります。

  2. 手順を繰り返して `batch` パーティションを追加します。最終的な結果は次のようになります。

    パーティションを作成すると、[パーティション] ページに 3 つのパーティションがリストされます:DEFAULT_PARTITION (アクセス可能なキュー:すべて、ノードグループ:emr-core、パーティションタイプ:排他的)、streaming (アクセス可能なキュー:root および root.default、ノードグループ:emr-task-3、パーティションタイプ:排他的)、batch (アクセス可能なキュー:root および root.default、ノードグループ:emr-task-1 および emr-task-2、パーティションタイプ:排他的)。上部のナビゲーションバーにオレンジ色の [未適用] ステータスインジケーターが表示されます。設定を適用するには、[デプロイして適用] をクリックする必要があります。

  3. パーティションを追加した後、有効化の保留中 をクリックします。保留中の設定 ダイアログボックスで、[refresh_labels] をクリックしてノードパーティション設定を完了します。

    [カスタム有効化設定] セクションで、ResourceManager コンポーネントの設定ファイルは `node-labels.xml` です。

  4. 設定が有効になると、各パーティションの Total Resources を表示できます。

    例えば、ストリーミング パーティションの合計リソースは <memory:4096, vCores:8> として表示され、バッチ パーティションの合計リソースは <memory:8192, vCores:16> として表示されます。

ステップ 3: パーティションとキューの関連付け管理の有効化

  1. Edit Resource Queue ページで、`batch` と `streaming` パーティションを順に選択し、パーティションとキューの関連付け管理を有効にする をクリックします。

  2. パーティションとキューの関連付け管理を有効にする ダイアログボックスで、パーティション内の各キューの Queue Capacity を設定します。

    • `batch` パーティションでは、`analysis` の Queue Capacity を 30%`warehouse` の Queue Capacity を 60%`default` の Queue Capacity を 10% に設定します。

    • `streaming` パーティションでは、`analysis` の Queue Capacity を 20%`warehouse` の Queue Capacity を 70%`default` の Queue Capacity を 10% に設定します。

    説明

    この例では、すべてのキューがすべてのパーティションで実行する権限を持っています。実際の設定では、特定のパーティション内の特定のキューのキャパシティを 0 に設定して、指定されたキューからのジョブのみがそのパーティションで実行されるようにすることができます。

  3. パーティションとキューの関連付けを設定した後、有効化の保留中 をクリックします。保留中の設定 ダイアログボックスで、[refresh_queues] をクリックして変更を適用します。

  4. YARN Web UI で、ノードパーティションがアクティブであることを確認します。

    • ノードラベルページ

      このページのテーブルには [ラベル名][ラベルタイプ][アクティブな NM 数]、および [合計リソース] の列があり、<DEFAULT_PARTITION> (排他的パーティション、アクティブな NM 2 つ、リソース: メモリ:8192、vCores:16)、バッチ (排他的パーティション、アクティブな NM 2 つ、リソース: メモリ:8192、vCores:16)、および ストリーミング (排他的パーティション、アクティブな NM 1 つ、リソース: メモリ:4096、vCores:8) の 3 つのレコードが表示されます。

    • スケジューラページ

      Scheduler ページの Application Queues セクションでは、DEFAULT_PARTITION (<memory:8192, vCores:16>)、Partition: batch (<memory:8192, vCores:16>)、および Partition: streaming (<memory:4096, vCores:8>) の 3 つのパーティションが設定されています。batchstreaming の両方のノードラベルパーティションには、root キューと、そのサブキューである defaultwarehouse、および analysis が含まれています。スケジューラタイプは Capacity Scheduler で、最小割り当ては <memory:32, vCores:1>、最大割り当ては <memory:4096, vCores:8> です。

ステップ 4: パーティションへのジョブの送信

クラスターのキューとラベルを設定した後、特定のキューとノードで実行するジョブを送信できます。

  1. クラスターのマスターノードにログインし、Spark のインストールディレクトリ (例:/opt/apps/SPARK3/spark-3.3.1-hadoop3.2-1.1.1) に移動します。

    cd /opt/apps/SPARK3/spark-3.3.1-hadoop3.2-1.1.1
  2. 本番環境では、Spark ジョブを送信するためにジョブの JAR ファイルをアップロードする必要があります。この例では、spark-submit を使用してジョブを送信します。

    ./bin/spark-submit --class org.apache.spark.examples.SparkLR --master yarn --deploy-mode cluster --driver-memory 1g --executor-memory 2g --conf spark.yarn.am.nodeLabelExpression=batch --conf spark.yarn.executor.nodeLabelExpression=batch --queue=warehouse examples/jars/spark-examples_2.12-3.3.1.jar

    パラメーター

    説明

    class

    アプリケーションのメインクラス:org.apache.spark.examples.SparkLR

    master

    ジョブの実行環境:yarn

    deploy-mode

    ドライバーが起動される場所:cluster

    driver-memory

    ドライバーのメモリ量:1g

    executor-memory

    エグゼキュータごとのメモリ量:2g

    spark.yarn.am.nodeLabelExpression

    ApplicationMaster が実行できるノードのラベル式:batch

    spark.yarn.executor.nodeLabelExpression

    エグゼキュータが実行できるノードのラベル式:batch

    queue

    ジョブが送信される特定の YARN キュー:warehouse

    説明

    ジョブを送信する際にキューのみを指定し、パーティションを指定しない場合、ジョブはキューのデフォルトパーティションに送信されます。キューのデフォルトパーティションは、Edit Resource Queue ページで対象のキューの 編集 をクリックすることで変更できます。

  3. YARN クラスターの Web UI で、`warehouse` キューに送信された SparkLR ジョブが `batch` パーティションで実行されていることを確認できます。

YARN のキューとノードパーティションを設定することで、特定のビジネスワークロードに対して論理的および物理的なリソース分離が提供されます。これにより、ジョブ間の干渉を効果的に防ぎ、重要なアプリケーションのパフォーマンスと安定性を確保します。

よくある質問

  • spark-submit を使用して Spark ジョブを送信したときに、ジョブが指定されたパーティションで実行されないのはなぜですか?

    • 送信コマンドに spark.yarn.executor.nodeLabelExpression パラメーターが含まれているか確認してください。

    • [パーティション] および [リソースキューの編集] ページの設定が有効になっていることを確認してください。

  • spark-submit を使用して Spark ジョブを送信したときに、ジョブのステータスが ACCEPTED のままなのはなぜですか?

    1. ジョブが送信されたキューに利用可能なリソースがあることを確認してください。ない場合は、他のジョブがリソースを解放するのを待ってから、ジョブを再送信してください。

    2. キューに利用可能なリソースがある場合は、YARN Web UI でジョブ ID をクリックしてジョブの詳細を表示し、[診断] の説明を確認してください。「Queue's AM resource limit exceeded」というメッセージが表示されることがあります。これは、キューにリソースはあるものの、Application Master (AM) のリソースが不足していることを示します。キューのリソースは AM とエグゼキュータの両方に割り当てられます。AM リソースはメインアプリケーションの起動に使用され、エグゼキュータリソースはタスク処理に使用されます。したがって、Spark ジョブが正常に送信されるように、キューのリソース割り当て比率を調整し、AM リソースの割合を増やす必要があります。

      Diagnostics:   [Wed Dec 25 16:24:10 +0800 2024] Application is added to the scheduler and is not yet activated. Queue's AM resource limit exceeded. Details : AM
                     Partition = &lt;DEFAULT_PARTITION&gt;; AM Resource Request = &lt;memory:2048, vCores:1&gt;; Queue Resource Limit for AM = &lt;memory:2048, vCores:4&gt;; User
                     AM Resource Limit of the queue = &lt;memory:224, vCores:1&gt;; Queue AM Resource Usage = &lt;memory:896, vCores:1&gt;;
    3. YARN サービスの設定ページで AM リソースの比率を調整できます。capacity_scheduler.xml ファイルを見つけ、yarn.scheduler.capacity.maximum-am-resource-percent 設定項目の値を変更します。例えば、0.25 から 0.5 に変更します。

    説明

    yarn.scheduler.capacity.maximum-am-resource-percent で定義されているデフォルトの AM リソースの割合は、特定のユースケースに基づいて調整してください。例えば、クラスターが少量のデータを持つ多数のジョブを頻繁に処理する場合は、AM リソースの割合を増やすことができます。

関連ドキュメント

  • YARN スケジューリングの原則に関する詳細については、「YARN スケジューラ」をご参照ください。

  • YARN ノードパーティションの原則に関する詳細については、「ノードラベルの使用」をご参照ください。