この部分の知識をスキップしないでください。NodeManager のローカル ディレクトリ構造を理解し、コンテナの起動プロセスに慣れると役立ちます。
1. 分散キャッシュの概要
主な機能は、ユーザー アプリケーションの実行時に、必要な外部ファイル リソースを各ノードにダウンロードしてキャッシュすることです。
YARN 分散キャッシュのワークフローは次のとおりです。
- クライアントは、アプリケーションが必要とするファイル リソース (外部辞書、JAR パッケージ、バイナリ ファイル) を HDFS に送信します。
- クライアントは申請書をRMに提出します。
- RM は NM と通信してアプリケーションプログラム AM を起動し、コマンドを受信した NM はまず HDFS からファイル(キャッシュ)をダウンロードし、その後 AM を起動します。
- AM は RM と通信してコンピューティング リソースを要求および取得します。
- AM は、新しく割り当てられたコンピューティング リソースを受信した後、対応する NM と通信してタスクを開始します。
- アプリケーションがこのノードで初めてタスクを開始する場合、NM はまずファイル キャッシュを HDFS からローカルにダウンロードしてから、タスクを開始します。
- NM はタスクの開始要求を受信した後、ファイルがローカルにキャッシュされている場合はタスクを直接実行します。そうでない場合は、ファイル キャッシュが完了するまで待ってから開始します。
- 各ノード上のキャッシュ ファイルは、対応する NM によって管理および維持されます。Hadoop では、分散キャッシュはクラスター内の各ノードのメモリにファイルをキャッシュするのではなく、各ノードのディスクにファイルをキャッシュするため、タスクの実行時にファイルをディスクから直接読み取ることができます。
2. 機能紹介
a) リソースの可視性と分類
分散キャッシュ メカニズムは各 NM によって実装され、その主な機能は、アプリケーションが必要とするファイル リソースを後続のタスクで使用するためにローカルにキャッシュすることです。
リソース キャッシュは、使用時にトリガーされます。つまり、リソースを使用する最初のタスクがトリガーされます。後続のタスクはキャッシュする必要がなく、直接使用できます。
可視性に従って、NM はリソースを 3 つのカテゴリに分類します。
- パブリック: ノード上のすべてのユーザーがこのリソースを共有できます。1 人のユーザーのアプリケーションがこれらのリソースをローカルにキャッシュしている限り、すべてのユーザーの他のすべてのアプリケーションがそれらを使用できます。
- プライベート: ノード上の同じユーザーのすべてのアプリケーションがリソースを共有します。ユーザーのアプリケーションの 1 つがリソースをローカルにキャッシュしている限り、ユーザーのすべてのアプリケーションがそのリソースを使用できます。
- アプリケーション: ノード上の同じアプリケーションのすべてのコンテナがこのリソースを共有します。
YARN は、リソース、タイプ、タイムスタンプ、パターンの 4 つのフィールドが同じかどうかを比較することで、2 つのリソース要求が同じであるかどうかを判断します。各ノードにキャッシュされたファイルがユーザーによって変更された場合、次回 HDFS からファイルを再ダウンロードするためにキャッシュの更新が使用されるときに、キャッシュの更新が自動的にトリガーされます。
分散キャッシュの主な機能は、大量のディスクの読み取りと書き込みを伴うファイルのダウンロードです。そのため、同期モデルによって引き起こされるパフォーマンスのオーバーヘッドを回避するために、プロセス全体で非同期同時モデルを使用してファイルのダウンロードを高速化します。
2) 分散キャッシュの実装
NodeManager は、ポーリング割り当て戦略を採用して、これら 3 種類のリソースをyarn.nodemanager.local-dirs
指定された。各ディレクトリでは、リソースは次の方法で保存されます。
- PUBLIC リソース:
${yarn.nodemanager.local-dirs}/filecache/
ディレクトリー、各リソースはランダムな整数にちなんで名付けられたディレクトリーに個別に保管され、ディレクトリーのアクセス権はすべて 0755 です。 - PRIVATE リソース:
${yarn.nodemanager.local-dirs}/usercache/${user}/filecache/
ディレクトリー、各リソースはランダムな整数にちなんで名付けられたディレクトリーに個別に保管され、ディレクトリーのアクセス権はすべて 0710 です。 - APPLICATION リソース:
${yarn.nodemanager.local-dirs}/usercache/${user}/${appcache}/${appid}/filecache/
ディレクトリ。各リソースはランダムな整数にちなんで名付けられたディレクトリに個別に保存され、ディレクトリのアクセス権はすべて 0710 です。
コンテナの作業ディレクトリは${yarn.nodemanager.local-dirs}/usercache/${user}/${appcache}/${appid}/${containerid}
ディレクトリ、主にjarパッケージファイルや辞書ファイルに対応するソフトリンクが格納されています。
ディレクトリ構造は次のとおりです。
./nm-local-dir/
|-- filecache // PUBLIC资源
| `-- 10 // 每个资源将单独存放在以一个随机整数命名的目录中
|-- nmPrivate
| |-- application_xxxx_xxx
| | |-- container_xxx_xxx_xxx_xx_xxxx
| | |-- container_xxx_xxx_xxx_xx_xxxx // 私有目录数据(执行脚本、token文件、pid文件)
| | | |-- container_xxx_xxx_xxx_xx_xxxx.pid
| | | |-- container_xxx_xxx_xxx_xx_xxxx.tokens
| | | `-- launch_container.sh
| |-- application_xxxx_xxx
| `-- application_xxxx_xxx
`-- usercache
|-- userXxx
| |-- appcache // APPLICATION资源
| `-- filecache // PRIVATE资源
|-- userXxx
| |-- appcache
| `-- filecache
3. クリーンアップ戦略
1. コンテナの実行後にクリーンアップする
2. 期限切れのキャッシュをクリーンアップする
NodeManager は、キャッシュ ファイルが多すぎてディスクがバーストすることを避けるために、期限切れのキャッシュ ファイルを定期的にクリーンアップします。
- 定期的な間隔
yarn.nodemanager.localizer.cache.cleanup.interval-ms
(単位はミリ秒、デフォルト値は 10×60×1000、つまり 10 分) でクリーニング ジョブを開始し、各キャッシュ ディレクトリのファイル容量が (単位は MB、デフォルト値は 10240) 未満であることを確認します。 、つまりyarn.nodemanager.localizer.cache.target-size-mb
10GB) - この値を超えると、ファイル容量が設定値を下回るまで、LRU (Least Recent Used) アルゴリズムを使用して、使用されなくなったキャッシュ ファイルがクリアされます。
4. まとめ
この記事では、NodeManager 分散キャッシュについて紹介します。NM ローカル ディレクトリを表示する必要があり、各ディレクトリのストレージ コンテンツを知る必要がある場合、この記事は対応するヘルプを提供します。同時に、コンテナーの起動プロセスの簡単な説明も提供され、コンテナーのライフサイクルを後で理解するための一定の事前知識が提供されます。