複数のチームが Hadoop クラスターを共有する場合、リソースの競合によってジョブのパフォーマンスが予測不能になり、コスト配分が困難になります。YARN スケジューラは、テナントごとのリソース保証を強制し、マルチテナントの公平性ポリシーを適用し、ホットスポットを防ぐためにノード使用率を最適化することで、この問題を解決します。
E-MapReduce (EMR) の YARN では、キャパシティスケジューラの使用を推奨します。このドキュメントでは、キャパシティスケジューラの仕組みと設定方法について説明します。その他のスケジューラタイプについては、Apache Hadoop YARN のドキュメントを参照してください。
スケジューラの選択
| スケジューラ | デフォルト | マルチテナント対応 | ノードラベル / ノード属性 / 配置制約 | 使用するケース |
|---|---|---|---|---|
| FIFO スケジューラ | — | 非対応 | 非対応 | シンプルなシングルテナントシナリオ。本番環境ではほとんど使用されません。 |
| フェアスケジューラ | CDH (Cloudera Distributed Hadoop) | 対応 | 非対応 | レガシー CDH クラスター。新規デプロイには推奨されません。 |
| キャパシティスケジューラ | Apache Hadoop、HDP、CDP | 対応 | 対応 | パフォーマンスとリソース分離の要件があるマルチテナント本番クラスター。E-MapReduce (EMR) の YARN での使用を推奨します。 |
キャパシティスケジューラは、グローバルスケジューリング、ノードラベル、ノード属性、配置制約など、マルチテナント管理とリソーススケジューリングの全機能を提供します。キャパシティスケジューラについては、本ドキュメントの以降のセクションで詳しく説明します。
Capacity Scheduler の動作原理
スケジューリングモード
Capacity Scheduler の MainScheduler は、3 つのトリガーモードをサポートしています。
| モード | 動作方法 | 最適なシナリオ |
|---|---|---|
| ノードハートビート駆動 | ノードがハートビートを送信すると MainScheduler がトリガーされます。スケジューリングはノードローカルで実行され、ハートビート間隔に依存するため、多数のノードでリソースが不足している場合、スケジューリング効率が低下する可能性があります。 | スケジューリングのパフォーマンスと機能の要件が低いクラスター。 |
| 非同期スケジューリング | 非同期スレッドがノードリストからランダムにノードを選択してスケジューリングを実行します。これにより、グローバル状態を必要とせずにスループットが向上します。 | パフォーマンス要件は高いが、機能要件は低いクラスター。 |
| グローバルスケジューリング | グローバルスレッドがマルチテナントの公平性と優先度に基づいてアプリケーションを選択し、次にリソースサイズ、配置制約、クラスター全体のリソース分布に基づいてノードを選択します。これにより、最適なスケジューリング決定が行われます。 | スケジューリングのパフォーマンスと機能の両方に高い要件があるクラスター。 |
グローバルスケジューリングでは、独自の設定に加えて、非同期スケジューリングのすべての設定が必要です。詳細については、「グローバルスケジューリング」をご参照ください。
アーキテクチャ (グローバルスケジューリング)
次の図は、YARN 3.2 以降に基づくグローバルスケジューリングのアーキテクチャを示しています。
MainScheduler は、非同期マルチスレッドフレームワークとして動作します。
割り当てスレッドは、最優先のリソース要求を特定し、リソースサイズと配置制約に基づいて候補ノードを選択し、割り当て提案を生成して中間キューに配置します。
投入スレッドは、割り当て提案を消費し、配置制約とアプリケーション/ノードの要件を再確認した後、各提案をコミットまたは破棄し、スケジューラの状態を更新します。
ReScheduler は、動的リソース監視フレームワークとして定期的に実行されます。キュー間プリエンプション、キュー内プリエンプション、予約リソースプリエンプションのポリシーを実装します。
Node Sorting Manager と Placement Constraint Manager は、MainScheduler のグローバルスケジューリングプラグインです。これらは、負荷分散と複雑な配置制約管理を処理します。
コンテナ割り当てプロセス
次の図は、Capacity Scheduler のグローバルスケジューリングプロセスを示しています。
MainScheduler は、6 つのステップでコンテナを割り当てます。
パーティション (ノードラベル) の選択。クラスターには 1 つ以上のパーティションが存在する場合があります。MainScheduler は、パーティションに順番にコンテナを割り当てます。
リーフキューの選択。ルートキューから下方向にトラバースし、各レベルの子キューは保証リソースの割合の昇順で探索されます。使用率が低いキュー (上図の緑色) は、使用率が高いキュー (赤色) よりも先にリソースを受け取ります。
アプリケーションの選択。キュー内で、MainScheduler はキューの順序付けポリシーに基づいてアプリケーションを選択します。
公平ポリシー:割り当て済みメモリリソースの昇順
FIFO ポリシー:優先度の降順、次にアプリケーション ID の昇順
要求の選択。MainScheduler は、選択されたアプリケーション内で優先度に基づいて要求を選択します。
ソート済み候補ノードの選択。MainScheduler は、ソート済みのすべてのノードを検索し、要求のリソース要件と配置制約を満たす候補を見つけます。
コンテナの割り当て。各候補ノードに対して、MainScheduler はキューとノードの割り当て済み、使用中、未確認のリソースをチェックします。チェックに合格すると、割り当て提案を生成し、提案キューに配置します。
割り当て後、投入スレッドは各提案をアプリケーション、ノード、配置制約の要件に対して検証します。検証に失敗した提案は破棄され、承認された提案は有効になり、アプリケーションとノードのリソースアカウンティングが更新されます。
プリエンプション
ReScheduler はクラスターリソースを監視し、合計利用可能リソースがしきい値を下回り、特定のアプリケーションのリソースが不足している場合にプリエンプションをトリガーします。
| プリエンプションタイプ | トリガー条件 |
|---|---|
| キュー間プリエンプション | あるキューの保証リソースが完全に使用されているが、そのリソースを受け取る権利がある別のキューがクラスターにアイドル容量がないためにリソースを取得できない場合。キュー容量内のリソースは保証されます。容量を超えるが最大容量を下回るリソースは共有されます。 |
| キュー内プリエンプション | キュー内の優先度の高いアプリケーションがリソースを必要としているが、キューの割り当て量を使い切っている場合。ReScheduler は FIFO または公平ポリシーに基づいてリバランスを実行します。 |
| 予約リソースプリエンプション | リソースを予約したタスクがタイムアウトなどの解放条件を満たした場合。タスクとその予約リソースが解放されます。 |
主な特徴
マルチレベルのキュー管理:親キューのリソースクォータは、子キュー全体の使用量合計を制限します。いずれの子キューも、親キューのクォータを超えることはできません。これにより、複雑な組織構造において、制御可能なマルチテナント分離を実現できます。
リソースクォータ:キューごとに保証容量と最大容量を設定し、同時実行アプリケーション数に上限を設定し、ApplicationMaster (AM) のリソース配分を制限し、ユーザーごとのリソース比率を制御します。
弾力的なリソース共有:クラスターと親キューにアイドルリソースがある場合、子キューは兄弟キューから未使用の保証リソースを借りることができます。弾力的な容量 = 最大キュー容量 - 保証容量。
アクセス制御リスト (ACL) に基づくアクセス制御:キューごとに、特定のユーザーまたはグループに投入および管理権限を割り当てます。1 人のユーザーが複数のキューを管理することも、複数のユーザーが同じキューへの投入アクセスを共有することも可能です。
テナント間のキュースケジューリング:同一キューレベルでは、キューは保証リソースの割合の昇順でスケジューリングされるため、割り当てが小さいキューが先に処理されます。優先度を設定している場合、キューは 2 つのグループ (容量以下のキューと容量を超えるキュー) に分割され、各グループ内では容量以下のキューが先に処理されます。
テナント内のアプリケーションスケジューリング:キュー内では、アプリケーションはキューの順序付けポリシーに基づいてスケジューリングされます。FIFO ポリシーの場合:優先度の降順、次に投入時刻の昇順。フェアポリシーの場合:使用済みリソースの割合の昇順、次に投入時刻の昇順。
プリエンプション:クラスターリソースの変化に応じて、キューとアプリケーションのリソース使用量のバランスを維持します。3 種類のプリエンプションタイプについては、プリエンプションをご参照ください。
Capacity Scheduler の設定
グローバル設定
yarn-site.xml と capacity-scheduler.xml で、次の設定を行います。
| 設定ファイル | 設定項目 | 推奨値 | 説明 |
|---|---|---|---|
yarn-site.xml | yarn.resourcemanager.scheduler.class | 空欄のままにします | スケジューラクラス。デフォルト:org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler。 |
capacity-scheduler.xml | yarn.scheduler.capacity.maximum-applications | 空欄のままにします | クラスターで同時実行できるアプリケーションの最大数。デフォルト:10000。 |
yarn.scheduler.capacity.global-queue-max-application | 空欄のままにします | キューごとの同時実行アプリケーションの最大数。設定しない場合、キューごとの上限は次の式で計算されます:キュー容量 / クラスターリソース × maximum-applications。容量が小さいキューで多数のアプリケーションを実行する必要がある場合など、特別な要件があるキューに対してのみ設定してください。 | |
yarn.scheduler.capacity.maximum-am-resource-percent | 0.25 | ApplicationMaster (AM) コンテナが使用できるキューリソースの最大割合。上限は「この値 × 最大キュー容量」です。デフォルト:0.1。AM コンテナ比率が高い小規模アプリケーションを多数実行するキューでは、この値を増やしてください。 | |
yarn.scheduler.capacity.resource-calculator | org.apache.hadoop.yarn.util.resource.DominantResourceCalculator | キュー、ノード、アプリケーション向けのリソース計算機。デフォルト (DefaultResourceCalculator) はメモリのみを考慮します。DominantResourceCalculator は、設定されているすべてのリソースタイプ (メモリ、CPU、その他) を考慮し、最も消費されているリソースを主要リソースとして使用します。説明 この項目の変更には ResourceManager の再起動が必要です (高可用性 (HA) を有効化している場合は、プライマリ/セカンダリ スイッチオーバー)。リフレッシュ操作では不十分です。 | |
yarn.scheduler.capacity.node-locality-delay | -1 | ノードローカリティを緩和するまでにスキップするスケジューリングサイクル数。デフォルト:40。ローカリティ遅延を無効化してスケジューリングのパフォーマンスを向上させるには、-1 に設定します。最新のネットワークとストレージでは、ローカルスケジューリングがボトルネックになることはまれです。 |
ノードハートビート設定
| 設定ファイル | 設定項目 | 推奨値 | 説明 |
|---|---|---|---|
capacity-scheduler.xml | yarn.scheduler.capacity.per-node-heartbeat.multiple-assignments-enabled | false | ハートビートごとに複数のコンテナを割り当てるかどうか。デフォルト:true。これを有効にすると、負荷分散に影響し、ホットスポットが発生する可能性があります。 |
yarn.scheduler.capacity.per-node-heartbeat.maximum-container-assignments | 空欄のままにします | ハートビートごとに割り当て可能なコンテナの最大数。デフォルト:100。multiple-assignments-enabled が true の場合にのみ有効です。 | |
yarn.scheduler.capacity.per-node-heartbeat.maximum-offswitch-assignments | 空欄のままにします | ハートビートごとに割り当て可能なオフスイッチコンテナの最大数。multiple-assignments-enabled が true の場合にのみ有効です。 |
非同期スケジューリング
| 設定ファイル | 設定項目 | 推奨値 | 説明 |
|---|---|---|---|
capacity-scheduler.xml | yarn.scheduler.capacity.schedule-asynchronously.enable | true | 非同期スケジューリングを有効にするかどうか。デフォルト:false。スケジューリングのパフォーマンスを向上させるには、有効化してください。 |
yarn.scheduler.capacity.schedule-asynchronously.maximum-threads | 1、または空欄のままにします | 非同期スケジューリングの最大スレッド数。デフォルト:1。複数スレッドでは重複した提案が生成される可能性があります。多くの場合、単一スレッドで十分です。 | |
yarn.scheduler.capacity.schedule-asynchronously.maximum-pending-backlogs | 空欄のままにします | キュー内で保留できる割り当て提案の最大数。デフォルト:100。大規模クラスターでは、この値を増やしてください。 |
グローバルスケジューリング
グローバルスケジューリングを使用するには、前の表に記載されている非同期スケジューリングのすべての設定が必要です。
| 設定ファイル | 設定項目 | 推奨値 | 説明 |
|---|---|---|---|
capacity-scheduler.xml | yarn.scheduler.capacity.multi-node-placement-enabled | true | グローバルスケジューリングを有効にするかどうか。デフォルト:false。スケジューリングのパフォーマンスと機能の両方に対する要件が高いクラスターでは、有効化してください。 |
yarn.scheduler.capacity.multi-node-sorting.policy | default | アクティブなグローバルスケジューリングポリシーの名前。 | |
yarn.scheduler.capacity.multi-node-sorting.policy.names | default | グローバルスケジューリングポリシー名のカンマ区切りのリスト。 | |
yarn.scheduler.capacity.multi-node-sorting.policy.default.class | org.apache.hadoop.yarn.server.resourcemanager.scheduler.placement.ResourceUsageMultiNodeLookupPolicy | default ポリシーの実装クラス。割り当て済みリソースの絶対量の昇順でノードをソートします。 | |
yarn.scheduler.capacity.multi-node-sorting.policy.default.sorting-interval.ms | 0 (小規模クラスター) / 1000 (ノード数が 1,000 を超えるクラスター) | ノードソートのキャッシュ更新間隔。デフォルト:1000 ms。同期ソート (キャッシュなし) にするには 0 に設定します。大規模クラスターでは、1000 に設定してノードキャッシュを有効化し、パフォーマンスを向上させます。説明 ノードキャッシュを有効にすると、コンテナが上位にランク付けされたノードに集中する可能性があります。本番環境で有効化する前に、影響をテストしてください。 |
ノードパーティション設定
ノードパーティション (ノードラベル) の設定については、「ノードラベル」をご参照ください。
キュー設定
基本キュー設定
基本キュー設定では、キュー階層、保証リソース、最大リソースを定義します。次の例は、組織の部門間で共有される 4 つの子キューを持つルートキューを示しています。
キュー構造の例:
| キュー | 保証リソース | 最大リソース | 子キュー |
|---|---|---|---|
root | 100% | 100% | dev, test, support, default |
root.dev | 50% | 100% | training, services |
root.dev.training | dev の 40% | dev の 100% | — |
root.dev.services | dev の 60% | dev の 100% | — |
root.test | 30% | 50% | — |
root.support | 10% | 30% | — |
root.default | 10% | 100% | — |
次の capacity-scheduler.xml の例では、この構造を設定しています。組織のキュー構成に合わせてコピーし、調整してください。
<configuration>
<!-- ルートレベルの子キュー -->
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>dev,test,support,default</value>
</property>
<!-- dev キュー: 50% 保証、100% 最大 -->
<property>
<name>yarn.scheduler.capacity.root.dev.capacity</name>
<value>50</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.dev.maximum-capacity</name>
<value>100</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.dev.queues</name>
<value>training,services</value>
</property>
<!-- dev.training: dev の 40% 保証、dev の 100% 最大 -->
<property>
<name>yarn.scheduler.capacity.root.dev.training.capacity</name>
<value>40</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.dev.training.maximum-capacity</name>
<value>100</value>
</property>
<!-- dev.services: dev の 60% 保証、dev の 100% 最大 -->
<property>
<name>yarn.scheduler.capacity.root.dev.services.capacity</name>
<value>60</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.dev.services.maximum-capacity</name>
<value>100</value>
</property>
<!-- test キュー: 30% 保証、50% 最大 -->
<property>
<name>yarn.scheduler.capacity.root.test.capacity</name>
<value>30</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.test.maximum-capacity</name>
<value>50</value>
</property>
<!-- support キュー: 10% 保証、30% 最大 -->
<property>
<name>yarn.scheduler.capacity.root.support.capacity</name>
<value>10</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.support.maximum-capacity</name>
<value>30</value>
</property>
<!-- default キュー: 10% 保証、100% 最大 -->
<property>
<name>yarn.scheduler.capacity.root.default.capacity</name>
<value>10</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.maximum-capacity</name>
<value>100</value>
</property>
</configuration>YARN ResourceManager の [Application Queues] ページで、キュー設定が反映されていることを確認できます。キュー階層ツリーには、root の下に default、test、support、dev が表示され、dev の下に training と services のサブキューが表示されます。[dev.services] キューを展開して、実行状態の詳細を確認します:
Queue State: RUNNING
Effective Capacity:
memory:7864, vCores:4(60.0%)Effective Max Capacity:
memory:26214, vCores:16(100.0%)Absolute Configured Capacity: 30.0%
Max Applications: 3000
Ordering Policy: FifoOrderingPolicy
Preemption: disabled
次の表は、この構造に対応する capacity-scheduler.xml パラメータを説明しています。
| 設定ファイル | 設定項目 | サンプル値 | 説明 |
|---|---|---|---|
capacity-scheduler.xml | yarn.scheduler.capacity.root.queues | dev,test,support,default | ルートキューの子キュー。複数のキューはカンマで区切ります。 |
yarn.scheduler.capacity.root.dev.capacity | 50 | クラスターリソース総量に対する dev キューの保証リソースの割合。 | |
yarn.scheduler.capacity.root.dev.maximum-capacity | 100 | クラスターリソース総量に対する dev キューの最大リソースの割合。 | |
yarn.scheduler.capacity.root.dev.queues | training,services | dev キューの子キュー。 | |
yarn.scheduler.capacity.root.dev.training.capacity | 40 | dev の保証リソースに対する training の保証リソースの割合。 | |
yarn.scheduler.capacity.root.dev.training.maximum-capacity | 100 | dev の最大リソースに対する training の最大リソースの割合。 | |
yarn.scheduler.capacity.root.dev.services.capacity | 60 | dev の保証リソースに対する services の保証リソースの割合。 | |
yarn.scheduler.capacity.root.dev.services.maximum-capacity | 100 | dev の最大リソースに対する services の最大リソースの割合。 | |
yarn.scheduler.capacity.root.test.capacity | 30 | クラスターリソース総量に対する test キューの保証リソースの割合。 | |
yarn.scheduler.capacity.root.test.maximum-capacity | 50 | クラスターリソース総量に対する test キューの最大リソースの割合。 | |
yarn.scheduler.capacity.root.support.capacity | 10 | クラスターリソース総量に対する support キューの保証リソースの割合。 | |
yarn.scheduler.capacity.root.support.maximum-capacity | 30 | クラスターリソース総量に対する support キューの最大リソースの割合。 | |
yarn.scheduler.capacity.root.default.capacity | 10 | クラスターリソース総量に対する default キューの保証リソースの割合。 | |
yarn.scheduler.capacity.root.default.maximum-capacity | 100 | クラスターリソース総量に対する default キューの最大リソースの割合。 |
高度なキュー設定
| 設定ファイル | 設定項目 | 推奨値 | 説明 |
|---|---|---|---|
capacity-scheduler.xml | yarn.scheduler.capacity.<queue_path>.ordering-policy | fair | キュー内のアプリケーションの順序付けポリシー。fifo (デフォルト):優先度の降順、次に投入時刻の昇順。fair:使用済みリソースの割合の昇順、次に投入時刻の昇順。ほとんどの本番キューでは fair に設定してください。 |
yarn.scheduler.capacity.<queue_path>.ordering-policy.fair.enable-size-based-weight | 空欄のままにします | 重み付けによるフェアスケジューリングを使用するかどうか。デフォルト:false (使用済みリソースでスケジュール)。true の場合、スケジューリングは「使用済みリソース / 必要リソース」に基づきます。これにより、リソースの競合時に大規模アプリケーションが飢餓状態になることを防ぎやすくなります。 | |
yarn.scheduler.capacity.<queue_path>.state | 空欄のままにします | キューの状態。デフォルト:RUNNING。キューを削除する場合にのみ、STOPPED に設定します。キューは、すべてのアプリケーションが完了した後に削除されます。 | |
yarn.scheduler.capacity.<queue_path>.maximum-am-resource-percent | 空欄のままにします | キューごとの AM リソース制限。デフォルト:yarn.scheduler.capacity.maximum-am-resource-percent から継承します。 | |
yarn.scheduler.capacity.<queue_path>.user-limit-factor | 空欄のままにします | 単一ユーザーの上限係数。ユーザーが使用できる最大リソースは次のとおりです:min (最大キューリソース、保証キューリソース × userLimitFactor)。デフォルト:1.0。 | |
yarn.scheduler.capacity.<queue_path>.minimum-user-limit-percent | 空欄のままにします | 単一ユーザーに保証されるリソースの最小割合 (%)。この値は、キュー内の各ユーザーに保証されるリソースの下限を定義します。デフォルトは 100 で、単一ユーザーがキューの保証リソースをすべて使用できることを意味します。 | |
yarn.scheduler.capacity.<queue_path>.maximum-applications | 空欄のままにします | このキューで同時実行できるアプリケーションの最大数。デフォルト:保証リソースの割合 × yarn.scheduler.capacity.maximum-applications。 | |
yarn.scheduler.capacity.<queue_path>.acl_submit_applications | 空欄のままにします | このキューの投入 ACL。設定しない場合、親キューから継承します。 | |
yarn.scheduler.capacity.<queue_path>.acl_administer_queue | 空欄のままにします | このキューの管理 ACL。設定しない場合、親キューから継承します。 |
ACL 設定
ACL はデフォルトで無効です。組織でキューの投入と管理に対するアクセス制御が必要な場合にのみ有効化してください。
| 設定ファイル | 設定項目 | 推奨値 | 説明 |
|---|---|---|---|
yarn-site.xml | yarn.acl.enabled | 空欄のままにします | ACL を有効にするかどうか。デフォルト:false。 |
capacity-scheduler.xml | yarn.scheduler.capacity.<queue_path>.acl_submit_applications | 空欄のままにします | 投入 ACL。設定しない場合、親キューから継承します。デフォルトでは、ルートキューはすべてのユーザーに対してアプリケーションの投入を許可します。 |
yarn.scheduler.capacity.<queue_path>.acl_administer_queue | 空欄のままにします | 管理 ACL。設定しない場合、親キューから継承します。デフォルトでは、ルートキューはすべてのユーザーに対してキューの管理を許可します。 |
親キューの ACL は、すべての子キューに適用されます。ルートキューがすべてのユーザーを許可する (デフォルト) 場合、子キューの ACL 制限は有効になりません。子キューの ACL を強制するには、まず次の設定でルートキューを制限します:
yarn.scheduler.capacity.root.acl_submit_applications=<space>yarn.scheduler.capacity.root.acl_administer_queue=<space>
キューに対してユーザーまたはグループに投入権限と管理権限の両方を付与するには、そのキューで acl_submit_applications と acl_administer_queue の両方を設定します。
プリエンプション設定
プリエンプションは、テナント間での公平なリソース分配を確保し、アプリケーションの優先度を尊重します。厳格なスケジューリング要件があるクラスターでは、有効化してください。プリエンプションを使用するには YARN V2.8.0 以降が必要です。
| 設定ファイル | 設定項目 | 推奨値 | 説明 |
|---|---|---|---|
yarn-site.xml | yarn.resourcemanager.scheduler.monitor.enable | true | プリエンプションを有効化します。 |
capacity-scheduler.xml | yarn.resourcemanager.monitor.capacity.preemption.intra-queue-preemption.enabled | true | キュー内プリエンプションを有効化します。キュー間プリエンプションはデフォルトで有効であり、無効化できません。 |
yarn.resourcemanager.monitor.capacity.preemption.intra-queue-preemption.preemption-order-policy | priority_first | キュー内プリエンプションの順序付けポリシー。デフォルト:userlimit_first。 | |
yarn.scheduler.capacity.<queue-path>.disable_preemption | true | このキューをプリエンプションから保護するかどうか。設定しない場合、親から継承します。ルートキューでこれを true に設定すると、すべてのキューが保護されます。ルートレベルのデフォルト:false (キューはプリエンプションされる可能性があります)。 | |
yarn.scheduler.capacity.<queue-path>.intra-queue-preemption.disable_preemption | true | このキューのキュー内プリエンプションを無効化するかどうか。設定しない場合、親から継承します。 |
RESTful API を使用したキュー設定の管理
YARN V3.2.0 以降では、RESTful API を使用して増分の設定更新を適用し、現在有効なすべての設定を capacity-scheduler.xml で確認できます。以前のバージョンでは、RefreshQueues 操作による全更新のみがサポートされており、有効な設定を確認する方法はありません。
RESTful API によるキュー管理を有効にするには、次の設定を yarn-site.xml に追加します:
| 設定項目 | 推奨値 | 説明 |
|---|---|---|
yarn.scheduler.configuration.store.class | fs | スケジューラ設定のストレージタイプ。 |
yarn.scheduler.configuration.max.version | 100 | ファイルシステムに保存する設定バージョンの最大数。古いバージョンは自動的に削除されます。 |
yarn.scheduler.configuration.fs.path | /yarn/<cluster-name>/scheduler/conf | capacity-scheduler.xml を保存するパス。パスが存在しない場合は自動的に作成されます。<cluster-name> は実際のクラスター名に置き換えてください。YARN サービスがデプロイされた複数のクラスターで、同じ分散ストレージを使用できます。 |
有効な設定の確認:
RESTful API:
http://<rm-address>/ws/v1/cluster/scheduler-confHDFS:
${yarn.scheduler.configuration.fs.path}/capacity-scheduler.xml.<timestamp>- タイムスタンプが最大のファイルが最新バージョンです。
設定の増分更新:
次の例では、yarn.scheduler.capacity.maximum-am-resource-percent を 0.2 に変更し、yarn.scheduler.capacity.xxx パラメータを削除します。パラメータを削除するには、value フィールドを省略します。
curl -X PUT -H "Content-type: application/json" 'http://<rm-address>/ws/v1/cluster/scheduler-conf' -d '
{
"global-updates": [
{
"entry": [{
"key": "yarn.scheduler.capacity.maximum-am-resource-percent",
"value": "0.2"
},{
"key": "yarn.scheduler.capacity.xxx"
}]
}
]
}'コンテナごとのリソース制限
単一コンテナの最大リソースは、次の設定によって決まります。コンテナ要求が上限を超えると、スケジューラは InvalidResourceRequestException: Invalid resource request... エラーをログに記録します。
| 設定ファイル | 設定項目 | 説明 | デフォルト |
|---|---|---|---|
yarn-site.xml | yarn.scheduler.maximum-allocation-mb | クラスターレベルのコンテナあたりの最大メモリ。単位:MiB。 | メモリが最大のノードグループの yarn.nodemanager.resource.memory-mb の値。クラスター作成時に設定されます。 |
yarn.scheduler.maximum-allocation-vcores | クラスターレベルのコンテナあたりの最大 CPU。単位:vCore。 | 32 | |
capacity-scheduler.xml | yarn.scheduler.capacity.<queue-path>.maximum-allocation-mb | キューレベルのコンテナあたりの最大メモリ。このキューに限り、クラスターレベルの設定を上書きします。 | 空欄 (クラスターレベルの設定を継承) |
yarn.scheduler.capacity.<queue-path>.maximum-allocation-vcores | キューレベルのコンテナあたりの最大 CPU。このキューに限り、クラスターレベルの設定を上書きします。 | 空欄 (クラスターレベルの設定を継承) |