檢視檔案系統過載方案的推出,旨在解決檢視檔案系統 (ViewFS) 的兩個主要挑戰。第一個問題是,若要使用 ViewFS,使用者需要使用 viewfs 方案 (viewfs://
) 更新 fs.defaultFS。第二個問題是,使用者需要將掛載表組態複製到所有用戶端節點。ViewFileSystemOverloadScheme 正在解決這些挑戰。
檢視檔案系統過載方案是檢視檔案系統的延伸。這將允許使用者繼續使用他們現有的 fs.defaultFS 已設定的方案或任何新的方案名稱,而不是使用方案 viewfs
。掛載連結設定檔金鑰、值格式與 ViewFS 指南 中相同。如果使用者想要繼續使用相同的 fs.defaultFS 並且想要有更多掛載點,則掛載連結設定檔應將 ViewFileSystemOverloadScheme 初始化的 uri 主機名稱作為掛載表名稱。例如,如果 fs.defaultFS 是 hdfs://mycluster
,則掛載連結設定檔金鑰名稱應採用下列格式 fs.viewfs.mounttable.*mycluster*.link.<mountLinkPath>
。即使初始化的 fs uri 有主機名稱:埠號,它仍會忽略埠號,只將主機名稱視為掛載表名稱。我們將在以下各節中討論更多範例設定檔。如果沒有使用初始化 uri 的主機名稱作為掛載表名稱設定任何掛載連結,則它會自動將目前的 uri 視為後備 (fs.viewfs.mounttable.*mycluster*.linkFallback
) 目標 fs uri。如果初始化的 uri 包含路徑部分,它只會考慮方案和授權部分,而不考慮路徑部分。例如,如果初始化的 uri 包含 hdfs://mycluster/data
,它只會將 hdfs://mycluster
視為後備目標 fs uri。路徑部分 data
將會被忽略。
ViewFileSystemOverloadScheme 的另一個重要改進是,管理員不需要將 mount-table.xml
設定檔複製到 1000 個以上的用戶端節點。相反地,他們可以將掛載表設定檔保留在 Hadoop 相容的檔案系統中。因此,將設定檔保留在中央位置讓管理員的工作更輕鬆,因為他們可以在單一位置更新掛載表。
若要使用此類別,需要在 core-site.xml 檔案中新增下列設定檔。
<property> <name>fs.<scheme>.impl</name> <value>org.apache.hadoop.fs.viewfs.ViewFileSystemOverloadScheme</value> </property>
這裡的 <scheme>
應與 fs.defautFS 中設定的 uri-scheme 相同。例如,如果 fs.defaultFS 已設定為 hdfs://mycluster
,則上述設定檔會如下所示
<property> <name>fs.hdfs.impl</name> <value>org.apache.hadoop.fs.viewfs.ViewFileSystemOverloadScheme</value> </property>
範例 1
如果使用者想要他們現有叢集 (hdfs://cluster
) 的部分資料使用 hdfs(hdfs://cluster
) 和其他物件儲存叢集(o3fs://bucket1.volume1.omhost/
、s3a://bucket1/
) 掛載,下列範例設定檔可以說明如何新增掛載連結。
<property> <name>fs.viewfs.mounttable.cluster.link./user</name> <value>hdfs://cluster/user</value> </property> <property> <name>fs.viewfs.mounttable.cluster.link./data</name> <value>o3fs://bucket1.volume1/data</value> </property> <property> <name>fs.viewfs.mounttable.cluster.link./backup</name> <value>s3a://bucket1/backup/</value> </property>
讓我們考慮以下操作,以了解這些操作將根據掛載連結委派到哪裡。
Op1: 使用路徑 hdfs://cluster/user/fileA
建立檔案,然後這個檔案將實體建立在 hdfs://cluster/user/fileA
。這個委派是根據上述設定中的第一個設定參數而發生。這裡的 /user
對應到 hdfs://cluster/user/
。
Op2: 使用路徑 hdfs://cluster/data/datafile
建立檔案,然後這個檔案將建立在 o3fs://bucket1.volume1.omhost/data/datafile
。這個委派是根據上述設定中的第二個設定參數而發生。這裡的 /data
對應到 o3fs://bucket1.volume1.omhost/data/
。
Op3: 使用路徑 hdfs://cluster/backup/data.zip
建立檔案,然後這個檔案將實體建立在 s3a://bucket1/backup/data.zip
。這個委派是根據上述設定中的第三個設定參數而發生。這裡的 /backup
對應到 s3a://bucket1/backup/
。
範例 2
如果使用者想要將他們現有的叢集 (s3a://bucketA/
) 資料掛載到其他 hdfs 叢集 (hdfs://cluster
) 和物件儲存叢集 (o3fs://bucket1.volume1.omhost/
, s3a://bucketA/
),以下範例設定可以顯示如何新增掛載連結。
<property> <name>fs.viewfs.mounttable.bucketA.link./user</name> <value>hdfs://cluster/user</value> </property> <property> <name>fs.viewfs.mounttable.bucketA.link./data</name> <value>o3fs://bucket1.volume1.omhost/data</value> </property> <property> <name>fs.viewfs.mounttable.bucketA.link./salesDB</name> <value>s3a://bucketA/salesDB/</value> </property>
讓我們考慮以下操作,以了解這些操作將根據掛載連結委派到哪裡。
Op1: 使用路徑 s3a://bucketA/user/fileA
建立檔案,然後這個檔案將實體建立在 hdfs://cluster/user/fileA
。這個委派是根據上述設定中的第一個設定參數而發生。這裡的 /user
對應到 hdfs://cluster/user
。
Op2: 使用路徑 s3a://bucketA/data/datafile
建立檔案,然後這個檔案將建立在 o3fs://bucket1.volume1.omhost/data/datafile
。這個委派是根據上述設定中的第二個設定參數而發生。這裡的 /data
對應到 o3fs://bucket1.volume1.omhost/data/
。
Op3: 使用路徑 s3a://bucketA/salesDB/dbfile
建立檔案,然後這個檔案將實體建立在 s3a://bucketA/salesDB/dbfile
。這個委派是根據上述設定中的第三個設定參數而發生。這裡的 /salesDB
對應到 s3a://bucket1/salesDB
。
注意:在上述範例中,我們只使用建立操作,但相同的機制也適用於這裡的任何其他檔案系統 API。
以下圖片顯示與 ViewFileSystem 相較之下,不同的架構如何在 ViewFileSystemOverloadScheme 中使用。
注意:在 ViewFsOverloadScheme 中,掛載連結預設不會表示為符號連結。權限位元和 isDirectory 值將從目標目錄/檔案傳播。
若要啟用中央掛載表設定,我們需要在 core-site.xml
中設定 fs.viewfs.mounttable.path
,其值為 Hadoop 相容檔案系統目錄/檔案路徑,其中複製了 mount-table.<versionNumber>.xml
檔案。其中 versionNumber 為整數,且需要增加版本號碼並將新檔案上傳至相同目錄。
ViewFileSystemOverloadScheme 永遠載入最高版本號碼的 mount-table.<versionNumber>.xml
。請勿以相同名稱取代檔案。永遠遞增版本號碼,以讓新初始化的用戶端選取新檔案。我們不建議取代檔案的原因是,有些用戶端可能已開啟與舊掛載表檔案的連線,且正在載入設定檔,而取代檔案可能會導致其失敗。
<property> <name>fs.viewfs.mounttable.path</name> <value>hdfs://cluster/config/mount-table-dir</value> </property>
如果您確定永遠不會更新掛載表檔案,也可以直接設定檔案路徑,如下所示。如果您設定檔案路徑,它不會檢查任何最高版本號碼載入。它會載入設定的任何檔案。但是,檔案名稱格式應相同。
<property> <name>fs.viewfs.mounttable.path</name> <value>hdfs://cluster/config/mount-table-dir/mount-table.<versionNumber>.xml</value> </property>
注意:如果您設定上述有效路徑,我們建議不要在 core-site.xml
中設定掛載連結。否則,兩個掛載連結會混在一起,並可能導致行為混淆。
如果您複製 mount-table.<versionNumber>.xml
,您可能會考慮根據叢集大小設定較大的複製因子。因此,當應用程式(MR/YARN/HBASE 等)在讀取 mount-table.<versionNumber>.xml
時,大多數用戶端都可以透過 HDFS 上的區域性取得該檔案。
請參閱 HDFSCommands 指南
存取路徑(例如 hdfs:///foo/bar
、hdfs:/foo/bar
或 viewfs:/foo/bar
),其中未指定路徑的權限(叢集名稱或主機名稱),是很常見的。當預期相同程式碼會在具有不同名稱或 HDFS Namenode 的多個叢集上執行時,尤其如此。
當使用 ViewFileSystemOverloadScheme
(如上所述),並且如果 (a) 正在存取的路徑的 scheme 與指定為 fs.defaultFS
的路徑的 scheme 不同,且 (b) 如果路徑未指定權限,則存取路徑可能會導致錯誤,例如 Empty Mount table in config for viewfs://default/
。例如,當使用以下組態,但存取類似 viewfs:/foo/bar
或 viewfs:///foo/bar
的路徑時,就會發生此類錯誤。
<property> <name>fs.hdfs.impl</name> <value>org.apache.hadoop.fs.viewfs.ViewFileSystemOverloadScheme</value> </property> <property> <name>fs.defaultFS</name> <value>hdfs://cluster/</value> </property>
為避免上述問題,組態 fs.viewfs.mounttable.default.name.key
必須設定為叢集名稱,亦即,應將下列內容新增至 core-site.xml
<property> <name>fs.viewfs.mounttable.default.name.key</name> <value>cluster</value> </property>
此組態 cluster
中的字串應與 fs.defaultFS
值中權限的名稱相符。此外,組態應具有正確組態的 mount table,如上述範例所示,亦即,應設定組態 fs.viewfs.mounttable.*cluster*.link.<mountLinkPath>
(請注意,這些組態中使用了相同的字串 cluster
)。
如果使用者在受信任的網路中擁有 HTTP 伺服器,且不需要對其進行驗證機制,您也可以將 mount-table.xml
檔案放置在該伺服器中,並使用 mount-table.xml
檔案組態 XInclude xml 標籤。
<configuration xmlns:xi="http://www.w3.org/2001/XInclude"> <xi:include href="http://myserver/mountTable/mountTable.xml" /> </configuration>
Apache Hadoop 組態有能力從 XInclude 讀取 http url,並載入組態。如果您選擇此選項,請勿在 core-site.xml
或 fs.viewfs.mounttable.path
中組態 mount-table 組態項目。請注意,Hadoop 組態 XInclude 在開啟 url 時不使用 SPNego 驗證。因此,如果您放置 mount-table.xml
的 http 伺服器需要驗證,則此方法將無法運作。