ノードラベルを使用すると、YARN はジョブを特定のノードパーティションにルーティングすることで、物理層でジョブを隔離できます。このトピックでは、E-MapReduce (EMR) で YARN Capacity Scheduler のキューとノードラベルパーティションを設定し、論理的および物理的なジョブの隔離を実現する方法について説明します。
背景情報
YARN は、リソース管理のために、キューとノードラベルという 2 つの補完的なメカニズムを提供します。
キューは、論理的なリソース割り当てを処理します。事前に設定された比率でクラスターの計算リソースをユーザーグループやアプリケーションに分割し、共有クラスター内でさまざまなチームやワークロードタイプが公平なシェアを得られるようにします。
ノードラベルは、物理ノードをパーティションにグループ化します。ノードにタグを付けることで、ジョブを特定のハードウェアにルーティングできます。たとえば、メモリ集約型のリアルタイムジョブをメモリ最適化インスタンスに、バッチジョブを標準的な計算インスタンスに振り分けることができます。
キューとノードラベルを併用することで、論理的および物理的な隔離の両方を実現できます。キューは誰がどれだけのリソースを得るかを管理し、ノードラベルはジョブが実際にどこで実行されるかを制御します。
パーティションタイプ
パーティションを作成する際、パーティションタイプとして [排他的] を選択できます。排他的パーティションでは、パーティションが完全に一致する場合にのみ、コンテナがそのパーティション内のノードに割り当てられます。これにより、ジョブが指定されたノードに物理的に隔離されることが保証されます。
このトピックの主なユースケースであるワークロードの隔離には、排他的パーティションを使用します。
前提条件
開始する前に、以下のものがあることを確認してください:
-
YARN サービスが実行されている EMR クラスター
-
YARN スケジューラとして Capacity Scheduler が設定されていること (Capacity Scheduler のみがノードラベルをサポートします)
キューとノードラベルの設定
この例では、EMR V5.16.0 を実行している DataLake クラスターを使用します。同じ手順が他の EMR クラスタータイプおよびバージョンにも適用されます。
シナリオ:ある企業が、オフラインバッチジョブとリアルタイムストリーミングジョブを隔離するために、2 つの子キュー (warehouse と analysis) と 2 つのパーティション (batch と streaming) を必要としています。
リソース割り当てのターゲット:
設定は 4 つのステップで構成されます:
-
リソースキューの編集
-
パーティションの追加とノードの関連付け
-
パーティションとキューの関連付け管理の有効化
-
特定のパーティションへのジョブの送信
ステップ 1:リソースキューの編集
-
EMR コンソールにログインします。EMR コンソール の [ECS 上の EMR] ページで、クラスターを見つけ、「操作」列の [サービス] をクリックします。「サービス」タブで、[YARN] をクリックします。
-
[YARN] サービスページで、[リソースキューの編集] タブをクリックし、[キューの管理] をクリックします。
-
「子キューの管理」ダイアログボックスで、「キューの追加」をクリックして、
warehouseおよびanalysisキューを作成します。各キューの「キュー容量」を設定し、「ステータス」を「開始済み」に設定します:キュー キューキャパシティ warehouse 60 analysis 30 default 10 

-
[未適用] をクリックします。[有効になる設定] ダイアログボックスで、[アクション] 列の [refresh_queues] をクリックします。

ステップ 2:パーティションの追加とノードの関連付け
-
「パーティション」タブをクリックし、次に「パーティションの追加」をクリックして、「
streaming」パーティションを作成します。「パーティションの追加」ダイアログボックスで、次のパラメーターを設定します:-
パーティション名:
streaming -
パーティションの種類: 排他的 — このパーティション内のノードにコンテナが割り当てられるのは、パーティションが完全に一致する場合のみです。
-
[関連付けられたノードグループ]: このパーティションに関連付けるノードグループを選択します。この例では、
emr-task-3が選択されています。emr-task-3ノードグループには、大量の中間データを保持し、低遅延を必要とするリアルタイムジョブに適したメモリ最適化インスタンスが含まれています。インスタンスタイプおよびワークロード要件に基づいてノードグループを選択してください。

-
-
上記の手順を繰り返して、
batchパーティションを追加します。
-
「[有効になっていません]」をクリックします。「[適用される設定]」ダイアログボックスで、「[refresh_labels]」を「[操作]」列でクリックします。

-
構成が有効になると、[合計リソース] 列で各パーティションの合計リソースを確認します。

ステップ 3:パーティションとキューの関連付け管理の有効化
-
[リソースキューの編集] タブで、[パーティションの選択] ドロップダウンリストから
batchパーティションを選択し、[パーティションとキューの関連付け管理を有効化] を有効化します。 -
「[パーティションとキューの関連付け管理を有効化]」ダイアログボックスで、各キューの[キュー容量]を設定し、次に[OK]をクリックします。この手順を
streamingパーティションについても繰り返します。この例では、すべてのキューが両方のパーティションにアクセスできます。パーティションを特定のキューからのジョブのみに制限するには、他のキューのキャパシティを
0に設定します。キュー batch パーティションのキャパシティ streaming パーティションのキャパシティ warehouse 60 70 analysis 30 20 default 10 10 
-
[未適用] をクリックします。[有効になる設定] ダイアログボックスで、[アクション] 列の [キューのリフレッシュ] をクリックします。
-
YARN Web UI でノードラベルがアクティブであることを確認します。
-
Node Labels ページ:パーティションとそのタイプを確認します。

-
Scheduler ページ:キューとパーティションのキャパシティ割り当てを確認します。

-
ステップ 4:特定のパーティションへのジョブの送信
キューとノードラベルの設定が完了したら、spark.yarn.am.nodeLabelExpression パラメーターと spark.yarn.executor.nodeLabelExpression パラメーターを使用して、特定のキューとパーティションにジョブを送信します。
-
マスターノードにログインし、Spark のインストールディレクトリに移動します:
cd /opt/apps/SPARK3/spark-3.3.1-hadoop3.2-1.1.1 -
warehouseキューとbatchパーティションをターゲットとする Spark ジョブを送信します:ノードラベル式を指定せずにキューのみを指定した場合、ジョブはキューのデフォルトパーティションで実行されます。キューのデフォルトパーティションを変更するには、[リソースキューの編集] タブで、キューの [アクション] 列にある [編集] をクリックします。
パラメーター 説明 この例での値 --classアプリケーションのメインクラス org.apache.spark.examples.SparkLR--masterリソースマネージャー yarn--deploy-modeドライバーが開始する場所 cluster--driver-memoryドライバーのメモリ 1g--executor-memoryエグゼキュータあたりのメモリ 2g--conf spark.yarn.am.nodeLabelExpressionAM のパーティション batch--conf spark.yarn.executor.nodeLabelExpressionエグゼキュータのパーティション batch--queueターゲットキュー warehouse./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.jarApplicationMaster (AM) とエグゼキュータをターゲットパーティションにルーティングするには、
spark.yarn.am.nodeLabelExpressionとspark.yarn.executor.nodeLabelExpressionの両方を設定する必要があります。 -
YARN Web UI で、SparkLR ジョブが
warehouseキューのbatchパーティションで実行されていることを確認します。
よくある質問
spark-submit を使用しても、ジョブが期待されるパーティションで実行されません。
送信コマンドに spark.yarn.am.nodeLabelExpression と spark.yarn.executor.nodeLabelExpression の両方が含まれていることを確認してください。キューのみが指定されている場合、ジョブは名前付きパーティションではなく、キューのデフォルトパーティションで実行されます。また、キューとパーティションの設定をリフレッシュして、それらが適用されていることを確認してください。
ジョブが ACCEPTED ステータスのままで開始されません。
まず、ターゲットキューに十分なリソースがあるか確認してください。他のジョブがキューのキャパシティを消費している場合は、それらが完了するのを待ってから再送信してください。
キューに十分なリソースがあると思われる場合は、YARN Web UI でジョブを開き、[診断] フィールドを確認します。Queue's AM resource limit exceeded と表示されている場合、キューにはリソースがありますが、ApplicationMaster のリソースの割合が低すぎます。AM リソースプールはエグゼキュータプールとは別です。多くのジョブが AM スロットを競合すると、新しいジョブがスタックします。
AM リソースの割合を増やすには、YARN サービスページの [構成] タブで capacity_scheduler.xml を見つけ、yarn.scheduler.capacity.maximum-am-resource-percent の値を上げます。たとえば、0.25 から 0.5 に変更します。
ワークロードのパターンに基づいて AM のリソース率を調整してください。多数の小規模で短時間のジョブを実行するクラスターは、通常、AM のリソース率を高く設定することでメリットが得られます。