YARNは非常に簡単にスケーラブルです。新しいNodeManagerは、構成されたResourceManagerに参加してジョブの実行を開始できます。しかし、完全な弾力性を実現するには、既存のノードを削除し、クラスタを縮小するのに役立つデコミッションプロセスが必要です。
YARNノードは、通常またはグレースフルにデコミッションできます。
YARNノードの通常のデコミッションとは、即時シャットダウンを意味します。
YARNノードのグレースフルデコミッションとは、実行中のアプリケーションへの影響を最小限に抑えながらNMをデコミッションするメカニズムです。ノードがDECOMMISSIONING状態になると、RMはそのノードに新しいコンテナをスケジュールせず、実行中のコンテナとアプリケーションが完了するまで(またはデコミッションタイムアウトを超過するまで)待ってから、ノードをDECOMMISSIONEDに移行します。
通常のデコミッションを実行するには
yarn jar...
を使用)yarn.resourcemanager.nodes.exclude-path
プロパティを yarn-site.xml
に追加します(注:ResourceManagerを再起動する必要はありません)./bin/yarn rmadmin -refreshNodes
を呼び出します次のセクションでは、より詳細な使用方法(例:タイムアウトを使用したグレースフルデコミッション)について説明します。
yarn rmadmin -refreshNodes [-g [タイムアウト(秒)] -client|server]
は、NodesListManagerに包含ホストと除外ホストの変更を検出して処理するように通知します。 NodesListManagerは、yarn-site.xmlの yarn.resourcemanager.nodes.exclude-path
構成で指定された除外ファイルから除外ホストを読み込みます。(注:この設定はすべての refreshNodes
コマンドで再び読み取られるため、除外パスを変更する場合にRMを再起動する必要はありません)
ファイルの形式は、ファイルの拡張子に応じてプレーンテキストまたはXMLです。ノードごとのグレースフルデコミッションのタイムアウトは、XML形式のみでサポートされています。
NodesListManagerは、リソースマネージャー内のRMNodesの状態と除外リストを検査および比較し、次のルールに基づいて必要なアクションを適用します
-g
フラグが指定されていない場合、まだDECOMMISSIONED状態にない除外ノードを_すぐに_デコミッションします。それに応じて、RECOMMISSION、GRACEFUL_DECOMMISSION、またはDECOMMISSION RMNodeEventがRMNodeに送信されます。
単一または複数のrefreshNodesリクエストを介して異なるタイムアウトを使用してノードの柔軟なグレースフルデコミッションをサポートするために、HostsFileReaderは除外ホストファイルの各ホスト名(またはIP)の後にあるオプションのタイムアウト値をサポートしています。
特定のホストに使用する有効なデコミッションタイムアウトは、次の優先順位に基づいています
サーバー側のタイムアウトの場合
yarn rmadmin -refreshNodes -g [タイムアウト(秒)] -server|client
のタイムアウトを使用します。クライアント側のタイムアウトの場合(以下を参照)
-g
フラグで定義されたコマンドラインパラメータのみが使用されます。NodesListManagerは、使用する有効なタイムアウトを決定し、個々のRMNodeに設定します。タイムアウトは、yarn rmadmin -refreshNodes -g [タイムアウト(秒)]
コマンドを使用して動的に調整することもできます。 NodesListManagerは、使用する有効なタイムアウトを解決し、新しいタイムアウトに応じてRMNodeを必要に応じて更新します。タイムアウトの変更は、進行中のデコミッションをリセットするのではなく、ノードがデコミッションタイムアウトに達したかどうかの評価にのみ影響します。
XML形式の除外ファイルの例を次に示します。
<?xml version="1.0"?> <hosts> <host><name>host1</name></host> <host><name>host2</name><timeout>123</timeout></host> <host><name>host3</name><timeout>-1</timeout></host> <host><name>host4, host5,host6</name><timeout>1800</timeout></host> </hosts>
除外ファイルのファイル拡張子がxmlでない場合は、タイムアウトサポートなしで、標準の1行あたり1ホストの形式が使用されます。
host1 host2 host3
注:将来的には、タイムアウトサポートを備えたより多くのファイル形式が計画されています。興味がある場合は、YARN-5536 を参照してください。
タイムアウトは永続化されないことに注意することが重要です。 RMの再起動/フェイルオーバーの場合、ノードはすぐにデコミッションされます。(この動作の変更については、YARN-5464 を参照してください)。
グレースフルデコミッションのタイムアウトは、サーバー側またはクライアント側で追跡できます。 -client|server
は、タイムアウト追跡をクライアントまたはResourceManagerのどちらで処理するかを示します。クライアント側の追跡はブロッキングですが、サーバー側の追跡はブロッキングではありません。
GRACEFUL_DECOMMISSIONイベントを受信すると、RMNodeは指定されている場合はデコミッションタイムアウトを保存し、グレースフルデコミッションのメトリックを更新し、元の合計容量を保持し、DECOMMISSIONING状態に移行します。
リソースはDECOMMISSIONING RMNodeで動的かつ定期的に更新されるため、スケジューラは利用可能なリソースがないため、新しいコンテナをスケジュールしません。
**DecommissioningNodeWatcher** は、クライアント/管理者がグレースフルデコミッションリクエストを行った後、DECOMMISSIONINGノードの状態を自動的かつ非同期的に追跡するYARNコンポーネントです。 NMは、最新のコンテナ状態を含むRMハートビートを定期的に送信します。 DecommissioningNodeWatcherは、すべてのDECOMMISSIONINGノードのハートビート更新を追跡して、ノードで実行中のすべてのコンテナが完了した後、いつDECOMMISSIONED状態に移行するかを決定します。その後、NodeManagerはシャットダウンするように指示されます。
MRアプリケーションでは、すべてのコンテナが完了した後も、ノードはアプリケーションの期間中、リデューサーにマップ出力データを提供する場合があります。 YARNグレースフルデコミッションメカニズムは、関係するすべてのアプリケーションが完了するまで、このようなDECOMMISSIONINGノードを保持します。ただし、多数の「アイドル」ノードが長期間存続する可能性のある、長時間実行されるアプリケーションシナリオでは、これは望ましくない場合があります。 DecommissioningNodeWatcherは、タイムアウトを使用してこのような懸念のバランスを取ります。DECOMMISSIONINGノードは、実行中のコンテナまたはアプリケーションに関係なく、デコミッションタイムアウトまでにDECOMMISSIONEDになります。実行中のコンテナが早く完了した場合、デコミッションタイムアウトまでアプリケーションの完了を待ち続けます。デコミッションタイムアウトに達すると、ノードは関係なくデコミッションされます。ノードは無効化され、所有タスクは必要に応じて再スケジュールされます。
すべてのデコミッションノードの状態は、リソースマネージャーログに定期的に(20秒ごとに)記録されます。デコミッションノードのサブステータスを以下に示します
プロパティ | 値 |
---|---|
yarn.resourcemanager.nodemanager-graceful-decommission-timeout-secs | YARNノードのグレースフルデコミッションのタイムアウト(秒単位)。これは、DECOMMISSIONINGノードをDECOMMISSIONEDに移行する前に、実行中のコンテナとアプリケーションが完了するまで待つ最大時間です。デフォルト値は3600秒です。負の値(-1など)は無限タイムアウトとして扱われます。 |
yarn.resourcemanager.decommissioning-nodes-watcher.poll-interval-secs | DecommissioningNodesWatcher内のポーリングタイマタスクの期間(秒単位)。定期的なハートビートがないDECOMMISSIONINGノードを識別して処理します。デフォルト値は20秒です。 |
yarn.resourcemanager.nodes.exclude-path | 除外するノードを含むファイルへのパス。 |
yarn.resourcemanager.nodes.include-path | 含めるノードを含むファイルへのパス。 |