在《hadoop2.0 QJM方式的HA的配置》一文中介紹了HA的配置,是通過手工進行主備切換的。本文在這基礎上,繼續介紹HA的主備自動切換(automatic failover)的配置。自動切換是通過配置zookeeper來實現的,關於zookeeper的安裝和配置,在這裏不做介紹了,大家可以參考網上的資料。
1 準備
假定已經有一個zookeeper的集羣,3臺機器如下:
zookeeper1
zookeeper2
zookeeper3
兩個namenode節點如下:
namenode1
namenode2
2 配置
只涉及到core-site.xml和hdfs-site.xml兩個配置文件,其他配置可以文件參考《hadoop2.0的安裝和基本配置》一文。
2.1 core-site.xml
需要增加ha.zookeeper.quorum參數,加上zookeeper的服務地址
完整配置如下:
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/home/tmp/hadoop2.0</value> </property> <property> <name>ha.zookeeper.quorum</name> <value>zookeeper1:2181,zookeeper2:2181,zookeeper3:2181</value> </property> </configuration>
2.2 hdfs-site.xml
<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/home/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/home/dfs/data</value> </property> <property> <name>dfs.permissions</name> <value>false</value> </property> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>namenode1:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>namenode2:8020</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>namenode1:50070</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>namenode2:50070</value> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://journalnode1:8485;journalnode2:8485;journalnode3:8485/mycluster</value> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/home/dfs/journal</value> </property> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <property> <name>dfs.ha.fencing.methods</name> <value>shell(/bin/true)</value> </property> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> </configuration>
dfs.ha.automatic-failover.enabled
需要設置爲true,啓動自動切換。
dfs.ha.fencing.methods
這裏我們把fencing方法設置爲shell,一是爲了方便測試,二是採用QJM方式的HA本身就有fencing功能,不需要用這個參數中的fencing功能,詳解請參考《hadoop2.0 QJM方式的HA的配置》一文。你用sshfence的方法也是可以的,不過要注意ssh連接的問題和一些權限的問題。
3 在zookeeper中初始化
$HADOOP_HOME/bin/hdfs zkfc -formatZK
運行這個命令後,會在zookeeper上創建一個/hadoop-ha/mycluster/的znode,用來存放automatic failover的數據。
4 啓動zkfc(zookeeper failover controller)
需要在namenode1和namenode2上都啓動zkfc daemon進程。
$HADOOP_HOME/sbin/hadoop-daemon.sh start zkfc
5 啓動HDFS
可以參考《hadoop2.2.0 的安裝和基本配置》和《hadoop2.0 QJM方式的HA的配置》這兩篇文章。
在兩個namenode都啓動之後,會發現,其中一個namenode會自動切換成active狀態,不需要手工切換。
6 測試
現在可以享受我們的勝利成果了。我們把active namenode停掉後,會看到standby namenode自動切換成active狀態了。
7 QJM方式HA automatic failover的結構圖
QJM方式HA的結構涉及到active namenode,standby namenode,journalnode,datanode,zookeeper,zkfc,client,這裏通過一個圖描述他們之間的關係。
8 實戰tips
zookeeper可以在hadoop集羣中選幾臺機器同時作爲zookeeper節點,給HA私用。
在實踐中建議採用手工切換的方式,這樣更可靠,也方便查找問題。
參考資料
http://hadoop.apache.org/docs/r2.2.0/hadoop-yarn/hadoop-yarn-site/HDFSHighAvailabilityWithQJM.html