View a markdown version of this page

仮想クラスターの管理 - Amazon EMR

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

仮想クラスターの管理

仮想クラスターとは、Amazon EMR が登録されている Kubernetes 名前空間です。仮想クラスターを作成、説明、一覧表示、および削除できます。システム内の追加のリソースは消費されません。1 つの仮想クラスターは、1 つの Kubernetes 名前空間にマップされます。この関係により、Kubernetes 名前空間をモデル化するのと同じ方法で仮想クラスターをモデル化して、要件を満たすことができます。Kubernetes 概念概要 ドキュメントで、考えられるユースケースを参照してください。

Amazon EMR を Amazon EKS クラスターの Kubernetes 名前空間に登録するには、EKS クラスターの名前と、ワークロードを実行するためにセットアップされた名前空間が必要です。Amazon EMR に登録されたこれらのクラスターは、物理的なコンピューティングやストレージを管理するのではなく、ワークロードがスケジュールされている Kubernetes 名前空間を指しているため、仮想クラスターと呼ばれます。

注記

仮想クラスターを作成する前に、まず「Amazon EMR on EKS のセットアップ」のステップ 1 ~ 8 を完了する必要があります。

仮想クラスターを作成する

次のコマンドを実行して、Amazon EMR を EKS クラスター上の名前空間に登録し、仮想クラスターを作成します。virtual_cluster_name は、仮想クラスターに指定する名前に置き換えます。eks_cluster_name は、EKS クラスターの名前に置き換えます。namespace_name は、Amazon EMR を登録する名前空間に置き換えます。

aws emr-containers create-virtual-cluster \ --name virtual_cluster_name \ --container-provider '{ "id": "eks_cluster_name", "type": "EKS", "info": { "eksInfo": { "namespace": "namespace_name" } } }'

または、次の例に示すように、仮想クラスターに必要なパラメータを含む JSON ファイルを作成することもできます。

{ "name": "virtual_cluster_name", "containerProvider": { "type": "EKS", "id": "eks_cluster_name", "info": { "eksInfo": { "namespace": "namespace_name" } } } }

JSON ファイルへのパスを指定して、次の create-virtual-cluster コマンドを実行します。

aws emr-containers create-virtual-cluster \ --cli-input-json file://./create-virtual-cluster-request.json
注記

仮想クラスターが正常に作成されたことを確認するには、list-virtual-clusters コマンドを実行するか、Amazon EMR コンソールで [仮想クラスター] ページに移動して、仮想クラスターのステータスを確認します。

仮想クラスターを一覧表示する

次のコマンドを実行して、仮想クラスターのステータスを表示します。

aws emr-containers list-virtual-clusters

仮想クラスターを説明する

次のコマンドを実行して、名前空間、ステータス、登録日など、仮想クラスターの詳細を取得します。123456 は、仮想クラスター ID に置き換えます。

aws emr-containers describe-virtual-cluster --id 123456

仮想クラスターを削除する

次のコマンドを実行して、仮想クラスターを削除します。123456 は、仮想クラスター ID に置き換えます。

aws emr-containers delete-virtual-cluster --id 123456

仮想クラスターの状態

次の表には、仮想クラスターの 4 つの状態が示されています。

State 説明

RUNNING

仮想クラスターは RUNNING 状態です。

TERMINATING

仮想クラスターの要求された終了処理が進行中です。

TERMINATED

要求された終了処理が完了しています。

ARRESTED

要求された終了処理は、アクセス許可が不十分なため、失敗しました。

仮想クラスターの同時ジョブ制限

Amazon EMR on EKS 仮想クラスターで同時ジョブ制限を設定して、同時に実行されるジョブ数とキューで待機できるジョブ数を制御できます。同時実行制限 (maxConcurrentJobRuns) とキューの深さ (maxInQueueJobRuns) を個別に設定して、実行中のジョブ実行、キューに入れられたジョブ実行、またはその両方を制限できるようにします。これらの制限を設定すると、StartJobRunAPI は仮想クラスターレベルでバックプレッシャーを提供します。実行中の制限を超えて実行されるジョブは、すぐに開始するのではなく、 SUBMITTED または PENDING状態のキューで待機し、キューがいっぱいになると、 はそれ以降の送信StartJobRunを拒否します。たとえば、500 回の同時ジョブ実行と 100 回のキューに入れられたジョブ実行を許可するように仮想クラスターを設定した場合、101 回目のキューに入れられた送信は拒否され、同じ EKS クラスター上の他の仮想クラスター間でワークロードを再調整したり、容量を追加したりできます。同時実行数の制限を設定しておらず、キューの深さが増加し続けているため、ジョブ実行が開始するまでに SUBMITTEDまたは PENDING状態が長くなると、基盤となる EKS クラスターのコンピューティングリソースが少なく、新しいポッドを十分な速さでスケジュールできないことが通知されます。その場合は、ワークロードを別のクラスターにルーティングするか、容量を追加します。

同時ジョブ制限は、Kubernetes スケジューラの前にコントロールレイヤーを追加し、Kubernetes ウェブサイトの ResourceQuota 機能を追加します。これらは で強制されるためStartJobRun、ポッドが作成される前に API で過剰な負荷がキューに入れられるか拒否されます。これにより、ジョブがクラスターに到達する前に基盤となるクラスターが保護されます。Kubernetes は引き続き、その下に実際の CPU とメモリの上限を適用します。

同時ジョブ制限の主な利点

  • ノイズの多い近隣のオーバーロードを防ぐ — 仮想クラスターごとに実行中のジョブ実行とキューに入れられたジョブ実行の数を制限します。これにより、単一の仮想クラスターが共有 EKS クラスターを独占できず、他の仮想クラスターでノイズの多い近隣のスケジューリングが失敗する可能性があります。

  • トラフィックシェーピングを有効にする — 仮想クラスターのキューがいっぱいになるとすぐに拒否されるため、1 つの仮想クラスターを圧倒するのではなく、他の仮想クラスターに送信をリダイレクトできます。

  • 可視性を提供 — 5 分ごとにアクティブジョブ実行JobsRunning数とキュー内ジョブ実行数のper-virtual-clusterと JobsInQueue CloudWatch メトリクスを AWS/EMRContainers名前空間に出力し、スケジューリングのヘルスシグナルを提供します。

同時ジョブ制限の開始方法

仮想クラスターの schedulerConfigurationフィールドで同時ジョブ制限を設定します。このフィールドには、次の 2 つのパラメータを使用できます。

maxConcurrentJobRuns

いつでも RUNNING状態になることができるジョブ実行の最大数。

maxInQueueJobRuns

いつでも PENDINGまたは SUBMITTED状態 (キューの深さ) にできるジョブ実行の最大数。

AWS CLI

仮想クラスターの作成時に制限を設定するには、リクエストschedulerConfigurationで を指定します。

aws emr-containers create-virtual-cluster \ --name my-virtual-cluster \ --container-provider '{ ... }' \ --scheduler-configuration '{ "maxConcurrentJobRuns": 500, "maxInQueueJobRuns": 100 }'

既存の仮想クラスターの制限を変更するには、 update-virtual-cluster コマンドを使用します。

aws emr-containers update-virtual-cluster \ --id virtual-cluster-id \ --scheduler-configuration '{ "maxConcurrentJobRuns": 500, "maxInQueueJobRuns": 100 }'

仮想クラスターから制限を削除するには、空の を渡しますschedulerConfiguration。これにより設定がクリアされるため、制限は適用されず、仮想クラスターはデフォルト (無制限) の動作に戻ります。リクエストschedulerConfigurationから を省略すると、既存の制限は変更されないことに注意してください。既存の制限をクリアするには、空のオブジェクトを渡す必要があります。

aws emr-containers update-virtual-cluster \ --id virtual-cluster-id \ --scheduler-configuration '{}'

現在の制限とライブジョブ数を表示するには、 describe-virtual-cluster コマンドを使用します。レスポンスには、 schedulerConfigurationと、現在の activeJobRunCountと を持つSchedulerStatusオブジェクトの両方が含まれますinQueueJobRunCount

注記

キューがいっぱいの仮想クラスターにジョブ実行を送信すると、 は StartJobRunを返しますValidationException

maxConcurrentJobRuns と maxInQueueJobRuns の値の選択

適切な制限は、Amazon EKS クラスターが一度に実行できる作業量、送信のバースト性、仮想クラスターがいっぱいになったときにどのように動作するかという 3 つの要因によって異なります。次のガイダンスを使用して開始点を選択し、ライブカウンターから絞り込みます。

maxConcurrentJobRuns の設定 (実行中のスロット)

maxConcurrentJobRuns はジョブ粒度、カウントベースのガードレールです。ここでの概算見積りにより、基盤となる Amazon EKS クラスターが負荷によって低下するのを防ぎ、可用性を向上させることができます。

  • 容量をジョブごとのフットプリントで割った値から開始します。各ジョブのリクエスト (ドライバー、エグゼキュター、メモリオーバーヘッド) に基づいて、名前空間容量の約 70~80% をターゲットにして、ドライバーのオーバーヘッド、ノードのスケールアップ、バーストのヘッドルームを確保します。

  • 各ジョブ (T シャツのサイズ設定) のサイズを上限します。すべてのジョブを にバインドspark.dynamicAllocation.maxExecutorsし、小規模 (エグゼキュター 20 個)、中規模 (100 個)、大規模 (約 500 個) など、いくつかのサイズで標準化します。これにより、 にキャップmaxConcurrentJobRunsを掛けると、可変平均の過剰プロビジョニングや過小プロビジョニングではなく、容量に予測可能にマッピングされます。最もクリーンな数学では、各サイズクラスを独自の仮想クラスターにルーティングします。

  • ライブカウンターから調整します。控えめに開始し、 および activeJobRunCountJobsRunningメトリクスを AWS/EMRContainers名前空間で監視しながら、値を徐々に引き上げます。

maxInQueueJobRuns の設定 (キューの深さ)

maxInQueueJobRuns は、送信の拒否を開始する前に、仮想クラスターが受け入れるバックログの大きさを制御します。これはバースト除去バッファです。以下の要素を考慮してください。

  • バーストプロファイル — キューのサイズを調整して、実行レートを超えると予想される送信バーストを吸収します。スケジュールされたパイプラインが一度に多くのジョブを発射する場合、深いキューは偽の拒否を防ぎます。深度は、 の固定倍数ではなく、予想されるバーストサイズに基づいてmaxConcurrentJobRuns、次のドレイン時間制限に照らして検証します。

  • 許容待機時間 — キューに入れられたジョブは、実行中のスロットが解放されるのを待ちます。フルキューの背面にあるジョブは、キューの深さを完了スループットで割って待機します。たとえば、ジョブが 1 分あたり N で終了し、キューが Q を保持する場合、末尾は Q を N 分で割って待機します。これを SLA 内に保持します。スロットが解放されない場合、バッファされたジョブは 30 分後に失敗するため、完全なキューが安定した完了速度で 30 分以内に十分にドレインするように十分にmaxInQueueJobRuns小さくしてください。それ以外の場合、キューに入れられたジョブはタイムアウトします。

  • バッファリングと比較したバックプレッシャー — 深いキューはバーストを滑らかにしますが、トラフィックシェーピングに使用するキュー全体の拒否を遅らせ、テールレイテンシーを向上させます。浅いキューは高速に失敗し、クライアントが他の場所で再試行またはルーティングするための初期の実用的なシグナルを提供します。ロードをバッファするかシードするかに基づいて選択し、リダイレクトします。

  • クライアントの再試行動作 — キューがいっぱいになると、 は StartJobRunを返しますValidationException。送信者がこの例外を処理することを確認します。バックオフで再試行するか、ワークロードを別の仮想クラスターにルーティングします。通常のオペレーション中ではなく、純粋なオーバーロード中にのみ拒否が発生するように深さを設定します。

同時ジョブの制限に関する考慮事項

  • デフォルトでは、制限は適用されません。を明示的に設定しない限り、既存の仮想クラスターとワークロードは影響を受けませんschedulerConfiguration

  • カウンターは分散システム全体で維持されるため、真の値からわずかな一時的な差が予想されることがあります。内部調整により、ドリフトが修正されます。