YARNノードラベル

概要

ノードラベルは、同様の特性を持つノードをグループ化する方法であり、アプリケーションは実行場所を指定できます。

現在、ノードパーティションのみをサポートしています。これは、

  • 1つのノードは1つのノードパーティションのみを持つことができるため、クラスタはノードパーティションによっていくつかの互いに素なサブクラスタに分割されます。デフォルトでは、ノードはDEFAULTパーティション(partition="")に属します
  • ユーザーは、各パーティションのリソースが異なるキューによってどの程度使用できるかを構成する必要があります。詳細については、次のセクションを参照してください。
  • ノードパーティションには2種類あります
    • 排他的:コンテナは、ノードパーティションと完全に一致するノードに割り当てられます。(例:partition="x"を要求するとpartition="x"のノードに割り当てられ、DEFAULTパーティションを要求するとDEFAULTパーティションノードに割り当てられます)。
    • 非排他的:パーティションが非排他的な場合、DEFAULTパーティションを要求するコンテナにアイドルリソースを共有します。

ユーザーは、各キューがアクセスできるノードラベルのセットを指定できます。1つのアプリケーションは、アプリケーションを含むキューがアクセスできるノードラベルのサブセットのみを使用できます。

機能

ノードラベルは現在、以下の機能をサポートしています

  • クラスタのパーティション分割 - 各ノードに1つのラベルを割り当てることができるため、クラスタはいくつかの小さな互いに素なパーティションに分割されます。
  • キューに対するノードラベルのACL - ユーザーは各キューでアクセス可能なノードラベルを設定できるため、一部のノードには特定のキューのみがアクセスできます。
  • キューがアクセスできるパーティションのリソースの割合を指定する - ユーザーは次のような割合を設定できます。キューAは、label=hbaseのノードのリソースの30%にアクセスできます。このような割合の設定は、既存のリソースマネージャーと一致しています
  • リソースリクエストで必要なノードラベルを指定します。ノードが同じラベルを持っている場合にのみ割り当てられます。ノードラベルの要件が指定されていない場合、そのようなリソースリクエストはDEFAULTパーティションに属するノードにのみ割り当てられます。
  • 操作性
    • ノードラベルとノードラベルマッピングは、RMの再起動後も復元できます
    • ノードラベルの更新 - 管理者は、RMの実行中にノードのラベルとキューのラベルを更新できます
  • NMからノードラベルへのマッピングは3つの方法で行うことができますが、すべてのアプローチにおいてパーティションラベルはRMで構成された有効なノードラベルリストの1つである必要があります。
    • 集中型:ノードとラベルのマッピングは、RMが公開するCLI、REST、またはRPCを介して行うことができます。
    • 分散型:ノードとラベルのマッピングは、NMで構成されたノードラベルプロバイダーによって設定されます。YARNには、*スクリプト*ベースのプロバイダーと*構成*ベースのプロバイダーの2種類のプロバイダーがあります。スクリプトの場合、NMはスクリプトパスで構成でき、スクリプトはノードのラベルを出力できます。構成の場合、ノードラベルはNMのyarn-site.xmlで直接構成できます。これらの両方のオプションで、ラベルマッピングの動的更新がサポートされています。
    • 委任型集中型:ノードとラベルのマッピングは、RMで構成されたノードラベルプロバイダーによって設定されます。これは、セキュリティ上の懸念から各ノードがラベルマッピングを提供できない場合や、大規模クラスタ内の各ノードに対してRMインターフェースを介した対話を回避する場合に役立ちます。ラベルはNMの登録中にこのインターフェースから取得され、定期的な更新もサポートされています。

構成

ノードラベルを有効にするためのResourceManagerの設定

yarn-site.xmlで以下のプロパティを設定します

プロパティ
yarn.node-labels.fs-store.root-dir hdfs://namenode:port/path/to/store/node-labels/
yarn.node-labels.enabled true
yarn.node-labels.configuration-type ノードラベルの構成タイプを設定します。管理者は、「centralized」、「delegated-centralized」、または「distributed」を指定できます。デフォルト値は「centralized」です。

注意事項

  • yarn.node-labels.fs-store.root-dirが作成され、ResourceManagerがアクセスできる権限を持っていることを確認してください。(通常は「yarn」ユーザーから)
  • ノードラベルをRMのローカルファイルシステム(HDFSの代わりに)に保存する場合、file:///home/yarn/node-labelのようなパスを使用できます

YARNへのノードラベルリストの追加/変更

  • クラスタノードラベルリストを追加する
    • yarn rmadmin -addToClusterNodeLabels "label_1(exclusive=true/false),label_2(exclusive=true/false)"を実行してノードラベルを追加します。
    • ユーザーが「(exclusive=…)」を指定しない場合、exclusiveはデフォルトでtrueになります。
    • yarn cluster --list-node-labelsを実行して、追加されたノードラベルがクラスタに表示されることを確認します。

YARNからのノードラベルの削除

  • クラスタノードラベルを削除する
    • 1つ以上のノードラベルを削除するには、次のコマンドを実行します。yarn rmadmin -removeFromClusterNodeLabels "<label>[,<label>,...]"。コマンド引数は、削除するノードラベルのカンマ区切りリストである必要があります。
    • キューに関連付けられているラベル、つまり1つ以上のキューがこのラベルにアクセスできるラベルを削除することはできません。
    • 指定されたノードラベルが正常に削除されたかどうかを確認するには、yarn cluster --list-node-labelsを実行します。

YARNへのノードとラベルのマッピングの追加/変更

  • **集中型** NodeLabel設定でのノードとラベルのマッピングの構成

    • yarn rmadmin -replaceLabelsOnNode “node1[:port]=label1 node2=label2” [-failOnUnknownNodes] を実行します。node1にlabel1を、node2にlabel2を追加しました。ユーザーがポートを指定しない場合、ノードで実行されているすべてのNodeManagerにラベルが追加されます。オプション-failOnUnknownNodesが設定されている場合、指定されたノードが不明な場合、このコマンドは失敗します.
  • **分散型** NodeLabel設定でのノードとラベルのマッピングの構成

プロパティ
yarn.node-labels.configuration-type NMで構成されたノードラベルプロバイダーからノードとラベルのマッピングを取得するには、RMで* "distributed"*として設定する必要があります。
yarn.nodemanager.node-labels.provider RMで* "yarn.node-labels.configuration-type"*が* "distributed"*で構成されている場合、管理者はNMでこのパラメータを構成することにより、ノードラベルのプロバイダーを構成できます。管理者は、 *“config”*、*“script”*、またはプロバイダーの*クラス名*を構成できます。構成されたクラスは* org.apache.hadoop.yarn.server.nodemanager.nodelabels.NodeLabelsProvider*を拡張する必要があります。 *“config”*が構成されている場合は* "ConfigurationNodeLabelsProvider"*が、*“script”*が構成されている場合は* "ScriptNodeLabelsProvider"*が使用されます。
yarn.nodemanager.node-labels.resync-interval-ms NMがノードラベルをRMと同期する間隔。NMは、構成されたx間隔ごとに、ロードされたラベルをハートビートとともにRMに送信します。管理者がNMによって提供されたクラスタラベルを削除した可能性があるため、ラベルが変更されていない場合でも、この再同期が必要です。デフォルトは2分です。
yarn.nodemanager.node-labels.provider.fetch-interval-ms * "yarn.nodemanager.node-labels.provider"*が* "config"*、* "script"*、または*構成されたクラス*がAbstractNodeLabelsProviderを拡張するように構成されている場合、ノードラベルはノードラベルプロバイダーから定期的に取得されます。この構成は、間隔期間を定義するためのものです。 -1が構成されている場合、ノードラベルは初期化中にのみプロバイダーから取得されます。デフォルトは10分です。
yarn.nodemanager.node-labels.provider.fetch-timeout-ms “yarn.nodemanager.node-labels.provider”“script” に設定されている場合、この設定はノードラベルを照会するスクリプトを中断するまでのタイムアウト期間を指定します。デフォルトは20分です。
yarn.nodemanager.node-labels.provider.script.path 実行するノードラベルスクリプト。スクリプト出力のうち、“NODE_PARTITION:” で始まる行はノードラベルパーティションと見なされます。スクリプト出力にこのパターンを持つ行が複数ある場合は、最後の行が考慮されます。
yarn.nodemanager.node-labels.provider.script.opts ノードラベルスクリプトに渡す引数。
yarn.nodemanager.node-labels.provider.configured-node-partition “yarn.nodemanager.node-labels.provider”“config” に設定されている場合、ConfigurationNodeLabelsProvider はこのパラメータからパーティションラベルを取得します。
  • **委任集中型**ノードラベル設定におけるノードとラベルのマッピングの設定
プロパティ
yarn.node-labels.configuration-type RM で設定されたノードラベルプロバイダーからノードとラベルのマッピングを取得するには、“delegated-centralized” に設定する必要があります。
yarn.resourcemanager.node-labels.provider “yarn.node-labels.configuration-type”“delegated-centralized” に設定されている場合、管理者は ResourceManager がノードラベルを取得するためのクラスを設定する必要があります。設定されたクラスは org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsMappingProvider を拡張する必要があります。
yarn.resourcemanager.node-labels.provider.fetch-interval-ms “yarn.node-labels.configuration-type”“delegated-centralized” に設定されている場合、ノードラベルはノードラベルプロバイダーから定期的に取得されます。この設定は、その間隔を定義するためのものです。 -1 が設定されている場合、ノードラベルは、各ノードが登録された後、プロバイダーから一度だけ取得されます。デフォルトは30分です。

ノードラベルのスケジューラの設定

  • Capacity Scheduler の設定
プロパティ
yarn.scheduler.capacity.<キューパス>.capacity キューが DEFAULT パーティションに属するノードにアクセスできる割合を設定します。各親の直下の子の DEFAULT 容量の合計は 100 にする必要があります。
yarn.scheduler.capacity.<キューパス>.accessible-node-labels 管理者は、各キューがアクセスできるラベルをコンマで区切って指定する必要があります。「hbase,storm」のように指定すると、キューはラベル hbase と storm にアクセスできます。すべてのキューはラベルのないノードにアクセスできるため、ユーザーはそれを指定する必要はありません。このフィールドを指定しない場合は、親から継承されます。キューがラベルのないノードにのみアクセスできるように明示的に指定する場合は、値としてスペースを入力します。
yarn.scheduler.capacity.<キューパス>.accessible-node-labels.<ラベル>.capacity キューが <ラベル> パーティションに属するノードにアクセスできる割合を設定します。各親の直下の子の <ラベル> 容量の合計は 100 にする必要があります。デフォルトは 0 です。
yarn.scheduler.capacity.<キューパス>.accessible-node-labels.<ラベル>.maximum-capacity yarn.scheduler.capacity.<キューパス>.maximum-capacity と同様に、各キューのラベルの最大容量を設定します。デフォルトは 100 です。
yarn.scheduler.capacity.<キューパス>.default-node-label-expression 「hbase」のような値。これは、リソースリクエストでノードラベルを指定せずにキューにアプリケーションが送信された場合、「hbase」が default-node-label-expression として使用されることを意味します。デフォルトでは、これは空であるため、アプリケーションはラベルのないノードからコンテナを取得します。

ノードラベル設定の例:

キュー構造が次のようになっているとします。

                root
            /     |    \
     engineer    sales  marketing

クラスタに 5 つのノード (hostname=h1..h5) があり、それぞれ 24G メモリ、24 vcore を備えています。5 つのノードのうち 1 つに GPU が搭載されています (h5 とします)。そのため、管理者は h5 に GPU ラベルを追加しました。

ユーザーが Capacity Scheduler を次のように設定したとします (読みやすくするために key=value を使用しています)。

yarn.scheduler.capacity.root.queues=engineering,marketing,sales
yarn.scheduler.capacity.root.engineering.capacity=33
yarn.scheduler.capacity.root.marketing.capacity=34
yarn.scheduler.capacity.root.sales.capacity=33

yarn.scheduler.capacity.root.engineering.accessible-node-labels=GPU
yarn.scheduler.capacity.root.marketing.accessible-node-labels=GPU

yarn.scheduler.capacity.root.engineering.accessible-node-labels.GPU.capacity=50
yarn.scheduler.capacity.root.marketing.accessible-node-labels.GPU.capacity=50

yarn.scheduler.capacity.root.engineering.default-node-label-expression=GPU

root.engineering/marketing/sales.capacity=33 となっているため、それぞれが**パーティションのない**リソースの 1/3 に相当する保証リソースを持つことができます。そのため、それぞれが h1..h4 のリソースの 1/3 を使用できます。これは 24 * 4 * (1/3) = (32G メモリ、32 vcore) です。

また、engineering/marketing キューのみが GPU パーティションにアクセスできます (root.<キュー名>.accessible-node-labels を参照)。

engineering/marketing キューはそれぞれ、**パーティション=GPU** のリソースの 1/2 に相当する保証リソースを持っています。そのため、それぞれが h5 のリソースの 1/2 を使用できます。これは 24 * 0.5 = (12G メモリ、12 vcore) です。

注意事項

  • CapacityScheduler の設定が完了したら、yarn rmadmin -refreshQueues を実行して変更を適用します。
  • RM Web UI のスケジューラページに移動して、設定が正常に設定されているかどうかを確認します。

アプリケーションのノードラベルの指定

アプリケーションは、次の Java API を使用してリクエストするノードラベルを指定できます。

  • ApplicationSubmissionContext.setNodeLabelExpression(..) を使用して、アプリケーションのすべてのコンテナのノードラベル式を設定します。
  • ResourceRequest.setNodeLabelExpression(..) を使用して、個々のリソースリクエストのノードラベル式を設定します。これは、ApplicationSubmissionContext で設定されたノードラベル式を上書きできます。
  • ApplicationSubmissionContextsetAMContainerResourceRequest.setNodeLabelExpression を指定して、アプリケーションマスターコンテナの必要なノードラベルを示します。

監視

Web UI を使用した監視

Web UI で次のラベル関連フィールドを確認できます。

コマンドラインを使用した監視

  • yarn cluster --list-node-labels を使用して、クラスタ内のラベルを取得します。
  • yarn node -status <NodeId> を使用して、指定されたノードのラベルを含むノードステータスを取得します。

関連リンク

  • Capacity Scheduler の設定方法について詳しく知りたい場合は、YARN Capacity Scheduler を参照してください。
  • ノードラベルを使用した YARN アプリケーションの作成例については、次の 2 つのリンクを参照してください: YARN 分散シェルHadoop MapReduce