提供ストレージは、HDFS外部に保存されたデータをHDFSにマッピングし、HDFSからアドレス指定できるようにします。これは、データノードのメディアセットに新しいストレージタイプ `PROVIDED` を導入することで、異種ストレージを基盤としています。`PROVIDED` ストレージ内のデータにアクセスするクライアントは、ローカルメディアにレプリカをキャッシュし、HDFSの不変条件(例:セキュリティ、クォータ)を適用し、DataNodeに接続されたストレージに永続化できるよりも多くのデータアドレス指定できます。このアーキテクチャは、HDFSクラスタが一時的な場合(例:クラウドシナリオ)、および/または他のストレージシステム(例:BLOBストア)に存在するデータを読み取る必要がある場合に特に役立ちます。
提供ストレージは、HDFSの試験的な機能です。
現時点では、外部ストレージを`PROVIDED`ブロックとしてマウントするためのサポートは、`org.apache.hadoop.fs.FileSystem`インターフェースを実装するリモート名前空間の_読み取り専用イメージ_を作成し、そのイメージを提供するNameNodeを起動することに限定されています。具体的には、リモート名前空間のスナップショットからの読み取りがサポートされています。既存/実行中の名前ノードへのリモート名前空間の追加、リモートスナップショットの更新、アンマウント、および書き込みは、このリリースでは使用できません。ViewFsとRBFを使用して、`PROVIDED`ストレージを持つ名前空間を既存のデプロイメントに統合できます。
`fs2img`ツールを使用して、リモート名前空間のスナップショットを作成できます。リモート`FileSystem`へのパスを指定すると、ツールは名前空間をミラーリングする_イメージ_と、生成されたイメージ内のblockIDをリモートファイルシステムの`FileRegion`にマッピングする_エイリアスマップ_を作成します。 `FileRegion`には、リモート`FileSystem`(例:ファイル、オフセット、長さ)内の固定バイトシーケンスをアドレス指定するのに十分な情報と、イメージが生成されてからリージョンが変更されていないことを確認するためのナンスが含まれています。
NameNodeイメージとエイリアスマップが作成された後、NameNodeとDataNodeはこのアドレス空間を一貫して参照するように設定する必要があります。接続された`PROVIDED`ストレージを使用してDataNodeが登録されると、NameNodeはそのDataNodeを介してすべての外部ブロックをアドレス指定できると見なし、クライアントをDataNodeに転送し始める可能性があります。同様に、DataNodeは`PROVIDED`ストレージ内のすべてのブロックをリモートデータにマッピングできる必要があります。
デプロイメントの詳細は、設定されたエイリアスマップの実装によって異なります。
各NameNodeは1つのエイリアスマップをサポートします。 `PROVIDED`ストレージが有効になっている場合、NameNodeとDataNodeで設定されているストレージIDは一致する必要があります。その他すべての詳細は、エイリアスマップ実装の内部にあります。
`PROVIDED`ストレージを有効にするための設定は次のとおりです。エイリアスマップ実装で使用可能な設定オプションは以下にあります。
<configuration> <property> <name>dfs.namenode.provided.enabled</name> <value>true</value> <description>Enabled provided storage on the Namenode</description> </property> <property> <name>dfs.datanode.data.dir</name> <value>[DISK]/local/path/to/blocks/, [PROVIDED]remoteFS://remoteFS-authority/path/to/data/</value> </property> <property> <name>dfs.provided.storage.id</name> <value>DS-PROVIDED</value> <description>The storage ID used for provided storages in the cluster.</description> </property> <property> <name>dfs.provided.aliasmap.class</name> <value>org.apache.hadoop.hdfs.server.common.blockaliasmap.impl.TextFileRegionAliasMap</value> </property> </configuration>
`fs2img`ツールは、リモートURIの子を再帰的に列挙することにより、リモート名前空間を「ウォーク」してFSImageを生成します。一部の属性は、リモートファイルシステムからHDFSへの所有者/グループマッピングや、ファイルのHDFSブロックへのマッピングなど、プラグインによって制御できます。
ツールの実行で使用可能なさまざまなオプションは次のとおりです。
オプション | プロパティ | デフォルト | 説明 |
---|---|---|---|
-o , --outdir |
dfs.namenode.name.dir | file://${hadoop.tmp.dir}/dfs/name | 出力ディレクトリ |
-b , --blockclass |
dfs.provided.aliasmap.class | NullBlocksMap | ブロック出力クラス |
-u , --ugiclass |
hdfs.image.writer.ugi.class | SingleUGIResolver | UGIリゾルバークラス |
-i , --blockidclass |
hdfs.image.writer.blockresolver.class | FixedBlockResolver | ブロックリゾルバークラス |
-c , --cachedirs |
hdfs.image.writer.cache.entries | 100 | 最大アクティブディレクトリエントリ数 |
-cid , --clusterID |
クラスタID | ||
-bpid , --blockPoolID |
ブロックプールID |
すべてのファイルの所有者を「rmarathe」に割り当て、gzip圧縮テキストに書き込む
hadoop org.apache.hadoop.hdfs.server.namenode.FileSystemImage \ -Dhdfs.image.writer.ugi.single.user=rmarathe \ -Ddfs.provided.aliasmap.text.codec=gzip \ -Ddfs.provided.aliasmap.text.write.dir=file:///tmp/ -b org.apache.hadoop.hdfs.server.common.blockaliasmap.impl.TextFileRegionAliasMap \ -u org.apache.hadoop.hdfs.server.namenode.SingleUGIResolver \ -o file:///tmp/name \ hdfs://afreast/projects/ydau/onan
カスタム`UGIResolver`に基づいて、LevelDBに所有権を割り当てる
hadoop org.apache.hadoop.hdfs.server.namenode.FileSystemImage \ -Ddfs.provided.aliasmap.leveldb.path=/path/to/leveldb/map/dingos.db \ -b org.apache.hadoop.hdfs.server.common.blockaliasmap.impl.LevelDBFileRegionAliasMap \ -o file:///tmp/name \ -u CustomResolver \ hdfs://enfield/projects/ywqmd/incandenza
使用するエイリアスマップ実装は、`dfs.provided.aliasmap.class`パラメータを使用して設定されます。現在、次の2種類のエイリアスマップがサポートされています。
これは、NameNodeで個別のサーバーとして実行されるLevelDBベースのエイリアスマップです。エイリアスマップ自体は、上記の例のように、`-Ddfs.provided.aliasmap.leveldb.path=file:///path/to/leveldb/map/dingos.db -b org.apache.hadoop.hdfs.server.common.blockaliasmap.impl.LevelDBFileRegionAliasMap`オプションを使用して`fs2img`ツールを使用して作成できます。
DataNodeは、`org.apache.hadoop.hdfs.server.aliasmap.InMemoryAliasMapProtocol`プロトコルを使用してこのエイリアスマップに接続します。
<configuration> <property> <name>dfs.provided.aliasmap.inmemory.batch-size</name> <value>500</value> <description> The batch size when iterating over the database backing the aliasmap </description> </property> <property> <name>dfs.provided.aliasmap.inmemory.dnrpc-address</name> <value>namenode:rpc-port</value> <description> The address where the aliasmap server will be running </description> </property> <property> <name>dfs.provided.aliasmap.inmemory.leveldb.dir</name> <value>/path/to/leveldb/map/dingos.db</value> <description> The directory where the leveldb files will be kept </description> </property> <property> <name>dfs.provided.aliasmap.inmemory.enabled</name> <value>true</value> <description>Enable the inmemory alias map on the NameNode. Defaults to false.</description> </property> <property> <name>dfs.provided.aliasmap.class</name> <value>org.apache.hadoop.hdfs.server.common.blockaliasmap.impl.InMemoryLevelDBAliasMapClient</value> </property> </configuration>
このエイリアスマップ実装は、`blockID`から`FileRegion`へのマッピングを区切りテキストファイルに保存します。この形式は、特にシングルノードのテスト環境に役立ちます。
<configuration> <property> <name>dfs.provided.aliasmap.text.delimiter</name> <value>,</value> <description> The delimiter used when the alias map is specified as a text file. </description> </property> <property> <name>dfs.provided.aliasmap.text.read.file</name> <value>file:///path/to/aliasmap/blocks_blocPoolID.csv</value> <description> The path specifying the alias map as a text file, specified as a URI. </description> </property> <property> <name>dfs.provided.aliasmap.text.codec</name> <value></value> <description> The codec used to de-compress the alias map. Default value is empty. </description> </property> <property> <name>dfs.provided.aliasmap.text.write.dir</name> <value>file:///path/to/aliasmap/</value> <description> The path to which the alias map should be written as a text file, specified as a URI. </description> </property> </configuration>