Hadoop: フェアスケジューラ

目的

このドキュメントでは、FairSchedulerについて説明します。これは、Hadoopのプラグ可能なスケジューラであり、YARNアプリケーションが大型クラスタのリソースを公平に共有できるようにします。

はじめに

フェアスケジューリングとは、時間経過とともにすべてのアプリケーションが平均してリソースを均等に共有できるように、アプリケーションにリソースを割り当てる方法です。Hadoop NextGenは、複数のリソースタイプのスケジューリングが可能です。デフォルトでは、フェアスケジューラはメモリのみを基準にスケジューリングの公平性を決定します。Ghodsiらが開発した支配的なリソースの公平性の概念を使用して、メモリとCPUの両方でスケジューリングするように設定できます。単一のアプリケーションが実行されている場合、そのアプリケーションはクラスタ全体を使用します。他のアプリケーションが送信されると、解放されたリソースは新しいアプリケーションに割り当てられ、最終的には各アプリケーションがほぼ同じ量のリソースを取得します。アプリケーションのキューを形成するデフォルトのHadoopスケジューラとは異なり、これにより、短いアプリケーションは妥当な時間で終了し、長期間実行されるアプリケーションが不足することはありません。また、複数のユーザー間でクラスタを共有するための妥当な方法でもあります。最後に、フェアシェアリングはアプリケーションの優先順位でも機能します。優先順位は重みとして使用され、各アプリケーションが取得するべきリソースの総量の割合を決定します。

スケジューラはアプリケーションをさらに「キュー」に編成し、これらのキュー間でリソースを公平に共有します。デフォルトでは、すべてのユーザーが「default」という単一のキューを共有します。アプリケーションがコンテナのリソース要求でキューを具体的にリストした場合、その要求はそのキューに送信されます。設定を通じて、要求に含まれるユーザー名に基づいてキューを割り当てることも可能です。各キュー内では、スケジューリングポリシーを使用して、実行中のアプリケーション間でリソースを共有します。デフォルトはメモリベースのフェアシェアリングですが、FIFOと支配的なリソースの公平性を備えたマルチリソースも設定できます。キューは階層的に配置してリソースを分割し、重みを使用してクラスタを特定の比率で共有するように設定できます。

フェアシェアリングを提供することに加えて、フェアスケジューラでは、キューに保証された最小共有を割り当てることができます。これは、特定のユーザー、グループ、またはプロダクションアプリケーションが常に十分なリソースを取得することを保証するために役立ちます。キューにアプリケーションが含まれている場合、そのキューは少なくとも最小共有を取得しますが、キューが保証された共有全体を必要としない場合、余剰分は他の実行中のアプリケーション間で分割されます。これにより、スケジューラはキューの容量を保証しながら、これらのキューにアプリケーションがない場合にリソースを効率的に利用できます。

フェアスケジューラでは、デフォルトですべてのアプリケーションを実行できますが、設定ファイルを通じて、ユーザーごとおよびキューごとの実行中のアプリケーションの数を制限することも可能です。これは、ユーザーが一度に何百ものアプリケーションを送信しなければならない場合、または一度に実行するアプリケーションが多すぎると中間データの作成が多すぎるか、コンテキストスイッチングが多すぎる場合のパフォーマンスを向上させるために役立ちます。アプリケーションの制限は、その後で送信されたアプリケーションが失敗する原因にはならず、ユーザーの以前のアプリケーションの一部が終了するまでスケジューラのキューで待機するだけです。

プラグ可能なポリシーを持つ階層型キュー

フェアスケジューラは階層型キューをサポートしています。「root」という名前のキューからすべてのキューが派生します。使用可能なリソースは、典型的なフェアスケジューリングの方法でrootキューの子に分散されます。次に、子は、同じ方法で子に割り当てられたリソースを分散します。アプリケーションはリーフキューでのみスケジュールできます。キューは、フェアスケジューラの割り当てファイルで親のサブ要素として配置することで、他のキューの子として指定できます。

キューの名前は、親の名前から始まり、区切り文字としてピリオドを使用します。そのため、rootキューの下にある「queue1」という名前のキューは「root.queue1」と呼ばれ、「parent1」という名前のキューの下にある「queue2」という名前のキューは「root.parent1.queue2」と呼ばれます。キューを参照する場合、名前のroot部分は省略可能です。そのため、queue1は「queue1」とだけ参照でき、queue2は「parent1.queue2」とだけ参照できます。

さらに、フェアスケジューラでは、各キューに異なるカスタムポリシーを設定して、ユーザーが希望する方法でキューのリソースを共有できます。カスタムポリシーは、org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.SchedulingPolicyを拡張することで構築できます。FifoPolicy、FairSharePolicy(デフォルト)、DominantResourceFairnessPolicyは組み込みであり、すぐに使用できます。

元の(MR1)フェアスケジューラに存在した、特定の追加機能はまだサポートされていません。その中には、特定のアプリケーションに対する優先順位の「ブースト」を管理するカスタムポリシーの使用が含まれます。

アプリケーションをキューに自動的に配置する

フェアスケジューラでは、管理者が、送信されたアプリケーションを適切なキューに自動的に配置するポリシーを設定できます。配置は、送信者のユーザーとグループ、およびアプリケーションによって渡された要求されたキューに依存できます。ポリシーは、受信アプリケーションを分類するために順次適用される一連のルールで構成されます。各ルールは、アプリケーションをキューに配置するか、拒否するか、次のルールに続行します。これらのポリシーの構成方法については、次のセクションの割り当てファイル形式を参照してください。

インストール

フェアスケジューラを使用するには、最初にyarn-site.xmlで適切なスケジューラクラスを割り当てます。

<property>
  <name>yarn.resourcemanager.scheduler.class</name>
  <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>

設定

フェアスケジューラをカスタマイズするには、通常、2つのファイルを変更します。まず、既存の設定ディレクトリにあるyarn-site.xmlファイルに設定プロパティを追加することで、スケジューラ全体のオプションを設定できます。次に、ほとんどの場合、ユーザーは、どのキューが存在し、それぞれの重みと容量が何であるかをリストする割り当てファイルを作成することをお勧めします。割り当てファイルは10秒ごとに再読み込みされるため、変更をオンザフライで行うことができます。

yarn-site.xmlに配置できるプロパティ

プロパティ 説明
yarn.scheduler.fair.allocation.file 割り当てファイルへのパス。割り当てファイルは、キューとそのプロパティに加えて、特定のポリシーのデフォルトを記述するXMLマニフェストです。このファイルは、次のセクションで説明されているXML形式である必要があります。相対パスが指定されている場合、ファイルはクラスパスで検索されます(通常はHadoop confディレクトリが含まれます)。デフォルトはfair-scheduler.xmlです。
yarn.scheduler.fair.user-as-default-queue キュー名が指定されていない場合に、割り当てに関連付けられたユーザー名をデフォルトのキュー名として使用するかどうか。これが「false」に設定されているか、設定されていない場合、すべてのジョブは「default」という共有デフォルトキューを持ちます。デフォルトはtrueです。割り当てファイルにキュー配置ポリシーが指定されている場合、このプロパティは無視されます。
yarn.scheduler.fair.preemption プリエンプションを使用するかどうか。デフォルトはfalseです。
yarn.scheduler.fair.preemption.cluster-utilization-threshold プリエンプションが開始される利用率しきい値。利用率は、すべてのリソースの中で、使用率と容量の比率の最大値として計算されます。デフォルトは0.8fです。
yarn.scheduler.fair.sizebasedweight アプリのサイズに応じて個々のアプリに共有リソースを割り当てるか、サイズに関係なくすべてのアプリに均等に共有リソースを提供するかを指定します。trueに設定すると、アプリの総要求メモリに1を加えた値の自然対数を2の自然対数で割った値でアプリに重みが付けられます。デフォルトはfalseです。
yarn.scheduler.fair.assignmultiple 1つのハートビートで複数のコンテナ割り当てを許可するかどうかを指定します。デフォルトはfalseです。
yarn.scheduler.fair.dynamic.max.assign assignmultipleがtrueの場合、1つのハートビートで割り当て可能なリソース量を動的に決定するかどうかを指定します。有効にすると、ノード上の未割り当てリソースのおおよそ半分が、1つのハートビートでコンテナに割り当てられます。デフォルトはtrueです。
yarn.scheduler.fair.max.assign assignmultipleがtrueでdynamic.max.assignがfalseの場合、1つのハートビートで割り当て可能なコンテナの最大数を指定します。デフォルトは-1で、制限はありません。
yarn.scheduler.fair.locality.threshold.node 特定のノード上のコンテナを要求するアプリケーションの場合、最後のコンテナ割り当て以降のスケジューリング機会の数で、別のノードへの配置を受け入れる前に待機する時間を指定します。0から1の間の浮動小数点数で表され、クラスタサイズの何分の一かが、見送るスケジューリング機会の数となります。デフォルト値-1.0は、スケジューリング機会を見送らないことを意味します。
yarn.scheduler.fair.locality.threshold.rack 特定のラック上のコンテナを要求するアプリケーションの場合、最後のコンテナ割り当て以降のスケジューリング機会の数で、別のラックへの配置を受け入れる前に待機する時間を指定します。0から1の間の浮動小数点数で表され、クラスタサイズの何分の一かが、見送るスケジューリング機会の数となります。デフォルト値-1.0は、スケジューリング機会を見送らないことを意味します。
yarn.scheduler.fair.allow-undeclared-pools trueの場合、アプリケーションの提出時に、サブミッタによってアプリケーションのキューとして指定されている場合でも、user-as-default-queueプロパティによって配置されている場合でも、新しいキューを作成できます。falseの場合、アプリが割り当てファイルに指定されていないキューに配置されるたびに、「default」キューに配置されます。デフォルトはtrueです。割り当てファイルにキュー配置ポリシーが指定されている場合、このプロパティは無視されます。
yarn.scheduler.fair.update-interval-ms フェアシェアの再計算、需要の再計算、プリエンプションの対象かどうかをチェックするために、スケジューラをロックする間隔です。デフォルトは500msです。
yarn.resource-types.memory-mb.increment-allocation Fairschedulerは、この値の増分単位でメモリを割り当てます。memory-mb.increment-allocationの倍数でないリソース要求でタスクを提出した場合、要求は最も近い増分値に切り上げられます。デフォルトは1024MBです。
yarn.resource-types.vcores.increment-allocation Fairschedulerは、この値の増分単位でvcoreを割り当てます。vcores.increment-allocationの倍数でないリソース要求でタスクを提出した場合、要求は最も近い増分値に切り上げられます。デフォルトは1です。
yarn.resource-types.<resource>.increment-allocation Fairschedulerは、この値の増分単位で<resource>を割り当てます。<resource>.increment-allocationの倍数でないリソース要求でタスクを提出した場合、要求は最も近い増分値に切り上げられます。このプロパティがリソースに対して指定されていない場合、増分の切り上げは適用されません。単位が指定されていない場合、リソースのデフォルト単位が想定されます。
yarn.scheduler.increment-allocation-mb メモリの割り当て増分です。推奨されなくなりました。代わりにyarn.resource-types.memory-mb.increment-allocationを使用してください。デフォルトは1024MBです。
yarn.scheduler.increment-allocation-vcores CPU vcoreの割り当て増分です。推奨されなくなりました。代わりにyarn.resource-types.vcores.increment-allocationを使用してください。デフォルトは1です。

割り当てファイルの形式

割り当てファイルはXML形式である必要があります。この形式には5種類の要素が含まれています。

  • キュー要素:キューを表します。キュー要素はオプションの属性「type」を取ることができ、「parent」に設定すると親キューになります。これは、リーフキューを構成せずに親キューを作成する場合に役立ちます。各キュー要素には、次のプロパティを含めることができます。

    • minResources:キューが権利を持つ最小リソース。シングルリソースフェアネスポリシーでは、メモリのみが使用され、その他のリソースは無視されます。キューの最小シェアが満たされていない場合、同じ親の下にある他のキューよりも先に、使用可能なリソースが提供されます。シングルリソースフェアネスポリシーでは、メモリの使用量が最小メモリシェアを下回っている場合、キューは満たされていないと見なされます。ドミナントリソースフェアネスでは、クラスタ容量に対する支配的なリソースの使用量がそのリソースの最小シェアを下回っている場合、キューは満たされていないと見なされます。この状況で複数のキューが満たされていない場合、関連するリソースの使用量とその最小値の比率が最も小さいキューにリソースが割り当てられます。アプリケーションがキューに提出された場合、既に実行中のジョブがこれらのリソースを使用している可能性があるため、最小値を下回っているキューがすぐに最小値に達しない可能性があることに注意してください。

    • maxResources:キューに割り当て可能な最大リソース。キューには、集計使用量がこの制限を超えるコンテナは割り当てられません。この制限は再帰的に適用され、その割り当てによってキューまたはその親が最大リソースを超える場合、キューにはコンテナは割り当てられません。

    • maxContainerAllocation:単一のコンテナにキューが割り当て可能な最大リソース。このプロパティが設定されていない場合、その値は親キューから継承されます。デフォルト値はyarn.scheduler.maximum-allocation-mbyarn.scheduler.maximum-allocation-vcoresです。maxResourcesより大きくすることはできません。このプロパティはルートキューでは無効です。

    • maxChildResources:アドホックな子キューに割り当て可能な最大リソース。子キューの制限は再帰的に適用され、その割り当てによって子キューまたはその親が最大リソースを超える場合、子キューにはコンテナは割り当てられません。

      • minResources、maxResources、maxContainerAllocation、およびmaxChildResourcesプロパティの場合、パラメータを次のいずれかの形式で指定できます。
        • 旧形式:「X mb, Y vcores」、「X% cpu, Y% memory」、「X%」。単一のパーセンテージが提供されていない場合、メモリとCPUの両方の構成は必須であり、その他のリソース型は無視され、0に設定されます。

        • 新形式(推奨):「vcores=X, memory-mb=Y」または「vcores=X%, memory-mb=Y%」。この形式では、単位なしでパーセンテージまたは整数リソース値を指定できます。後者の場合、単位はそのリソースに対して構成されたデフォルト単位から推測されます。メモリとCPU以外のリソースを指定する場合は、この形式が必要です。未指定のリソースは、minResourcesの場合は0に、maxResources、maxContainerAllocation、およびmaxChildResourcesの場合はそのリソースの最大値に設定されます。

    • maxRunningApps:同時に実行できるキューからのアプリの数を制限します。

    • maxAMShare:アプリケーションマスターの実行に使用できるキューのフェアシェアの割合を制限します。このプロパティは、リーフキューでのみ使用できます。たとえば、1.0fに設定されている場合、リーフキュー内のAMは、メモリとCPUのフェアシェアの最大100%を使用できます。-1.0fの値は、この機能を無効にし、amShareはチェックされません。デフォルト値は0.5fです。

    • weight:他のキューとクラスタを非比例的に共有します。重みのデフォルトは1であり、重みが2のキューは、デフォルトの重みのキューのおおよそ2倍のリソースを受け取ります。

    • schedulingPolicy:任意のキューのスケジューリングポリシーを設定します。許可される値は「fifo」/「fair」/「drf」、またはorg.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.SchedulingPolicyを拡張するクラスです。デフォルトは「fair」です。「fifo」の場合、提出時間が早いアプリがコンテナを優先的に取得しますが、後のアプリも、初期アプリの要求を満たした後にクラスタに残っているスペースがあれば、同時に実行される場合があります。

    • aclSubmitApps:キューにアプリを提出できるユーザーとグループのリスト。このリストの形式とキューACLの動作の詳細については、以下のACLセクションを参照してください。

    • aclAdministerApps:キューを管理できるユーザーとグループのリスト。現在のところ、管理アクションはアプリケーションのキルのみです。このリストの形式とキューACLの動作の詳細については、以下のACLセクションを参照してください。

    • minSharePreemptionTimeout:他のキューからリソースを取得するためにコンテナのプリエンプションを試行する前に、キューが最小シェアを下回っている秒数。設定されていない場合、キューは親キューから値を継承します。デフォルト値はLong.MAX_VALUEで、意味のある値を設定するまでコンテナをプリエンプションしません。

    • fairSharePreemptionTimeout:他のキューからリソースを取得するためにコンテナのプリエンプションを試行する前に、キューがフェアシェアのしきい値を下回っている秒数。設定されていない場合、キューは親キューから値を継承します。デフォルト値はLong.MAX_VALUEで、意味のある値を設定するまでコンテナをプリエンプションしません。

    • fairSharePreemptionThreshold:キューのフェアシェアプリエンプションしきい値。フェアシェアのfairSharePreemptionThreshold*fairShareのリソースを受け取らずにfairSharePreemptionTimeout待機した場合、他のキューからリソースを取得するためにコンテナをプリエンプションできます。設定されていない場合、キューは親キューから値を継承します。デフォルト値は0.5fです。

    • allowPreemptionFrom:スケジューラがキューからリソースをプリエンプションすることを許可するかどうかを決定します。デフォルトはtrueです。キューがこのプロパティをfalseに設定している場合、このプロパティはすべての子キューに再帰的に適用されます。

    • reservationReservationSystemに、キューのリソースをユーザーが予約できるようにすることを示します。これはリーフキューにのみ適用されます。このプロパティが構成されていない場合、リーフキューは予約できません。

  • ユーザー要素:個々のユーザーの動作を管理する設定を表します。これには、特定のユーザーの実行中のアプリの制限であるmaxRunningAppsという単一のプロパティを含めることができます。

  • userMaxAppsDefault要素:それ以外の方法で制限が指定されていないユーザーのデフォルトの実行アプリ制限を設定します。

  • defaultFairSharePreemptionTimeout要素:ルートキューのフェアシェアプリエンプションタイムアウトを設定します。ルートキューのfairSharePreemptionTimeout要素によって上書きされます。デフォルトはLong.MAX_VALUEに設定されています。

  • defaultMinSharePreemptionTimeout要素:ルートキューの最小シェアプリエンプションタイムアウトを設定します。ルートキューのminSharePreemptionTimeout要素によって上書きされます。デフォルトはLong.MAX_VALUEに設定されています。

  • defaultFairSharePreemptionThreshold要素:ルートキューのフェアシェアプリエンプションしきい値を設定します。ルートキューのfairSharePreemptionThreshold要素によって上書きされます。デフォルトは0.5fに設定されています。

  • queueMaxAppsDefault要素:キューのデフォルトの実行アプリ制限を設定します。各キューのmaxRunningApps要素によって上書きされます。

  • queueMaxResourcesDefault要素:キューのデフォルトの最大リソース制限を設定します。各キューのmaxResources要素によって上書きされます。

  • queueMaxAMShareDefault要素:キューのデフォルトのAMリソース制限を設定します。各キューのmaxAMShare要素によって上書きされます。

  • defaultQueueSchedulingPolicy要素:キューのデフォルトのスケジューリングポリシーを設定します。指定されている場合は、各キューのschedulingPolicy要素によって上書きされます。デフォルトは「fair」です。

  • reservation-agent要素:ユーザーの予約要求をPlanに配置しようとするReservationAgentの実装のクラス名を設定します。デフォルト値はorg.apache.hadoop.yarn.server.resourcemanager.reservation.planning.AlignedPlannerWithGreedyです。

  • reservation-policy要素:新しい予約が不変条件に違反していないかどうかを検証するSharingPolicyの実装のクラス名を設定します。デフォルト値はorg.apache.hadoop.yarn.server.resourcemanager.reservation.CapacityOverTimePolicyです。

  • reservation-planner要素Planの容量が(スケジュールされたメンテナンスまたはノード障害のために)ユーザーが予約したリソースを下回った場合に呼び出されるPlannerの実装のクラス名を設定します。デフォルト値はorg.apache.hadoop.yarn.server.resourcemanager.reservation.planning.SimpleCapacityReplannerで、Planをスキャンし、予約されたリソースがPlanの容量内になるまで、受け入れの逆順(LIFO)で予約を貪欲に削除します。

  • queuePlacementPolicy 要素:スケジューラが着信アプリケーションをキューに配置する方法を指示するルール要素のリストが含まれています。ルールはリストされている順序で適用されます。ルールは引数をとる場合があります。すべてのルールは、「create」引数を受け入れます。これは、ルールが新しいキューを作成できるかどうかを示します。「Create」はデフォルトでtrueです。falseに設定されていて、ルールが割り当てファイルに設定されていないキューにアプリケーションを配置する場合、次のルールに進みます。最後のルールは、継続を発行できないルールである必要があります。有効なルールは

    • specified:アプリケーションは、アプリケーションが要求したキューに配置されます。アプリケーションがキューを要求しなかった場合、つまり「default」を指定した場合、続行します。「.q1」や「q1.」などの名前のように、ピリオドで始まるか終わるキュー名を指定した場合は拒否されます。

    • user:アプリケーションは、それを送信したユーザーの名前のキューに配置されます。ユーザー名内のピリオドは「_dot_」に置き換えられます。つまり、ユーザー「first.last」のキュー名は「first_dot_last」になります。

    • primaryGroup:アプリケーションは、それを送信したユーザーのプライマリグループの名前のキューに配置されます。グループ名内のピリオドは「_dot_」に置き換えられます。つまり、グループ「one.two」のキュー名は「one_dot_two」になります。

    • secondaryGroupExistingQueue:アプリケーションは、それを送信したユーザーのセカンダリグループと一致する名前のキューに配置されます。設定されたキューと一致する最初のセカンダリグループが選択されます。グループ名内のピリオドは「_dot_」に置き換えられます。つまり、「one.two」をセカンダリグループの1つとするユーザーは、そのようなキューが存在する場合、「one_dot_two」キューに配置されます。

    • nestedUserQueue:アプリケーションは、ネストされたルールが示唆するキューの下にあるユーザーの名前のキューに配置されます。これは「user」ルールに似ていますが、「nestedUserQueue」ルールでは、ユーザーキューを任意の親キューの下に作成できるのに対し、「user」ルールはルートキューの下にのみユーザーキューを作成するという違いがあります。「nestedUserQueue」ルールは、ネストされたルールが親キューを返す場合にのみ適用されます。親キューは、キューの「type」属性を「parent」に設定するか、そのキューの下に少なくとも1つのリーフを構成して親にすることで構成できます。サンプルのユースケースについては、割り当ての例を参照してください。

    • default:アプリケーションは、デフォルトルールの「queue」属性で指定されたキューに配置されます。「queue」属性が指定されていない場合、アプリケーションは「root.default」キューに配置されます。

    • reject:アプリケーションは拒否されます。

    割り当てファイルの例をここに示します。

<?xml version="1.0"?>
<allocations>
  <queue name="sample_queue">
    <minResources>10000 mb,0vcores</minResources>
    <maxResources>90000 mb,0vcores</maxResources>
    <maxRunningApps>50</maxRunningApps>
    <maxAMShare>0.1</maxAMShare>
    <weight>2.0</weight>
    <schedulingPolicy>fair</schedulingPolicy>
    <queue name="sample_sub_queue">
      <aclSubmitApps>charlie</aclSubmitApps>
      <minResources>5000 mb,0vcores</minResources>
    </queue>
    <queue name="sample_reservable_queue">
      <reservation></reservation>
    </queue>
  </queue>

  <queueMaxAMShareDefault>0.5</queueMaxAMShareDefault>
  <queueMaxResourcesDefault>40000 mb,0vcores</queueMaxResourcesDefault>

  <!-- Queue 'secondary_group_queue' is a parent queue and may have
       user queues under it -->
  <queue name="secondary_group_queue" type="parent">
  <weight>3.0</weight>
  <maxChildResources>4096 mb,4vcores</maxChildResources>
  </queue>

  <user name="sample_user">
    <maxRunningApps>30</maxRunningApps>
  </user>
  <userMaxAppsDefault>5</userMaxAppsDefault>

  <queuePlacementPolicy>
    <rule name="specified" />
    <rule name="primaryGroup" create="false" />
    <rule name="nestedUserQueue">
        <rule name="secondaryGroupExistingQueue" create="false" />
    </rule>
    <rule name="default" queue="sample_queue"/>
  </queuePlacementPolicy>
</allocations>

元のFairSchedulerとの下位互換性のために、「queue」要素は「pool」要素として名前を付けることができます。

キューアクセス制御リスト

キューアクセス制御リスト(ACL)を使用すると、管理者は特定のキューでどのような操作を実行できるかを制御できます。これらは、キューごとに設定できるaclSubmitAppsプロパティとaclAdministerAppsプロパティを使用して構成されます。現在、サポートされている管理操作はアプリケーションのキルのみです。管理者は、アプリケーションをそこに送信することもできます。これらのプロパティは、「user1,user2 group1,group2」または " group1,group2"のような形式の値を取ります。キューに対する操作は、ユーザー/グループがキューACLのメンバーであるか、そのキューの祖先のいずれかのキューACLのメンバーである場合に許可されます。したがって、queue2がqueue1内にあり、user1がqueue1のACLにあり、user2がqueue2のACLにある場合、両方のユーザーはqueue2に送信できます。

注記:区切り文字はスペース文字です。ACLグループのみを指定するには、値の先頭にスペース文字を付けます。

ルートキューのACLはデフォルトで「*」です。これは、ACLが継承されるため、誰もがすべてのキューからアプリケーションを送信およびキルできることを意味します。アクセスを制限するには、ルートキューのACLを「*」以外のものに設定します。

予約アクセス制御リスト

予約アクセス制御リスト(ACL)を使用すると、管理者は特定のキューでどのような予約操作を実行できるかを制御できます。これらは、キューごとに設定できるaclAdministerReservations、aclListReservations、およびaclSubmitReservationsプロパティを使用して構成されます。現在サポートされている管理操作は、予約の更新と削除です。管理者は、キュー上のすべての予約を送信およびリストすることもできます。これらのプロパティは、「user1,user2 group1,group2」または " group1,group2"のような形式の値を取ります。キューに対する操作は、ユーザー/グループが予約ACLのメンバーである場合に許可されます。任意のユーザーは、独自の予約を更新、削除、またはリストできます。予約ACLが有効になっているが定義されていない場合、全員がアクセスできます。

ReservationSystemの構成

Fair Schedulerは、ユーザーが事前にリソースを予約できるReservationSystemをサポートしています。アプリケーションは、送信時にreservationIdを指定することで、実行時に予約されたリソースを要求できます。次の構成パラメータは、ReservationSystemのyarn-site.xmlで構成できます。

プロパティ 説明
yarn.resourcemanager.reservation-system.enable 必須パラメータ:ResourceManagerReservationSystemを有効にします。ブール値が必要です。デフォルト値はfalseです。つまり、ReservationSystemはデフォルトでは有効になっていません。
yarn.resourcemanager.reservation-system.class オプションパラメータ:ReservationSystemのクラス名。デフォルト値は、構成されたスケジューラに基づいて選択されます。つまり、FairSchedulerが構成されている場合、FairReservationSystemになります。
yarn.resourcemanager.reservation-system.plan.follower オプションパラメータ:タイマーで実行され、FairSchedulerPlanを同期させるPlanFollowerのクラス名。デフォルト値は、構成されたスケジューラに基づいて選択されます。つまり、FairSchedulerが構成されている場合、FairSchedulerPlanFollowerになります。
yarn.resourcemanager.reservation-system.planfollower.time-step オプションパラメータ:PlanFollowerタイマーの頻度(ミリ秒単位)。Long値が必要です。デフォルト値は1000です。

ReservationSystemはFair Schedulerキュー階層と統合されており、リーフキューに対してのみ構成できます。詳細な手順は、「割り当てファイル形式」セクションにあります。

管理

Fair Schedulerは、いくつかのメカニズムを通じてランタイムでの管理をサポートしています。

ランタイムでの構成の変更

割り当てファイルを編集することで、最小共有、制限、重み、プリエンプションタイムアウト、およびキュースケジューリングポリシーをランタイムで変更できます。スケジューラは、変更されたことが分かると10〜15秒後にこのファイルをリロードします。

Web UIによる監視

現在のアプリケーション、キュー、およびフェアシェアは、http://*ResourceManager URL*/cluster/schedulerにあるResourceManagerのWebインターフェースで確認できます。

Webインターフェースでは、各キューについて次のフィールドを確認できます。

  • 使用済みリソース - キュー内のコンテナに割り当てられたリソースの合計。

  • アクティブなアプリケーションの数 - 少なくとも1つのコンテナを受け取ったキュー内のアプリケーションの数。

  • 保留中のアプリケーションの数 - まだコンテナを受け取っていないキュー内のアプリケーションの数。

  • 最小リソース - キューに保証される最小リソース。

  • 最大リソース - キューに許可される最大リソース。

  • 瞬間的なフェアシェア - キューのリソースの瞬間的なフェアシェア。これらのシェアはアクティブなキュー(実行中のアプリケーションがあるキュー)のみを考慮し、スケジューリングの決定に使用されます。他のキューが使用していない場合、キューにはシェアを超えるリソースが割り当てられる場合があります。リソース消費量が瞬間的なフェアシェア以下のキューは、コンテナがプリエンプションされることはありません。

  • 安定したフェアシェア - キューのリソースの安定したフェアシェア。これらのシェアは、アクティブであるか(実行中のアプリケーションがあるか)どうかに関係なく、すべてのキューを考慮します。これらはそれほど頻繁に計算されず、構成または容量が変更された場合にのみ変更されます。ユーザーが期待できるリソースの可視性を提供することを目的としており、Web UIに表示されます。

キュー間のアプリケーションの移動

Fair Schedulerは、実行中のアプリケーションを別のキューに移動することをサポートしています。これは、重要なアプリケーションをより高い優先度のキューに移動したり、重要ではないアプリケーションをより低い優先度のキューに移動したりするのに役立ちます。アプリケーションは、yarn application -movetoqueue appID -queue targetQueueNameを実行することで移動できます。

アプリケーションがキューに移動されると、その既存の割り当ては、公平性を決定するために、古いキューの割り当てではなく、新しいキューの割り当てとカウントされるようになります。アプリケーションをキューに移動しようとしても、アプリケーションのリソースをそのキューに追加すると、maxRunningAppsまたはmaxResourcesの制約に違反する場合、失敗します。

Fair Scheduler状態のダンプ

Fair Schedulerは、定期的に状態をダンプできます。デフォルトでは無効になっています。管理者は、org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler.statedumpのログレベルをDEBUGに設定して有効にすることができます。

Fair Schedulerのログは、デフォルトでResourceManagerのログファイルに出力されます。Fair Schedulerの状態ダンプは、大量のログデータを作成する可能性があります。状態を別のファイルにダンプするには、log4j.propertiesの「Fair scheduler state dump」セクションのコメントを解除します。