YARNノード属性

概要

ノード属性は、リソース保証なしでノードの属性を記述する方法です。アプリケーションは、これらの属性の複数表現に基づいて、コンテナを配置するのに適したノードを選択するために使用できます。

機能

ノード属性の主な機能は以下のとおりです。

  • ノードは複数の属性に関連付けることができます。
  • 値は、ノードにタグ付けされた属性に関連付けることができます。現在、文字列型の値のみがサポートされています。
  • ノードラベルとは異なり、ノード属性はクラスタレベルで明示的に指定する必要はありませんが、クラスタレベルで使用可能な属性を一覧表示するためのAPIがあります。
  • 非可触リソースであるため、キューに関連付けられていないため、属性のキューリソース計画と認証は必要ありません。
  • 割り当てタグと同様に、アプリケーションは *配置制約* を使用して、これらの属性の1つ以上を含む式を使用してコンテナをリクエストできます。
  • 式でサポートされている演算子は、等号(=)と不等号(!=)のみです。ANDとORも属性式の 一部として使用できます。
  • ノード属性制約はハードリミットであり、ノードがノード属性制約を満たしている場合にのみ割り当てを行うことができることを意味します。言い換えれば、制約を満たす有効なノードが見つかるまで、リクエストは保留されたままになります。現状では緩和ポリシーはありません。
  • 操作性
    • ノード属性とそのノードへのマッピングは、RMの再起動後も復元できます。
    • ノード属性の更新 - 管理者は、RMの実行中にノードの属性を追加、削除、置換できます。
  • NMからノード属性へのマッピングは、2つの方法で行うことができます。
    • **集中型:** ノードと属性のマッピングは、RMが公開するCLIまたはRPCを介して行うことができます(RESTはまだサポートされていません)。
    • **分散型:** ノードと属性のマッピングは、NMで設定されたノード属性プロバイダーによって設定されます。YARNには、*スクリプト*ベースのプロバイダーと*設定*ベースのプロバイダーの2種類のプロバイダーがあります。スクリプトの場合、NMはスクリプトパスで設定でき、スクリプトはノードの属性を出力できます。設定の場合、ノード属性はNMのyarn-site.xmlで直接設定できます。これらの両方のオプションで、属性マッピングの動的更新がサポートされています。
  • ラベルとは異なり、属性は集中型モードと分散型モードの両方から同時にノードにマップできます。属性は異なるモードで異なるプレフィックスで識別されるため、競合はありません。**集中型**の場合、属性はプレフィックス*「rm.yarn.io」*で識別され、**分散型**の場合、属性はプレフィックス*「nm.yarn.io」*で識別されます。これは、属性が*プレフィックス*と*名前*によって一意に識別されることを意味します。

設定

ノード属性用のResourceManagerのセットアップ

ノードラベルとは異なり、ノード属性は常に存在するため、明示的に有効にする必要はなく、機能が使用されていない場合でもパフォーマンスや互換性に影響を与えることはありません。

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

プロパティ デフォルト値
yarn.node-attribute.fs-store.root-dir 集中型属性マッピングが格納されるパス file:///tmp/hadoop-yarn-${user}/node-attribute/
yarn.node-attribute.fs-store.impl.class 設定されたクラスはorg.apache.hadoop.yarn.nodelabels.NodeAttributeStoreを拡張する必要があります FileSystemNodeAttributeStore

注記

  • yarn.node-attribute.fs-store.root-dirがリソースマネージャープロセスユーザーで作成され、ResourceManagerがアクセスできる権限を持っていることを確認してください。(通常は「yarn」ユーザーから)
  • ノード属性をRMのローカルファイルシステムに保存する場合、file:///home/yarn/node-attributesのようなパスを使用できます。hdfsに保存する場合は、hdfs://namenode:port/path/to/store/node-attributes/のようなパスを使用できます。

集中型ノード属性マッピング

**集中型**アプローチでは、属性をノードにマップするために3つのオプションがサポートされています。

  • **add** yarn nodeattributes -add "node1:attribute[(type)][=value],attribute2 node2:attribute2[=value],attribute3"を実行すると、ノードの既存のマッピングに影響を与えることなく、ノードに属性が追加されます。

  • **remove** yarn nodeattributes -remove "node1:attribute,attribute1 node2:attribute2"を実行すると、ノードの既存のマッピングに影響を与えることなく、ノードから属性が削除されます。

  • **replace** yarn nodeattributes -replace "node1:attribute[(type)][=value],attribute1[=value],attribute2 node2:attribute2[=value],attribute3"を実行すると、ノードの既存の属性がこのコマンドの一部として設定された属性に置き換えられます。

注記

  • ポートを指定する必要は**ありません**。属性はノードのすべてのNMインスタンスにマップされます。
  • *スペース*は、複数のノードと属性のマッピングペアの区切り文字です。
  • *「,」*は、ノードの複数の属性の区切り文字として使用されます。
  • *「type」*は、指定されていない場合、デフォルトでstringになります。これは現在サポートされている唯一の型です。
  • 上記の3つの操作はすべて、管理ユーザーのみが実行できます。

分散型ノード属性マッピング

**分散型**モードでノードに属性を設定する

プロパティ
yarn.nodemanager.node-attributes.provider 管理者は、NMでこのパラメータを設定することにより、ノード属性のプロバイダーを設定できます。管理者は、*「config」*、*「script」*、またはプロバイダーの*クラス名*を設定できます。設定されたクラスは、*org.apache.hadoop.yarn.server.nodemanager.nodelabels.NodeAttributesProvider*を拡張する必要があります。*「config」*が設定されている場合、*「ConfigurationNodeAttributesProvider」*が使用され、*「script」*が設定されている場合、*「ScriptBasedNodeAttributesProvider」*が使用されます。
yarn.nodemanager.node-attributes.provider.fetch-interval-ms *「yarn.nodemanager.node-attributes.provider」*が*「config」*、*「script」*、またはNodeAttributesProviderを拡張する*設定されたクラス*で設定されている場合、ノード属性はノード属性プロバイダーから定期的に取得されます。この設定は、間隔期間を定義するためのものです。-1が設定されている場合、ノード属性は初期化中にのみプロバイダーから取得されます。デフォルトは10分です。
yarn.nodemanager.node-attributes.provider.fetch-timeout-ms *「yarn.nodemanager.node-attributes.provider」*が*「script」*で設定されている場合、この設定は、ノード属性を照会するスクリプトを中断するまでのタイムアウト期間を提供します。デフォルトは20分です。
yarn.nodemanager.node-attributes.provider.script.path NMがノード属性を収集するために実行するノード属性スクリプト。スクリプト出力で「NODE_ATTRIBUTE:」で始まる行は、ノード属性のレコードと見なされ、属性名、タイプ、値はコンマで区切る必要があります。このような各行はノード属性に解析されます。
yarn.nodemanager.node-attributes.provider.script.opts ノード属性スクリプトに渡す引数。
yarn.nodemanager.node-attributes.provider.configured-node-attributes 「yarn.nodemanager.node-attributes.provider」が「config」で設定されている場合、ConfigurationNodeAttributesProviderはこのパラメータからノード属性を取得します。

アプリケーションのノード属性の指定

アプリケーションは、配置制約ドキュメントに記載されているように、配置制約APIを使用してノード属性リクエストを指定できます。

NodeAttribute式を使用してスケジューリングリクエストオブジェクトを作成する例を以下に示します。

//expression : AND(python!=3:java=1.8)
SchedulingRequest schedulingRequest =
    SchedulingRequest.newBuilder().executionType(
        ExecutionTypeRequest.newInstance(ExecutionType.GUARANTEED))
        .allocationRequestId(10L).priority(Priority.newInstance(1))
        .placementConstraintExpression(
            PlacementConstraints.and(
                PlacementConstraints
                    .targetNodeAttribute(PlacementConstraints.NODE,
                        NodeAttributeOpCode.NE,
                        PlacementConstraints.PlacementTargets
                            .nodeAttribute("python", "3")),
                PlacementConstraints
                    .targetNodeAttribute(PlacementConstraints.NODE,
                        NodeAttributeOpCode.EQ,
                        PlacementConstraints.PlacementTargets
                            .nodeAttribute("java", "1.8")))
                .build()).resourceSizing(
        ResourceSizing.newInstance(1, Resource.newInstance(1024, 1)))
        .build();

上記のSchedulingRequestは、以下の制約を満たすノード上の1つのコンテナを要求します。

  1. ノード属性rm.yarn.io/pythonが存在しないか、存在しても値が3と等しくない。

  2. ノード属性rm.yarn.io/javaが存在し、その値が1.8と等しい必要がある。

モニタリング

RESTによるモニタリング

http://rm-http-address:port/ws/v1/cluster/nodes/{nodeid} REST出力の一部として、指定されたノードにマッピングされた属性とその値を取得できます。

Web UIによるモニタリング

今後サポート予定です。

コマンドラインによるモニタリング

  • yarn cluster --list-node-attributesを使用して、クラスタ内のすべての属性を取得します。
  • yarn nodeattributes -listを使用して、クラスタ内の属性を取得します。
  • yarn nodeattributes -attributestonodes -attributes <Attributes>を使用して、各属性について、マッピングされているすべてのノードと各ノードに設定されている属性値を一覧表示します。必要に応じて、*`-attributes`*を使用して特定の属性を指定できます。
  • yarn nodeattributes -nodestoattributes -nodes <Host Names>を使用して、ノードにマッピングされているすべての属性とその値を一覧表示します。必要に応じて、*`-nodes`*を使用して特定のノードを指定できます。
  • yarn node -statusから取得したノードのステータス/詳細は、ノードに関連付けられているすべての属性とその値を一覧表示します。

関連リンク