天天看點

HDFS的HA

HDFS HA的架構

  • 針對NameNode啟用兩台實體主機,一台Active,一台Standby。

  • Active NameNode主機負責所有操縱,Standby NameNode主機待命。

  • Journal是單獨的程序(JournalNodes,JNs),負責Active NameNode主機和Standby NameNode主機之間的同步通信。

  • Active NameNode的修改動作會寫入到JNs,Standby NameNode會從JNs中讀取edit logs。Standby NameNode會持續觀察edit logs的變化。一旦edit logs發生變化,Standby NameNode會将變化同步到自己的名字空間。

  • DataNode會同時向Active NameNode和Standby NameNode發送心跳資訊和block info。

  • 同時隻能有一個Active NameNode。當出現兩個Active NameNode時稱之為“spit-brain”。

  • 隻能Active NameNode寫入,而Standby NameNode負責讀取。

HDFS的HA

HA的配置

1. 配置hdfs-site.xml

配置nameservices的邏輯名。這裡任意給一個mycluster。

<property>
  <name>dfs.nameservices</name>
  <value>mycluster</value>
</property>
           

2. 配置nameservices中的每一個NameNode

接着上邊的邏輯名稱mycluster,給出NameNode ID:nn1和nn2,用逗号分隔。

<property>
  <name>dfs.ha.namenodes.mycluster</name>
  <value>nn1,nn2</value>
</property>
           

注意:目前hadoop2.9.2最多隻支援2個NameNode。

3. 配置每個NameNode的RPC位址

<property>
  <name>dfs.namenode.rpc-address.mycluster.nn1</name>
  <value>machine1.example.com:8020</value>
</property>
<property>
  <name>dfs.namenode.rpc-address.mycluster.nn2</name>
  <value>machine2.example.com:8020</value>
</property>
           

4. 配置每個NameNode的Web UI

<property>
  <name>dfs.namenode.http-address.mycluster.nn1</name>
  <value>machine1.example.com:50070</value>
</property>
<property>
  <name>dfs.namenode.http-address.mycluster.nn2</name>
  <value>machine2.example.com:50070</value>
</property>
           

htts使用形如:dfs.namenode.https-address.mycluster.nn1

5. 配置NameNode的共享edit logs目錄

<property>
  <name>dfs.namenode.shared.edits.dir</name>
  <value>qjournal://node1.example.com:8485;node2.example.com:8485;node3.example.com:8485/mycluster</value>
</property>
           

/mycluster是目錄。

6. 配置用戶端容災代理提供者

<property>
  <name>dfs.client.failover.proxy.provider.mycluster</name>
  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
           

供hadoop用戶端用來檢測哪個NameNode是Active的。

7. 配置HA防護方法名集合(Optional)

QJM可以防止腦裂的發生,即不會存在兩個Active NameNode寫入edit logs。

可選配置sshfence或者給一個shell script。

8. 配置HDFS的檔案系統

在core-site.xml中配置

<property>
  <name>fs.defaultFS</name>
  <value>hdfs://mycluster</value>
</property>
           

9. 配置JNs本地存放資料的目錄(edit logs)

<property>
  <name>dfs.journalnode.edits.dir</name>
  <value>/path/to/journal/node/local/data</value>
</property>
           

一般設定在hadoop系統使用者的家目錄下。

HA的部署

1. 在JNs節點上啟動JN程序

hadoop-daemon.sh start journalnode
           

2. 在磁盤上完成Active NameNode和Standby NameNode中繼資料的同步

(Ⅰ)如果正在建構新的hdfs叢集,需要在一台NameNode上進行format工作。

(Ⅱ)若已經格式化檔案系統或者在非HA的叢集上啟用HA功能,需要将現有NameNode的目錄(~/hadoop/dfs/name)拷貝至另一台NameNode的相同目錄下。在未格式化的NameNode主機上執行:

hdfs namenode -bootstrapStandby
           

該指令保證JNs有足夠的edit來啟動兩個NameNode。在此之前要存在啟動的NameNode。

(Ⅲ)如果正在将非HA的NameNode轉換成HA,就執行指令

hdfs namenode -initializeShareEdits
           

上述指令将會将本地的NameNode編輯日志目錄資料初始化到JNs中。要求~/hadoop/dfs/name目錄不能鎖定(沒有in_use.lock檔案)。

(Ⅴ)啟動兩個NameNode

hadoop-daemon.sh start namenode
           

(Ⅵ) 通過Web UI檢視每個NameNode的狀态

比如:

http://node01:50070

http://node02:50070

管理HA過程

1. 手動完成狀态切換

繼續閱讀