提供的儲存空間允許將儲存在 HDFS 外部的資料對應到 HDFS 並從 HDFS 中定址。它建立在異質儲存空間上,透過將新的儲存類型 PROVIDED
介紹到資料節點中的媒體組。存取 PROVIDED
儲存空間中資料的用戶端可以在本地媒體中快取複本、強制執行 HDFS 不變式(例如安全性、配額),以及定址比群集可以在連接到資料節點的儲存空間中保留更多的資料。此架構在 HDFS 群集為暫時性(例如雲端場景)和/或需要讀取存在於其他儲存系統(例如 blob 儲存體)中的資料的場景中特別有用。
提供的儲存空間是 HDFS 中的實驗性功能。
截至撰寫本文為止,將外部儲存空間掛載為 PROVIDED
區塊的功能僅限於建立實作 org.apache.hadoop.fs.FileSystem
介面的遠端名稱空間的 唯讀映像,以及啟動 NameNode 來提供映像。具體來說,支援從遠端名稱空間的快照讀取。在此版本中,無法將遠端名稱空間新增至現有/正在執行的名稱節點、更新遠端快照、卸載,以及寫入。你可以使用 ViewFs 和 RBF 將具備 PROVIDED
儲存空間的名稱空間整合到現有部署中。
PROVIDED
儲存空間的 HDFS 群集你可以使用 fs2img
工具建立遠端名稱空間的快照。在提供遠端 FileSystem
的路徑後,此工具會建立一個反映名稱空間的 映像,以及一個 別名映射,將產生映像中的區塊 ID 映射到遠端檔案系統中的 FileRegion
。FileRegion
包含足夠的資訊來處理遠端 FileSystem
中的固定位元組序列 (例如,檔案、位移、長度),以及一個驗證碼,以驗證自從產生映像以來,區域沒有變更。
在建立 NameNode 映像和別名映射後,必須設定 NameNode 和 DataNode 以一致地參照這個位址空間。當 DataNode 註冊時,會附上 PROVIDED
儲存空間,NameNode 會將所有外部區塊視為可透過該 DataNode 存取,並可能開始將用戶端導向該區塊。對稱地,DataNode 必須能夠將 PROVIDED
儲存空間中的每個區塊映射到遠端資料。
部署詳細資料會根據設定的別名映射實作而有所不同。
PROVIDED
設定每個 NameNode 支援一個別名映射。當啟用 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
在 LevelDB 中,根據自訂 UGIResolver
指定擁有權
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
參數進行設定。目前支援下列兩種別名對應。
這是基於 LevelDB 的別名對應,在 Namenode 中以獨立伺服器執行。別名對應本身可以使用 fs2img
工具建立,使用選項 -Ddfs.provided.aliasmap.leveldb.path=file:///path/to/leveldb/map/dingos.db -b org.apache.hadoop.hdfs.server.common.blockaliasmap.impl.LevelDBFileRegionAliasMap
,如上方的範例所示。
資料節點使用 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>