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: リソースキューの編集
-
EMR on ECS コンソールにログインします。対象クラスターの 操作 列で、Services をクリックし、次に [YARN] をクリックします。
-
YARN サービスページで、Edit Resource Queue タブをクリックし、次に Manage Queues をクリックします。
-
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 サービスの横に [未適用] ラベルが表示され、設定変更がまだデプロイされていないことを示します。
-
-
有効化の保留中 をクリックします。保留中の設定 ダイアログボックスで、[refresh_queues] をクリックしてキュー設定を適用します。
[カスタム有効化設定] テーブルで、ResourceManager コンポーネントと `capacity-scheduler.xml` 設定ファイルに対応する行を見つけます。
ステップ 2: ノードパーティションの作成
-
Partitions タブをクリックし、Add Partition をクリックして `streaming` パーティションを追加します。
-
Add Partition ダイアログボックスで、パーティション名 を指定し、Partition Type を選択し、Associated Node Groups を選択します。
パラメーター
説明
パーティション名
この例では、パーティション名は `streaming` です。
パーティションタイプ
この例では、`exclusive` を選択します。これにより、一致するパーティションをリクエストするコンテナのみがこれらのノードでスケジュールされるようになります。
関連付けられたノードグループ
この例では、`streaming` パーティションは `emr-task-3` に関連付けられています。このクラスターの emr-task-3 ノードグループは、メモリ最適化インスタンスタイプで構成されており、大量の中間データを低レイテンシーで保存する必要があるリアルタイムジョブに適しています。特定のビジネス特性とノードインスタンスタイプに基づいてノードグループを割り当てる必要があります。
-
-
手順を繰り返して `batch` パーティションを追加します。最終的な結果は次のようになります。
パーティションを作成すると、[パーティション] ページに 3 つのパーティションがリストされます:DEFAULT_PARTITION (アクセス可能なキュー:すべて、ノードグループ:emr-core、パーティションタイプ:排他的)、streaming (アクセス可能なキュー:root および root.default、ノードグループ:emr-task-3、パーティションタイプ:排他的)、batch (アクセス可能なキュー:root および root.default、ノードグループ:emr-task-1 および emr-task-2、パーティションタイプ:排他的)。上部のナビゲーションバーにオレンジ色の [未適用] ステータスインジケーターが表示されます。設定を適用するには、[デプロイして適用] をクリックする必要があります。
-
パーティションを追加した後、有効化の保留中 をクリックします。保留中の設定 ダイアログボックスで、[refresh_labels] をクリックしてノードパーティション設定を完了します。
[カスタム有効化設定] セクションで、ResourceManager コンポーネントの設定ファイルは `node-labels.xml` です。
-
設定が有効になると、各パーティションの Total Resources を表示できます。
例えば、ストリーミング パーティションの合計リソースは
<memory:4096, vCores:8>として表示され、バッチ パーティションの合計リソースは<memory:8192, vCores:16>として表示されます。
ステップ 3: パーティションとキューの関連付け管理の有効化
-
Edit Resource Queue ページで、`batch` と `streaming` パーティションを順に選択し、パーティションとキューの関連付け管理を有効にする をクリックします。
-
パーティションとキューの関連付け管理を有効にする ダイアログボックスで、パーティション内の各キューの 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 に設定して、指定されたキューからのジョブのみがそのパーティションで実行されるようにすることができます。
-
-
パーティションとキューの関連付けを設定した後、有効化の保留中 をクリックします。保留中の設定 ダイアログボックスで、[refresh_queues] をクリックして変更を適用します。
-
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 つのパーティションが設定されています。batch と streaming の両方のノードラベルパーティションには、root キューと、そのサブキューである default、warehouse、および analysis が含まれています。スケジューラタイプは Capacity Scheduler で、最小割り当ては<memory:32, vCores:1>、最大割り当ては<memory:4096, vCores:8>です。
-
ステップ 4: パーティションへのジョブの送信
クラスターのキューとラベルを設定した後、特定のキューとノードで実行するジョブを送信できます。
-
クラスターのマスターノードにログインし、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 -
本番環境では、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 ページで対象のキューの 編集 をクリックすることで変更できます。
-
YARN クラスターの Web UI で、`warehouse` キューに送信された SparkLR ジョブが `batch` パーティションで実行されていることを確認できます。
YARN のキューとノードパーティションを設定することで、特定のビジネスワークロードに対して論理的および物理的なリソース分離が提供されます。これにより、ジョブ間の干渉を効果的に防ぎ、重要なアプリケーションのパフォーマンスと安定性を確保します。
よくある質問
-
spark-submitを使用して Spark ジョブを送信したときに、ジョブが指定されたパーティションで実行されないのはなぜですか?-
送信コマンドに
spark.yarn.executor.nodeLabelExpressionパラメーターが含まれているか確認してください。 -
[パーティション] および [リソースキューの編集] ページの設定が有効になっていることを確認してください。
-
-
spark-submitを使用して Spark ジョブを送信したときに、ジョブのステータスがACCEPTEDのままなのはなぜですか?-
ジョブが送信されたキューに利用可能なリソースがあることを確認してください。ない場合は、他のジョブがリソースを解放するのを待ってから、ジョブを再送信してください。
-
キューに利用可能なリソースがある場合は、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 = <DEFAULT_PARTITION>; AM Resource Request = <memory:2048, vCores:1>; Queue Resource Limit for AM = <memory:2048, vCores:4>; User AM Resource Limit of the queue = <memory:224, vCores:1>; Queue AM Resource Usage = <memory:896, vCores:1>; -
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 ノードパーティションの原則に関する詳細については、「ノードラベルの使用」をご参照ください。