ノードラベルは、同様の特性を持つノードをグループ化する方法であり、アプリケーションは実行場所を指定できます。
現在、ノードパーティションのみをサポートしています。これは、
ユーザーは、各キューがアクセスできるノードラベルのセットを指定できます。1つのアプリケーションは、アプリケーションを含むキューがアクセスできるノードラベルのサブセットのみを使用できます。
ノードラベル
は現在、以下の機能をサポートしています
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」ユーザーから)file:///home/yarn/node-label
のようなパスを使用できますyarn rmadmin -addToClusterNodeLabels "label_1(exclusive=true/false),label_2(exclusive=true/false)"
を実行してノードラベルを追加します。true
になります。yarn cluster --list-node-labels
を実行して、追加されたノードラベルがクラスタに表示されることを確認します。yarn rmadmin -removeFromClusterNodeLabels "<label>[,<label>,...]"
。コマンド引数は、削除するノードラベルのカンマ区切りリストである必要があります。yarn cluster --list-node-labels
を実行します。**集中型** 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分です。 |
プロパティ | 値 |
---|---|
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) です。
注意事項
yarn rmadmin -refreshQueues
を実行して変更を適用します。アプリケーションは、次の Java API を使用してリクエストするノードラベルを指定できます。
ApplicationSubmissionContext.setNodeLabelExpression(..)
を使用して、アプリケーションのすべてのコンテナのノードラベル式を設定します。ResourceRequest.setNodeLabelExpression(..)
を使用して、個々のリソースリクエストのノードラベル式を設定します。これは、ApplicationSubmissionContext で設定されたノードラベル式を上書きできます。ApplicationSubmissionContext
で setAMContainerResourceRequest.setNodeLabelExpression
を指定して、アプリケーションマスターコンテナの必要なノードラベルを示します。Web UI で次のラベル関連フィールドを確認できます。
yarn cluster --list-node-labels
を使用して、クラスタ内のラベルを取得します。yarn node -status <NodeId>
を使用して、指定されたノードのラベルを含むノードステータスを取得します。