上次記錄了hadoop完全分布式搭建(非高可用),這次來學習hadoop HA 搭建。
一、原理機制
主備NameNode
解決單點故障(屬性,位置)
- 主NameNode對外提供服務,備NameNode同步主NameNode元數據,以待切換
- 所有DataNode同時向兩個NameNode匯報數據塊信息(位置)
- JNN:集群(屬性)
- standby:備,完成了edits.log文件的合並產生新的image,推送回ANN
兩種切換選擇
- 手動切換:通過命令實現主備之間的切換,可以用HDFS升級等場合
- 自動切換:基於Zookeeper實現
基於Zookeeper自動切換方案
- ZooKeeper Failover Controller:監控NameNode健康狀態,
- 並向Zookeeper注冊NameNode
- NameNode掛掉后,ZKFC為NameNode競爭鎖,獲得ZKFC 鎖的NameNode變為active
二、步驟
集群規划
NN-1 | NN-2 | DN | ZK | ZKFC | JNN | |
---|---|---|---|---|---|---|
node01 | * | * | * | |||
node02 | * | * | * | * | * | |
node03 | * | * | * | |||
node04 | * | * |
1.修改hadoop.ev.sh文件
(hadoop3.x中要求指定用戶進程)
export HDFS_ZKFC_USER=root
export HDFS_JOURNALNODE_USER=root
2.配置hdfs-site.xml
(這里配置有點多,查看官方文檔介紹:hadoop-3.2.0 doc HDFSHighAvailabilityWithQJM )
dfs.nameservices - the logical name for this new nameservice
(名稱服務,只是一個邏輯名稱邏輯名稱)
<!--為這個nameservice選擇一個邏輯名稱,例如“mycluster”,並為這個配置選項的值使用這個邏輯名稱。您選擇的名稱是任意的。它將用於配置並作為集群中絕對HDFS路徑的權威組件。-->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
dfs.ha.namenodes.[nameservice ID] - unique identifiers for each NameNode in the nameservice
(名稱服務中每個NameNode的惟一標識符)
<!--使用逗號分隔的NameNode id列表進行配置。datanode將使用它來確定集群中的所有namenode。例如,本文使用“mycluster”作為nameservice ID,並且我們集群規划使用“node01”、“node02”作為namenode的單獨ID,可以這樣配置:-->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>node01,node02</value>
</property>
<!--官網建議:HA的最小namenode數量是兩個,但是您可以配置更多。由於通信開銷,建議不超過5個(建議使用3個namenode)-->
dfs.namenode.rpc-address.[nameservice ID].[name node ID] - the fully-qualified RPC address for each NameNode to listen on
(namenode的rpc服務器的監聽地址)
<property>
<name>dfs.namenode.rpc-address.mycluster.node01</name>
<value>node01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.node02</name>
<value>node02:8020</value>
</property>
dfs.namenode.http-address.[nameservice ID].[name node ID] - the fully-qualified HTTP address for each NameNode to listen on
(namenode的HTTP服務器的監聽地址,與rpc同理只不過端口變為9870)
<property>
<name>dfs.namenode.http-address.mycluster.node01</name>
<value>node01:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.node02</name>
<value>node02:9870</value>
</property>
dfs.namenode.shared.edits.dir - the URI which identifies the group of JNs where the NameNodes will write/read edits
(配置JournalNodes 集群的URI)
<!--這是配置提供共享編輯存儲的journalnode地址的地方,這些地址由活動nameNode寫入,由備用nameNode讀取,以便與活動nameNode所做的所有文件系統更改保持最新。雖然必須指定幾個JournalNode地址,但是應該只配置其中一個uri。URI的形式應該是:qjournal://*host1:port1*;*host2:port2*;*host3:port3*/*journalId*。日志ID是這個名稱服務的惟一標識符,它允許一組日志節點為多個聯合名稱系統提供存儲-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
</property>
dfs.client.failover.proxy.provider.[nameservice ID] - the Java class that HDFS clients use to contact the Active NameNode
(配置故障轉移代理類)
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
dfs.ha.fencing.methods - a list of scripts or Java classes which will be used to fence the Active NameNode during a failover
(隔離方法;確保當前時間點只有一個namenode處於active狀態,jurnalnode只允許1個namenode來讀寫數據,但是也會出現意外的情況,因此需要控制對方機器,進行將自我提升[active],將對方降級[standby])
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
dfs.journalnode.edits.dir - the path where the JournalNode daemon will store its local state
(journalnode日志存放路徑)
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/tmp/hadoop/journalnode/data</value>
</property>
3.core-site.xml
(注意更改下 hadoop.tmp.dir
的路徑,與node的名稱【類似一個域名多ip】)
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/tmp/hadoop/ha</value>
</property>
</configuration>
4.自動故障轉移配置【zk】
再次回到hdfs-site.xml文件與core-site.xml配置中:
打開自動故障轉移:
The configuration of automatic failover requires the addition of two new parameters to your configuration. In your hdfs-site.xml
file, add:
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
添加zookeeper的地址:
This specifies that the cluster should be set up for automatic failover. In your core-site.xml
file, add:
<property>
<name>ha.zookeeper.quorum</name>
<value>node02:2181,node03:2181,node04:2181</value>
</property>
5.分發配置到其他節點
注意workes也要配置
scp -r hadoop-env.sh core-site.xml hdfs-site.xml node04:`pwd`
6.安裝Zookeeper及配置
安裝:略
配置zoo.cfg:
dataDir=/opt/tmp/zookeeper
server.1=192.168.121.102:2888:3888
server.2=192.168.121.103:2888:3888
server.3=192.168.121.104:2888:3888
創建myid【1 2 3同理】:
mkdir /opt/tmp/zookeeper
echo 1 > /opt/tmp/zookeeper/myid
7.啟動Hadoop HA
-
啟動zookeeper集群
zkServer.sh start
-
啟動jurnalnode集群
hadoop-daemon.sh start journalnode 或者 hdfs --daemon start journalnode
-
啟動第一台namenode
hdfs namenode -format hadoop-deamon.sh start namenode 或者 hdfs --daemon start namenode
-
剩余namenode啟動做備
hdfs namenode -bootstrapStandby
-
啟動datanode等節點
start-dfs.sh
-
Initializing HA state in ZooKeeper(在ZooKeeper中初始化HA狀態)
hdfs zkfc -formatZK
三、測試
訪問node01:9870: Overview 'node02:8020' (active)
訪問node02:9870: Overview 'node02:8020' (standby)
1.namenode掛掉的情況
hadoop-daemon.sh stop namenode 或者
hdfs --daemon stop namenode
2.ZKFC掛掉的情況
hadoop-daemon.sh stop zkfc 或者
hdfs --daemon stop zkfc