HDFS 聯邦

背景

HDFS 有兩個主要層:

Namespace

  • 由目錄、文件和塊組成。
  • 它支持所有與名稱空間相關的文件系統操作,如創建、刪除、修改和列出文件和目錄。
  • Block Storage Service 分爲兩部分:
    • Block Management (在 Namenode 中執行)
      • 通過處理註冊和定期心跳提供 Datanode 集羣成員資格。
      • 處理塊報告並維護塊的位置。
      • 支持塊相關的操作,如創建,刪除,修改和獲取塊的位置。
      • 管理複製位置、複製不足的塊的塊複製,並刪除過度複製的塊。
    • Storage - 由 datanode 提供,它將塊存儲在本地文件系統上,並允許讀寫訪問。

    以前的 HDFS 體系結構只允許整個集羣使用一個 Namespace。在該配置中,一個 Namenode 管理名稱空間。HDFS 聯合通過向 HDFS 添加對多個 namenode / namespace 的支持來解決這一限制。

多 Namenodes/Namespaces

爲了水平擴展名稱服務,HDFS 聯邦使用多個獨立的 namenode /namespace。namenode 即是聯合的也是是獨立的,不需要相互協調。datanode 被所有的 namenode 用作塊的公共存儲。每個 Datanode 註冊集羣中的所有 namenode。datanode 發送週期性的心跳和塊報告。它們還處理來自 namenode 的命令。

用戶可以使用 ViewFs 創建個性化的名稱空間視圖。ViewFs 類似於某些 Unix/Linux 系統中的客戶端掛載表。

Block Pool

塊池是屬於單個名稱空間的一組塊。datanode 爲集羣中的所有塊池存儲塊。每個塊池都是獨立管理的。這允許名稱空間爲新塊生成塊 id,而不需要與其他名稱空間進行協調。Namenode 故障不會阻止 Datanode 爲集羣中的其他 Namenode 提供服務。

命名空間及其塊池一起稱爲命名空間卷。它是一個獨立的管理單元。當刪除 Namenode/Namespace 時,刪除 datanode 上相應的塊池。在集羣升級期間,每個名稱空間卷作爲一個單元進行升級。

ClusterID

ClusterID 標識符用於標識集羣中的所有節點。在格式化 Namenode 時,將提供或自動生成此標識符。這個 ID 應該用於將其他 namenode 格式化到集羣中。

核心

  • Namespace Scalability - 聯邦添加了名稱空間水平擴展。通過允許向集羣添加更多的 namenode,大型部署或使用大量小文件的部署可以從名稱空間擴展中獲益。
  • Performance - 文件系統吞吐量不受單個 Namenode 的限制。向集羣中添加更多的 namenode 可以提高文件系統的讀寫吞吐量。
  • Isolation - 單個 Namenode 在多用戶環境中不提供隔離。例如,一個實驗性的應用程序可能會使 Namenode 超載並降低生產關鍵應用程序的速度。通過使用多個 namenode,可以將不同類別的應用程序和用戶隔離到不同的名稱空間中。

Federation Configuration

聯合配置是向後兼容的,允許現有的單個 Namenode 配置在不做任何更改的情況下工作。新配置的設計使集羣中的所有節點都具有相同的配置,而不需要根據集羣中的節點類型部署不同的配置。

Federation 添加了一個新的 NameServiceID 抽象。Namenode 及其相應的輔助/備份/檢查指針節點都屬於 NameServiceId。爲了支持單個配置文件,Namenode 和輔助/備份/檢查指針配置參數都添加了 NameServiceID 後綴。

配置

  • 步驟1:將 dfs.nameservices 參數添加到您的配置中,並使用逗號分隔的 NameServiceIDs 列表對其進行配置。datanode 將使用它來確定集羣中的 namenode。
  • 步驟2:對於每個 Namenode 和 Secondary Namenode/BackupNode/Checkpointer,將以下配置參數添加到公共配置文件中,這些參數後綴是對應的 NameServiceID:
Daemon Configuration Parameter
Namenode

dfs.namenode.rpc-address

dfs.namenode.servicerpc-address

dfs.namenode.http-address

dfs.namenode.https-address

dfs.namenode.keytab.file

dfs.namenode.name.dir

dfs.namenode.edits.dir

dfs.namenode.checkpoint.dir

dfs.namenode.checkpoint.edits.dir

Secondary Namenode

dfs.namenode.secondary.http-address

dfs.secondary.namenode.keytab.file

BackupNode

dfs.namenode.backup.address

dfs.secondary.namenode.keytab.file

這是一個配置的例子有兩個 namenode:

<configuration>
  <property>
    <name>dfs.nameservices</name>
    <value>ns1,ns2</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.ns1</name>
    <value>nn-host1:rpc-port</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.ns1</name>
    <value>nn-host1:http-port</value>
  </property>
  <property>
    <name>dfs.namenode.secondary.http-address.ns1</name>
    <value>snn-host1:http-port</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.ns2</name>
    <value>nn-host2:rpc-port</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.ns2</name>
    <value>nn-host2:http-port</value>
  </property>
  <property>
    <name>dfs.namenode.secondary.http-address.ns2</name>
    <value>snn-host2:http-port</value>
  </property>

  .... Other common configuration ...
</configuration>

格式化 Namenodes

  • 步驟1:使用以下命令格式化一個 Namenode:
[hdfs]$ $HADOOP_HOME/bin/hdfs namenode -format [-clusterId <cluster_id>]

選擇一個惟一的 cluster_id,它不會與環境中的其他集羣發生衝突。如果沒有提供 cluster_id,則會自動生成一個惟一的 cluster_id。

  • 第2步:格式額外的 namenode 使用以下命令:
[hdfs]$ $HADOOP_HOME/bin/hdfs namenode -format -clusterId <cluster_id>

注意,步驟2中的 cluster_id 必須與步驟1中的 cluster_id 相同。如果它們不同,那麼額外的 namenode 將不屬於聯合集羣的一部分。

從舊版本升級並配置聯合

舊版本只支持一個 Namenode。將集羣升級到更新版本,以便在升級過程中啓用聯合,您可以提供如下 ClusterID:

[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start namenode -upgrade -clusterId <cluster_ID>

如果沒有提供 cluster_id,則自動生成它。

向現有的HDFS集羣添加一個新的Namenode

執行以下步驟:

  • 將 dfs.nameservices 添加到配置中。

  • 使用 NameServiceID 後綴更新配置。配置鍵名在0.20發佈後更改。爲了使用聯合,必須使用新的配置參數名。

  • 將新的與 Namenode 相關的配置添加到配置文件中。

  • 將配置文件分發到集羣中的所有節點。

  • 啓動新的 Namenode 和 Secondary/Backup。

  • 刷新 datanode,對集羣中的所有 datanode 運行以下命令來獲取新添加的 Namenode:

[hdfs]$ $HADOOP_HOME/bin/hdfs dfsadmin -refreshNamenodes <datanode_host_name>:<datanode_rpc_port>

管理集羣

啓停集羣

要啓動集羣,請運行以下命令:

[hdfs]$ $HADOOP_HOME/sbin/start-dfs.sh

要停止集羣運行以下命令:

[hdfs]$ $HADOOP_HOME/sbin/stop-dfs.sh

這些命令可以在 HDFS 配置可用的任何節點上運行。該命令使用配置來確定集羣中的 Namenode,然後在這些節點上啓動Namenode 進程。datanode 在 workers 文件中指定的節點上啓動。這個腳本可以作爲一個參考,用於構建您自己的啓動和停止集羣的腳本。

平衡

平衡器已更改爲可與多個 namenode 一起工作。平衡器可以使用以下命令運行:

[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start balancer [-policy <policy>]

策略參數可以是以下任意一個:

  • datanode - 這是默認策略。這平衡了 Datanode 級別上的存儲。這類似於平衡以前版本的策略。

  • blockpool - 這平衡了塊池級別上的存儲,塊池級別上的存儲也平衡了 Datanode 級別上的存儲。

注意,Balancer 只平衡數據,而不平衡名稱空間。有關完整的命令使用,請參閱:http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HDFSCommands.html#balancer

節點下線

退役類似於以前的版本。需要被解壓的節點被添加到所有 namenode 的排除文件中。每個 Namenode 使其塊池退役。當所有的namenode 完成 Datanode 的退役時,Datanode 就被認爲已經退役了。

步驟1:要將一個排除文件分發給所有的 namenode,使用以下命令:

[hdfs]$ $HADOOP_HOME/sbin/distribute-exclude.sh <exclude_file>

步驟2:刷新所有的namenode,獲取新的排除文件:

[hdfs]$ $HADOOP_HOME/sbin/refresh-namenodes.sh

上面的命令使用 HDFS 配置來確定集羣中配置的 namenode,並刷新它們以獲取新的排除文件。

集羣 Web 管理控制檯

與 Namenode 狀態 web 頁面類似,當使用聯合時,可以使用集羣 web 控制檯在 http://<any_nn_host:port>/dfsclusterhealth.jsp 監視聯合集羣。集羣中的任何 Namenode 都可以用來訪問這個web頁面。

羣集Web控制檯提供以下信息:

  • 顯示整個集羣的文件數量、塊數量、配置的總存儲容量以及可用存儲和使用存儲的集羣摘要。

  • 一個 Namenode 列表和一個摘要,其中包括每個 Namenode 的文件數量、塊、丟失的塊以及活動和死數據節點。它還提供了一個鏈接來訪問每個 Namenode 的 web UI。

  • datanode 的退役狀態。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章