1. 程式人生 > >hadoop-2.7.4-翻譯文件-viewFS指南

hadoop-2.7.4-翻譯文件-viewFS指南

介紹

檢視檔案系統(ViewFs)提供了一種方法來管理多個Hadoop檔案系統名字空間(或名字空間卷)。這種方法對於擁有多個名稱節點和名字空間卷的聯邦HDFS特別有用ViewFs類似於Unix / Linux系統中的客戶端掛載表ViewFs可用於建立個性化的名字空間檢視以及每個群集的通用訪問。

本指南在具有多個叢集的Hadoop系統上下文中呈現,每個叢集可以聯合到多個名稱空間中。它還描述瞭如何在聯邦HDFS中使用ViewFs來為每個群集提供全域性的名字空間,以便於應用程式可以用聯邦前的方式執行。

舊系統(聯邦前)

單Namenode叢集

在聯邦HDFS

之前的舊系統中,叢集只有一個namenode,為該叢集提供單個檔案系統的名字空間。假設有多個叢集。每個叢集的檔案系統名字空間是完全獨立的,不相交的。而且,物理儲存不會跨群集共享(即Datanodes不會在群集之間共享)。

每個叢集core-site.xml都有一個配置屬性,用於將預設檔案系統設定為該叢集的namenode:

<property>
  <name>fs.default.name</name>
  <value>hdfs://namenodeOfClusterX:port</value>
</property>

這樣的配置屬性允許使用斜槓命名來解析相對於叢集節點的路徑。例如,對於上述配置,路徑/foo/bar是指使用上述配置的hdfs//namenodeOfClusterX:port/foo/bar

該配置屬性在叢集上的每個閘道器以及該叢集的關鍵服務(如JobTracker和Oozie)上進行設定。

路徑名使用模式

因此,在叢集X中,將core-site.xml設定為上面所述,典型的路徑名稱是

  1. /foo/bar

    • 這相當於以前的hdfs://namenodeOfClusterX:port/foo/bar
  2. hdfs://namenodeOfClusterX:port/foo/bar

    • 雖然這是一個有效的路徑名,但是最好使用/foo/bar,因為它允許應用程式及其資料在需要時透明地移動到另一個叢集。
  3. hdfs://namenodeOfClusterY:port/foo/bar

    • 它是用於引用另一個叢集(如Cluster Y)上的路徑名的URI。具體一點,將檔案從叢集Y複製到叢集Z的命令如下所示:
    distcp hdfs://namenodeClusterY:port/pathSrc hdfs://namenodeClusterZ:port/pathDest
  4. webhdfs://namenodeClusterX:http_port/foo/bar and hftp://namenodeClusterX:http_port/foo/bar

    • 這些是分別用於通過WebHDFS檔案系統和HFTP檔案系統訪問檔案的檔案系統URI。請注意,WebHDFS和HFTP使用namenode的HTTP埠而不是RPC埠。
  5. http://namenodeClusterX:http_port/webhdfs/v1/foo/bar 和 http://proxyClusterX:http_port/foo/bar

    • 這些是分別通過WebHDFS Rest API和HDFS代理訪問檔案的HTTP URL 

路徑名用法最佳實踐

當使用單個叢集時,建議使用上述型別(1)的路徑名,而不是像型別(2)這樣的完全限定的URI。完全限定的URI類似於地址,不允許應用程式與其資料一起移動。

新系統 - 聯邦和ViewFs

叢集概述

假設有多個叢集。每個叢集都有一個或多個節點。每個namenode都有自己的名稱空間。每個namenode僅屬於唯一的一個叢集。同一叢集中的NameNode共享該叢集的物理儲存。群集之間的名字空間與之前一樣是獨立的。

根據儲存需求,操作決定叢集內每個節點上儲存的內容。例如,他們可以將所有使用者資料(/user/<username>)放在一個NameNode中,所有的反饋資料(/data)存放到另一個NameNode中,所有專案資料(/projects)存放到再另一個NameNode中,等等。

使用ViewFs為每個群集建立全域性名字空間

為了提供與舊世界的透明度,ViewFs檔案系統(即客戶端掛載表)用於為每個叢集建立獨立的叢集名字空間檢視,該檢視類似於舊系統中的名字空間。客戶端掛載表類似Unix掛載表,並使用舊的命名約定掛載新的名字空間卷。下圖顯示了一個掛載表,其中掛載了四個名字空間卷/ user,/ data,/ projects和/ tmp:

每個叢集的典型安裝表

ViewFs實現了Hadoop檔案系統介面,就像HDFS和本地檔案系統一樣。這是一個分割槽檔案系統,它只允許連結到其他檔案系統來使用。由於ViewFs實現了Hadoop檔案系統介面,因此它具有透明的Hadoop工具。例如,與HDFS和本地檔案系統一樣,所有的shell命令都可以與ViewFs一起使用。

掛載表的掛載點由Hadoop的標準配置檔案指定。在每個叢集的配置中,預設檔案系統設定為該叢集的掛載表,如下所示(與單個Namenode叢集中的配置進行比較)。

<property>
  <name>fs.default.name</name>
  <value>viewfs://clusterX</value>
</property>

再URI如viewfs://scheme中,後面的是掛載表名稱。它確定了叢集的掛載表應以何命名。然後Hadoop系統將在Hadoop配置檔案中查詢名為“clusterX”的掛載表。在所有設定瞭如上掛載表的閘道器和服務機器中的叢集進行操作,預設檔案系統被設定為該叢集的ViewFs掛載表,如上所述。

路徑名使用模式

因此,在叢集X上,當core-site.xml中的預設檔案系統被設定為使用該叢集的掛載表時,典型的路徑名稱為:

  1. /foo/bar

    • 這相當於使用viewfs//clusterX/foo/bar。如果在舊的非聯邦系統中使用這樣的路徑名,那麼向聯邦系統的過渡是透明的。
  2. viewfs://clusterX/foo/bar

    • 雖然這是一個有效的路徑名,但是更推薦使用/foo/bar,因為它允許應用程式及其資料在需要時透明地移動到另一個叢集。
  3. viewfs://clusterY/foo/bar

    • 它是用於引用另一個叢集(如Cluster Y)上的路徑名的URI。特別地,將檔案從叢集Y複製到叢集Z的命令如下所示:
     distcp viewfs://clusterY:/pathSrc viewfs://clusterZ/pathDest
  4. viewfs://clusterX-webhdfs/foo/bar and viewfs://clusterX-hftp/foo/bar

    • 這些是分別通過WebHDFS檔案系統和HFTP檔案系統訪問檔案的URI。
  5. http://namenodeClusterX:http_port/webhdfs/v1/foo/bar and http://proxyClusterX:http_port/foo/bar

    • 這些是分別通過WebHDFS REST API和HDFS代理訪問檔案的HTTP URL。請注意,它們與以前相同。

路徑名用法最佳實踐

當使用叢集時,建議使用上述型別(1)的路徑名,而不是像型別(2)這樣的完全限定的URI。此外,應用程式不應該使用掛載點的資訊做出像hdfs://namenodeContainUserDirs:port/joe/foo/bar這樣的路徑來引用特定namenode中的檔案,而應該使用/user/joe/foo/bar路徑來代替。

在名字空間之間重新命名路徑

回想一下,在舊系統中不能在多個namenode之間或叢集中重新命名檔案或目錄。新系統也是如此,但還有一點。在舊系統中可以使用如下命令。

rename /user/joe/myStuff /data/foo/bar

在新系統中,如果/user和/data實際上儲存在叢集中的不同節點上,這將不會成功執行。

常問問題

  1. 當我從非聯邦系統轉變為聯邦系統時,我將不得不跟蹤不同卷的資料; 我怎麼做?

    不,你不需要。請參閱上面的示例 - 您可以使用相對路徑並使用預設檔案系統,或將路徑從hdfs://namenodeCLusterX/foo/bar更改為viewfs://clusterX/foo/bar。

  2. 操作會怎樣將一些檔案從一個namenode移動到叢集中的另一個namenode?

    操作可能會將檔案從一個NameNode移動到另一個NameNode來處理儲存容量的問題。他們會這樣做來避免應用程式崩潰。我們舉一些例子。

    • 示例1:/user和/data在同一個namenode上,後來他們需要部署在分開獨立的namenode上來處理容量問題。實際上,操作會為/user和/data建立單獨的掛載點。在更改之前,/user和/data的mount將指向相同的namenode,例如namenodeContainingUserAndData。操作會更新掛載表,以便掛載點分別更改為namenodeContaingUser和namenodeContainingData。
    • 示例2:所有專案都安裝在一個namenode上,但後來他們需要兩個或更多的namenode。ViewFs允許像/project/foo和/project/bar這樣的掛載。這樣可以使掛載表更新為指向相應的namenode。
  3. 每個core-site.xml中的掛載表是否在自己的單獨檔案中?

    該計劃是將掛載表儲存在單獨的檔案中,並設定到core-site.xml中。雖然可以在每個機器上本地儲存這些檔案,但最好使用HTTP從中央位置訪問它們。

  4. 配置掛載表是否只需要一個叢集叢集進行配置或所有叢集都需要進行配置?

    掛載表配置應配置到所有叢集中,因為一個叢集需要訪問其他叢集中的資料(如distcp)。

  5. 由於操作可能會隨著時間的推移更改掛載表,因此掛載表實際讀取時間是多少?

    當作業提交到群集時,開始讀取掛載表。core-site.xml中的XInclude在作業提交時被擴充套件。這意味著如果掛載表更改,那麼作業需要重新提交。由於這個原因,我們希望實現一個掛載表合併,這將大大減少更改掛載表的需要。此外,我們想在將來通過一個其他的機制來讀取掛載表,在作業開始時就進行初始化。

  6. JobTracker(或yarn資源管理器)本身會使用ViewFs嗎?

    不需要。NodeManager也同樣不需要。

  7. ViewFs只允許在頂層安裝嗎?

    不是的; 它更加通用。例如,可以掛載 /user/joe和/user/jane。在這種情況下,在掛載表中建立/user這個內部只讀目錄。/user上的所有的屬於只讀屬性的操作都是有效的。

  8. 一個應用程式在整個叢集中的工作需要持久儲存檔案路徑。 應該選擇哪些路徑進行儲存?

    您應該儲存viewfs://cluster/path型別的路徑名,與執行應用程式時所使用的路徑名相同。只要操作以透明的方式進行移動,這將使您不必在叢集內的資料集中移動資料。如果資料從一個叢集移動到另一個叢集,它不會使您絕望; 舊的系統(聯邦前)並沒有保護你在叢集之間形成這樣的資料移動。

  9. 代理令牌怎麼辦?

    要提交作業的群集(包括該群集的掛載表中所有已掛載的卷)以及map-reduce作業的輸入和輸出路徑(包括指定輸入和輸出涉及到的掛載表的所有卷)的代理令牌路徑都被自動處理。此外,有一種方法可以在特殊情況下為基本群集配置新增額外的代理令牌。

附錄:安裝表配置示例

通常,使用者不必定義掛載表或core-site.xml來使用掛載表。這是通過操作完成的,正確的配置是在相應的閘道器機器上設定的,就像今天對core-site.xml的操作一樣。

掛載表可以在core-site.xml中定義,但是最好在core-site.xml中使用間接引用一個單獨的配置檔案,比如說mountTable.xml。將以下配置元素新增到core-site.xml以引用mountTable.xml:

<configuration xmlns:xi="http://www.w3.org/2001/XInclude"> 
  <xi:include href="mountTable.xml" />
</configuration> 

在檔案mountTable.xml中,假設叢集的掛載表“ClusterX”的定義是由三個節點管理的三個名稱空間卷的聯邦。

  1. nn1-clusterx.example.com:8020,
  2. nn2-clusterx.example.com:8020,和
  3. nn3-clusterx.example.com:8020。

這裡/home和/tmp位於由namenode nn1-clusterx.example.com:8020管理的名稱空間中,/project/foo和/bar託管在聯邦叢集的其他節點上。主目錄基本路徑設定為/home,以便每個使用者可以使用FileSystem/FileContext中定義的getHomeDirectory()方法訪問其主目錄。


    
<configuration>
  <property>
    <name>fs.viewfs.mounttable.ClusterX.homedir</name>
    <value>/home</value>
  </property>
  <property>
    <name>fs.viewfs.mounttable.ClusterX.link./home</name>
    <value>hdfs://nn1-clusterx.example.com:8020/home</value>
  </property>
  <property>
    <name>fs.viewfs.mounttable.ClusterX.link./tmp</name>
    <value>hdfs://nn1-clusterx.example.com:8020/tmp</value>
  </property>
  <property>
    <name>fs.viewfs.mounttable.ClusterX.link./projects/foo</name>
    <value>hdfs://nn2-clusterx.example.com:8020/projects/foo</value>
  </property>
  <property>
    <name>fs.viewfs.mounttable.ClusterX.link./projects/bar</name>
    <value>hdfs://nn3-clusterx.example.com:8020/projects/bar</value>
  </property>
</configuration>