檢視檔案系統過載方案指南

簡介

檢視檔案系統過載方案的推出,旨在解決檢視檔案系統 (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 上的區域性取得該檔案。

使用檢視檔案系統過載方案的 DFSAdmin 指令

請參閱 HDFSCommands 指南

存取沒有權限的路徑

存取路徑(例如 hdfs:///foo/barhdfs:/foo/barviewfs:/foo/bar),其中未指定路徑的權限(叢集名稱或主機名稱),是很常見的。當預期相同程式碼會在具有不同名稱或 HDFS Namenode 的多個叢集上執行時,尤其如此。

當使用 ViewFileSystemOverloadScheme(如上所述),並且如果 (a) 正在存取的路徑的 scheme 與指定為 fs.defaultFS 的路徑的 scheme 不同,且 (b) 如果路徑未指定權限,則存取路徑可能會導致錯誤,例如 Empty Mount table in config for viewfs://default/。例如,當使用以下組態,但存取類似 viewfs:/foo/barviewfs:///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)。

附錄:使用 XInclude 的 Mount Table 組態

如果使用者在受信任的網路中擁有 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.xmlfs.viewfs.mounttable.path 中組態 mount-table 組態項目。請注意,Hadoop 組態 XInclude 在開啟 url 時不使用 SPNego 驗證。因此,如果您放置 mount-table.xml 的 http 伺服器需要驗證,則此方法將無法運作。