該ha搭建是在hadoop全分佈式基礎上搭建,關於hadoop全分佈式搭建可以參考另一篇hadoop3分佈式環境基礎搭建。
目錄
一、高可用簡介
多個namenode,增加namenode增加可用性。
ha角色分配如下
NN:namenode; DN:datanode;
ZK:zookeeper; ZKFC:ZookeeperFailoverController;
JNN:journalnode;
二、配置hadoop
說明:使用時請將#開頭的註釋刪除,因爲有的配置文件的註釋不爲#!
注意:ha高可用搭建是在全分佈式基礎上搭建的,基本相似,本節只列舉了配置中不同的地方。關於全分佈式搭建請看這裏hadoop3分佈式環境基礎搭建。
配置hadoop環境變量
vi /myapp/hadoop-3.1.2/etc/hadoop/hadoop-env.sh
在最後一行添加如下內容(JAVA_HOME根據實際JAVA安裝路徑決定):
export JAVA_HOME=/export/servers/jdk # JAVA_HOME路徑,可用echo $JAVA_HOME獲得
export HDFS_NAMENODE_USER=root # 爲hadoop配置三個角色的用戶
export HDFS_DATENODE_USER=root
# export HDFS_SECONDARYNAMEDODE_USER=root
export HDFS_ZKFC_USER=root
export HDFS_JOURNALNODE_USER=root
配置副本放置策略
vi /myapp/hadoop-3.1.2/etc/hadoop/hdfs-site.xml
hdfs-site.xml中configuration標籤內容修改如下:
<configuration>
<!-- 配置放置的副本數(存於datanode中,且不會在同一機器上) -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- 配置本機的邏輯名稱,指向實際namenode節點(因爲有多個namenode) -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 配置‘mycluster’的namenode,nn1,nn2,nn3爲namenode名 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2,nn3</value>
</property>
<!-- 對應上面兩個namenode(nn1,nn2)配置 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>node01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>node02:8020</value>
</property>
<!-- nn1,nn2的http協議配置(上面兩個) -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>node01:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>node02:9870</value>
</property>
<!-- journalnode配置,有三個分別是node01,node02,node03(由第一節架構圖可知) -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
</property>
<!-- 配置故障轉移代理,直接複製官網上的,不需要改變 -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 由於namenode之間的切換需要操縱遠程電腦,所以配置私有免祕鑰訪問 -->
<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>
<!-- 配置journalnode的日誌所在路徑,在此配置與hadoop配置目錄(/myapp/hadoop-3.1.2/ha_temp/)下 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/myapp/hadoop-3.1.2/ha_temp/journalnode</value>
</property>
<!-- 配置故障轉移 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
配置主節點
vi /myapp/hadoop-3.1.2/etc/hadoop/core-site.xml
core-site.xml中configuration標籤內容修改如下:
<configuration>
<!-- 配置的主節點namenode,由於有多個,所以爲namenode服務的名稱 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- 自定義hadoop的臨時目錄,不修改爲系統臨時目錄,容易丟失,比較危險 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/myapp/hadoop-3.1.2/ha_temp</value>
</property>
<!-- 配置zookeeper集羣,由第一節架構圖可知有三個node02,node03,node04 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>node02:2181,node03:2181,node04:2181</value>
</property>
</configuration>
將配置分發到其他節點
scp core-site.xml hdfs-site.xml hadoop-env.sh root@node02:/myapp/hadoop-3.1.2/etc/hadoop/
scp core-site.xml hdfs-site.xml hadoop-env.sh root@node03:/myapp/hadoop-3.1.2/etc/hadoop/
scp core-site.xml hdfs-site.xml hadoop-env.sh root@node04:/myapp/hadoop-3.1.2/etc/hadoop/
配置從節點
參考全分佈式。
三、zookeeper安裝及配置
zookeeper要安裝到node02、node03、node04上。
採取策略:現在node02上安裝配置好,然後分發到node03、node04上去。
解壓
tar -xzvf zookeeper-3.4.6.tar.gz -C /myapp/
配置zookeeper環境變量(node02、node03、node04都要做這步)
vi /etc/profile,在末尾添加:
#set zookeeper env
export ZOOKEEPER_HOME=/myapp/zookeeper-3.4.6
export PATH=${ZOOKEEPER_HOME}/bin:$PATH
重新加載環境變量
source /etc/profile
配置zookeeper
1)修改zoo.cfg
將conf目錄中zoo_sample.cfg重命名爲zoo.cfg,不做這一步可能無法正常啓動,命令如下:
mv /myapp/zookeeper-3.4.6/conf/zoo_sample.cfg /myapp/zookeeper-3.4.6/conf/zoo_.cfg
用 vi zoo.cfg 命令修改zoo.cfg文件
將dataDir改爲如下,dataDir爲zookeeper的臨時目錄,默認放在系統臨時目錄/tmp下,容易丟失
dataDir=/myapp/zookeeper-3.4.6/temp
添加如下內容到zoo.cfg末尾,即將zookeeper集羣中的所有節點配置,對應關係很重要,配置後不要修改
server.1=node02:2888:3888
server.2=node03:2888:3888
server.3=node04:2888:3888
2)將zoo.cfg分發到node03、node04
在hadoop安裝目錄的上級目錄執行下面命令
scp -r zookeeper-3.4.6 root@node03:/myapp/
scp -r zookeeper-3.4.6 root@node04:/myapp/
3)對zookeeper的每臺機器配置編號(node02、node03、node04)
創建zookeeper的臨時目錄,即zoo.cfg中dataDir指定的那個目錄
mkdir -p /myapp/zookeeper-3.4.6/temp
在臨時目錄中創建編號文件,並對應zoo.cfg中配置的編號寫入文件
echo 1 > /myapp/zookeeper-3.4.6/temp/myid # node02中
echo 2 > /myapp/zookeeper-3.4.6/temp/myid # node03中
echo 3 > /myapp/zookeeper-3.4.6/temp/myid # node04中
運行zookeeper(node02、node03、node04)
用下面命令啓動
zkServer.sh start
查看狀態
zkServer.sh status
顯示中若爲Mode: leader則該節點爲主節點,若爲Mode: follower則該節點爲從節點。
啓動zookeeper客戶端
zkCli.sh
停止zookeeper
zkServer.sh stop
注意:zookeeper集羣只有啓動過半節點狀態才爲啓動成功,例如3臺集羣啓動2臺以上,5臺集羣啓動3臺以上。
四、namenode節點信息同步
node01和node02爲namenode,所以這兩個節點的信息應該一致。
啓動journalnode(node01、node02、node03,由第一節架構圖可知)
hdfs --daemon start journalnode
格式化namenode(node01)
hdfs namenode -format
啓動namenode(node01上的)
hdfs --daemon start namenode
在node02上輸入以下命令將node01的信息同步到node02
hdfs namenode -bootstrapStandby
同步成功後會在/myapp/hadoop-3.1.2/etc/ha_temp/dfs/name/current中有文件。
五、zookeeper格式化、ha啓動及測試
格式化zookeeper(node01中)
hdfs zkfc -formatZK
格式化成功後使用“zkCli.sh”進入zookeeper,再使用“ls /”可以看到生成了/hadoop-ha/mycluster目錄,裏面存放有namenode。
啓動ha(node01中)
start-dfs.sh
啓動後,用jps查看每臺機器運行的進程,與第一節圖中的一致。
測試
在windows瀏覽器中輸入“192.168.182.140:9870”可以看到node01爲activate狀態,在瀏覽器中輸入“192.168.182.141:9870”可以看到node02爲standby狀態。
在node01上用以下命令關閉namenode
hdfs --daemon stop namenode
在瀏覽器中刷新node02,可以看到狀態從standby變爲activate,實現了namenode自動切換。