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負責讀取。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL3lzRhpHdtNmdkhlWspkMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL5QDN2ITOzIjM5ATOwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
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