HDFS Federation(翻譯)

這個指南提供了一個關於HDFS Federation 特性和怎麼配置管理一個聯邦集羣的概覽。html

Background

HDFS主要包括兩層:node

Namespaceweb

  • 由目錄,文件和塊組成
  • 支持全部文件系統操做包括增長,刪除,修改和列出文件和目錄

Block Storage Service 有兩個部分:apache

  • Block管理(被NameNode包含)
    • 提供datanode集羣的註冊和按期的心跳檢查
    • 處理block的報告並掌握block的位置
    • 支持block的相關操做,如增刪改查和獲得block的位置
  • 管理副本位置,管理副本的複製和刪除
  • 存儲-由提供datanodes的本地系統提供存儲,容許讀寫。

以前HDFS的架構只容許整個集羣中存在一個namespace。一個獨立的Namenode管理這個namespace。HDFS Federation經過加入多個Namenodes/namespaces到集羣當中解決了以前架構的限制。架構

Multiple Namenodes/Namespaces

爲了水平擴展name services,Federation使用多個獨立的Namenodes/namespaces。這些NameNode之間結成聯邦,即Namenodes是獨立的,不須要互相協調。DataNode被全部的NameNode使用用來做爲通用的數據塊存儲設備。每個DataNode註冊集羣中全部的NameNode。Datanodes發送心跳和block報告而且處理NameNode發送的命令。

Users may use ViewFs to create personalized namespace views, where ViewFs is analogous to client side mount tables in some Unix/Linux systems.jsp

Block 池:ide

一個block池是一個隸屬於一個namespace的全部block的集合。DataNode爲全部的block池儲存集羣當中的block信息。block池被獨立管理,互不影響。這個設計將容許爲新的block產生Block ID並不會須要其餘的namespace。一個NameNode出問題也不會影響datanode爲集羣中的其餘NameNode服務。Namespace及其block池在一塊兒叫作 Namespace Volume(Namespace 卷)。它是一個獨立的單位管理。當一個Namenode/namespace被刪除的時候,在datanodes中的對應的block池也會被刪除。在集羣升級時,一個namespace volume是一個升級單元。oop

ClusterID性能

一個新的標識ClusterID用來標示集羣當中全部的節點。當一個Namenode被格式化,這個標識符或自動生成的。這個ID會被用來格式化集羣中的其餘Namenode。spa

關鍵的好處

  • Namespace擴展性-HDFS集羣存儲能夠水平擴展可是namespace不行。大型部署或者是小文件較多的系統能夠經過向集羣添加更多的NameNode獲益。
  • 性能-以前的架構中,文件系統的吞吐量受限於單一NameNode。添加更多的NameNode會提升讀寫的吞吐量
  • 隔離 - 單一NameNode沒法隔離多用戶環境,實驗的程序可能形成Namenode變慢,影響生產環境,多個Namenodes使得不一樣類別的應用程序和用戶能夠分離不一樣的名稱空間。

Federation Configuration

Federation配置是向後兼容,容許現有的單一Namenode配置工做,不會有任何改變。新的配置被設計成集羣當中的全部節點擁有着相同的配置而且並不須要爲不一樣的機器設置不一樣的配置文件。

Federation中添加了一個新的抽象NameServiceID。Namenode以及對應的Secondary/backup/checkpointer節點都屬於這個。支持單個配置文件,Namenode以及對應的econdary/backup/checkpointer配置參數經過NameServiceID後綴標示,並能夠添加到一樣的配置文件當中。

配置

第一步:添加下面的配置到你的配置文件當中:

dfs.nameservices: 配置與逗號分隔NameServiceIDs列表

這是爲了Datanodes用來肯定集羣中的全部Namenodes。

第二步:爲每個Namenode以及Secondary/backup/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.dirdfs.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.secondaryhttp-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.secondaryhttp-address.ns2</name>
    <value>snn-host2:http-port</value>
  </property>

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

格式化NameNode

第一步:格式化namenode,命令以下:

> $HADOOP_PREFIX_HOME/bin/hdfs namenode -format [-clusterId <cluster_id>]

選擇一個不一樣的cluster_id,保證不會和其餘的集羣衝突,若是不提供的話,他會自動生成一個不一樣的ClusterID 

第二步: 格式化添加的namenode,能夠用下面的命令:

> $HADOOP_PREFIX_HOME/bin/hdfs namenode -format -clusterId <cluster_id>

注意:第二步使用的cluster_id不行要和第一步相同,若是不相同的話,添加的Namenode將不會在聯邦集羣中起做用

從老版本升級以後而且配置聯邦

早期的版本只能支持單一的Namenode,下面的步驟能夠是聯邦可用:

第一步:升級集羣。在升級過程當中你一個提供一個ClusterID:

> $HADOOP_PREFIX_HOME/bin/hdfs start namenode --config $HADOOP_CONF_DIR  -upgrade -clusterId <cluster_ID>

若是不提供那麼會自動生成。

添加一個新的NameNode到一個既存的HDFS集羣

按照如下步驟:

  • 添加配置參數dfs.nameservices到配置文件
  • 使用NameServiceID 做爲後綴更新配置文件。配置的key名字已經和0.20不一致了,必須使用新的配置參數名
  • 添加新的NameNode相關配置到配置文件當中
  • 將配置文件同步到集羣當中的全部節點
  • 啓動新的Namenode, Secondary/Backup節點
  • 刷新datanode獲取新添加的namenode,使用下列命令:
> $HADOOP_PREFIX_HOME/bin/hdfs dfadmin -refreshNameNode <datanode_host_name>:<datanode_rpc_port>

在集羣中全部的datanodes運行上面的命令

Managing the cluster

Starting and stopping cluster

啓動:

> $HADOOP_PREFIX_HOME/bin/start-dfs.sh

中止:

> $HADOOP_PREFIX_HOME/bin/stop-dfs.sh

這些命令能夠在在HDFS運行的任何節點運行。命令將肯定namenode而且啓動這些namenode。datanode是經過slaves文件指定的。腳本能夠做爲參考來構建本身啓動和中止集羣的腳本。

Balancer

Balancer 已經被用來改變集羣中多個NameNode的的平衡。能夠運行下面的命令:

> "$HADOOP_PREFIX"/bin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script "$bin"/hdfs start balancer [-policy <policy>]

Policy:

  • datanode -默認的策略。這個會平衡datanode的存儲,和先前的版本相似。

  • blockpool - 針對block 池平衡。平衡block池存儲也會平衡datanode。

注意Balande只平衡數據和不平namespace。

 

Decommissioning

退役和先前的版本相似。退役的節點須要被添加到在全部Namenode的exclude文件中。每個Namenode退役它對應的block 池當全部的Namenode完成了datanode的退役,那麼這個datanode就能夠退役了

第一步:分發一個exclude文件到全部的NameNode,以下:

> "$HADOOP_PREFIX"/bin/distributed-exclude.sh <exclude_file>

第二步:刷新全部NameNode使用新的exclude文件

> "$HADOOP_PREFIX"/bin/refresh-namenodes.sh

上面的命令將使用HDFS配置文件肯定集羣的Namenode,使用新的exclude文件刷新全部的Namenode。

Cluster Web Console

和NameNode的web頁面相似,集羣的web cosole用來監視集羣 http://<any_nn_host:port>/dfsclusterhealth.jsp。任何集羣中的NameNode均可以進入這個頁面

頁面提供了:

  • 集羣的綜述,包括文件的數目,block的數目總存儲容量可用和空閒的空間等
  • 提供namenode的列表和每一個namenode的files,blocks,missing blocks,number of live and dead data nodes數量。同事提供一個鏈接去每個Namenode 的web頁面
  • 退役datanode的狀態
相關文章
相關標籤/搜索