本文搭建了一個由4個節(jié)點(diǎn)(node1、node2、node3、node4)構(gòu)成的Hadoop-ha&zk集群.
HDFS 2.0 HA
主備NameNode
解決單點(diǎn)故障
主NameNode對外提供服務(wù),備NameNode同步主NameNode元數(shù)據(jù),以待切換
所有DataNode同時向兩個NameNode匯報數(shù)據(jù)塊信息
兩種切換選擇
手動切換:通過命令實現(xiàn)主備之間的切換,可以用HDFS升級等場合
自動切換:基于Zookeeper實現(xiàn)
基于Zookeeper自動切換方案
ZooKeeper Failover Controller:監(jiān)控NameNode健康狀態(tài),
并向Zookeeper注冊NameNode
NameNode掛掉后,ZKFC為NameNode競爭鎖,獲得ZKFC 鎖的NameNode變?yōu)閍ctive
1、基礎(chǔ)集群的搭建
2、集群網(wǎng)絡(luò)配置
? ? 開啟虛擬機(jī),修改配置文件 輸入如下命令
ls? -l? /etc/sysconfig/network-scripts/ifcfg-ens33
vi /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=2fd4e3fc-509d-47b2-a833-e55f360a4661
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.4.110
NETMASK=255.255.255.0
GATEWAY=192.168.4.100
DNS1=8.8.8.8
DNS2=8.8.8.4
需要修改的地方有:
BOOTPROTO=static#dhcp改為static(修改)
ONBOOT=yes#開機(jī)啟用本配置,一般在最后一行(修改)
IPADDR=192.168.4.110 #靜態(tài)IP(增加)
GATEWAY=192.168.4.100 #默認(rèn)網(wǎng)關(guān),虛擬機(jī)安裝的話,通常是2,也就是VMnet8的網(wǎng)關(guān)設(shè)置(增加)
NETMASK=255.255.255.0#子網(wǎng)掩碼(增加)
#DNS1=8.8.8.8
重啟網(wǎng)卡
service network restart
3、集群SSH免密登陸設(shè)置
3.1 創(chuàng)建hadoop用戶
為三個節(jié)點(diǎn)分別創(chuàng)建相同的用戶hadoop,并在以后的操作均在此用戶下操作,操作如下:
#useradd -m hadoop
#passwd hadoop
為hadoop添加sudo權(quán)限,切換到root用戶
#visudo
在該行root ALL=(ALL) ALL下添加hadoop ALL=(ALL) ALL保存后退出,并切換回hadoop用戶
#su hadoop
注意事項:四個節(jié)點(diǎn)的用戶名必須相同,不然以后會對后面ssh及hadoop集群搭建產(chǎn)生巨大影響
3.2 hosts文件設(shè)置
為了不直接使用IP,可以通過設(shè)置hosts文件達(dá)到ssh ?node1這樣的的效果(四個節(jié)點(diǎn)設(shè)置相同)
$sudo vim /etc/hosts
在文件尾部添加如下行,保存后退出:
192.168.4.110 node1
192.168.4.120 node2
192.168.4.130 node3
192.168.4.140 node4
#127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1? ? ? ? localhost localhost.localdomain localhost6 localhost6.localdomain6
注意事項:不要在127.0.0.1后面添加主機(jī)名,如果加了master,會造成后面hadoop的一個很坑的問題,在slave節(jié)點(diǎn)應(yīng)該解析出masterIP的時候解析出127.0.0.1,造成hadoop搭建完全正確,但是系統(tǒng)顯示可用節(jié)點(diǎn)一直為0。
3.3 hostname修改
centos7默認(rèn)的hostname是localhost,為了方便將每個節(jié)點(diǎn)hostname分別修改為node1、node2、node3、node4(以下以node1節(jié)點(diǎn)為例)。
$sudo hostnamectl set-hostname node1
重啟terminal,然后查看:$hostname
3.3 ssh設(shè)置
設(shè)置node1節(jié)點(diǎn)和node2、node3、node4節(jié)點(diǎn)之間的雙向ssh免密通信,下面以node1節(jié)點(diǎn)ssh免密登陸其它節(jié)點(diǎn)設(shè)置為例,進(jìn)行ssh設(shè)置介紹(以下操作均在node1機(jī)器上操作):
[在node1節(jié)點(diǎn)設(shè)置完后,登錄node2、node3、node4節(jié)點(diǎn)分別進(jìn)行設(shè)置]
首先生成node1的rsa密鑰:$ssh-keygen -t rsa
設(shè)置全部采用默認(rèn)值進(jìn)行回車
將生成的rsa追加寫入授權(quán)文件:$cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
給授權(quán)文件權(quán)限:$chmod 600? ~/.ssh/authorized_keys
進(jìn)行本機(jī)ssh測試:$ssh node1正常免密登陸后所有的ssh第一次都需要密碼,此后都不需要密碼
將node1上的authorized_keys傳到node2
sudo scp ~/.ssh/id_rsa.pub hadoop@node2:~/
登陸到node2操作:$ssh node2輸入密碼登陸
$cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
修改authorized_keys權(quán)限:$chmod 600? ~/.ssh/authorized_keys
退出node2:$exit
進(jìn)行免密ssh登陸測試:$ssh node2
4、java安裝
目的:hadoop是基于Java的,所以要安裝配置Java環(huán)境(三個節(jié)點(diǎn)均需要操作,以下以node1節(jié)點(diǎn)為例)
下載并安裝:$sudo yum install java-1.8.0-openjdk? java-1.8.0-openjdk-devel
驗證是否安裝完成:$java -version
配置環(huán)境變量,修改~/.bashrc文件,添加行: export JAVA_HOME=/usr/lib/jvm/java-1.8.0
使環(huán)境變量生效:$source ~/.bashrc
5、Hadoop安裝配置
目的:獲得正確配置的完全分布式Hadoop集群(以下操作均在node1主機(jī)下操作)
安裝前 四臺節(jié)點(diǎn)都需要需要關(guān)閉防火墻和selinux
$sudo systemctl stop firewalld.service
$sudo systemctl disable firewalld.service
5.1 Hadoop安裝
首先在node1節(jié)點(diǎn)進(jìn)行hadoop安裝配置,之后使用scp傳到node2、node3、node4。
下載Hadoop二進(jìn)制源碼至node1,下載地址,并將其解壓在~/ 主目錄下
$tar -xvf ~/hadoop-2.5.2.tar -C ~/
$mv ~/hadoop-2.5.2/* ~/hadoop/
5.2 Hadoop的node節(jié)點(diǎn)配置
配置hadoop的配置文件core-site.xml hdfs-site.xml mapred-site.xml yarn-site.xml slaves(都在~/hadoop/etc/hadoop文件夾下)
$cd ~/hadoop/etc/hadoop
$vim core-site.xml其他文件相同,以下為配置文件內(nèi)容:
1.core-site.xml
<property>
? <name>fs.defaultFS</name>
? <value>hdfs://mycluster</value>
</property>
<property>
? <name>ha.zookeeper.quorum</name>
? <value>node1:2181,node2:2181,node3:2181</value>
</property>
2.hdfs-site.xml
<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>node1:8020</value>
</property>
<property>
? <name>dfs.namenode.rpc-address.mycluster.nn2</name>
? <value>node2:8020</value>
</property>
<property>
? <name>dfs.namenode.http-address.mycluster.nn1</name>
? <value>node1:50070</value>????
</property>
<property>
? <name>dfs.namenode.http-address.mycluster.nn2</name>
? <value>node2:50070</value>
</property>
<property>
? <name>dfs.namenode.shared.edits.dir</name>
? <value>qjournal://node1:8485;node2:8485;node3:8485/mycluster</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>sshfence</value>
</property>
<property>
? <name>dfs.ha.fencing.ssh.private-key-files</name>
? <value>~/.ssh/id_rsa</value>
</property>
<property>
? <name>dfs.ha.automatic-failover.enabled</name>
? <value>true</value>
</property>
5.3 Hadoop的其他節(jié)點(diǎn)配置
此步驟的所有操作仍然是在node1節(jié)點(diǎn)上操作,以node1節(jié)點(diǎn)在node2節(jié)點(diǎn)上配置為例
復(fù)制hadoop文件至node2:$scp -r ~/hadoop hadoop@slave2:~/
5.4 Hadoop環(huán)境變量配置
配置環(huán)境變量,修改~/.bashrc文件,添加行(每個節(jié)點(diǎn)都需要此步操作,以node1節(jié)點(diǎn)為例):
#hadoop environment vars
export HADOOP_HOME=/home/hadoop/hadoop
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
使環(huán)境變量生效:$source ~/.bashrc
6.0 Zookeeper安裝配置
配置環(huán)境變量,修改~/.bashrc文件,添加行(每個節(jié)點(diǎn)都需要此步操作,以node1節(jié)點(diǎn)為例):
zookeeper安裝目錄 ?/home/hadoop/zookeeper
修改conf/zoo.cfg
dataDir=/home/hadoop/zookeeper/zk
server.1=0.0.0.0:2888:3888 ?(注意:本機(jī)地址要配置成0.0.0.0,node2)
server.2=node3:2888:3888
server.3=node4:2888:3888
創(chuàng)建目錄: mkdir ?/home/hadoop/zookeeper/zk
創(chuàng)建文件: ?echo 1 >> myid ? ? //數(shù)字根據(jù)節(jié)點(diǎn)規(guī)劃 ,以node2為例
拷貝多臺節(jié)點(diǎn)
Scp –r 拷貝 目錄
修改myid
6.1 Zookeeper環(huán)境變量配置
export HADOOP_HOME=/home/hadoop/hadoop
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
export ZK_HOME=/home/hadoop/zookeeper
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$ZK_HOME/bin:$ZK_HOME/sbin
拷貝多臺節(jié)點(diǎn)
scp ~/.bashrc ?node2:~
scp ~/.bashrc node3:~
scp ~/.bashrc node4:~
使環(huán)境變量生效:$source ~/.bashrc
6.2 啟動Zookeeper集群(node2、node3、node4)
同時啟動三臺機(jī)器 :zkServer.sh start
查看zookeeper服務(wù):zkServer.sh status
從節(jié)點(diǎn)狀態(tài):ZooKeeper JMX enabled by default
Using config: /home/hadoop/zookeeper/bin/../conf/zoo.cfg
Mode: follower
主節(jié)點(diǎn)狀態(tài):ZooKeeper JMX enabled by default
Using config: /home/hadoop/zookeeper/bin/../conf/zoo.cfg
Mode: leader
6.3 啟動journalnode服務(wù)(node1、node2、node3)
? hadoop-daemon.sh start journalnode
成功啟動后:執(zhí)行jps命令查看服務(wù)
9565 JournalNode
8558 QuorumPeerMain
9599 Jps
注意:需要先啟動 journalnode服務(wù) 然后再進(jìn)行hadoop格式化
6.4 ?最后一步
配置文件:集群中要同步?。?!
啟動zookeeper集群
zkServer.sh start? ||? zkServer.sh status
hadoop-daemon.sh start journalnode ? [在node1、node2、node3上執(zhí)行]
第一臺NN:
hdfs namenode –format ?[在node1、node2上執(zhí)行]
hadoop-daemon.sh start namenode [在node1上執(zhí)行]
另一臺NN:
hdfs namenode –bootstrapStandby ?[在node上2執(zhí)行]
hadoop-daemon.sh start namenode ?[在node2上執(zhí)行]
stop-dfs.sh ??|| ? ?start-dfs.sh ? [在node1上重啟集群]
最后一步格式化zkfc
先在node2節(jié)點(diǎn)啟動? ? zkCli.sh
然后在node1節(jié)點(diǎn)格式化zkfc: ? ? hdfs ?zkfc ? –formatZK
在node2節(jié)點(diǎn)查看集群詳情: ls ?/
[zk: localhost:2181(CONNECTED) 0] ?ls /
[zookeeper, hadoop-ha]
[zk: localhost:2181(CONNECTED) 1] ls /hadoop-ha/mycluster
[ActiveBreadCrumb, ActiveStandbyElectorLock]
[zk: localhost:2181(CONNECTED) 2] get /hadoop-ha/mycluster
cZxid = 0x400000004
ctime = Sat Jul 13 09:02:24 EDT 2019
mZxid = 0x400000004
mtime = Sat Jul 13 09:02:24 EDT 2019
pZxid = 0x40000003d
cversion = 30
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 2
[zk: localhost:2181(CONNECTED) 3]
注意 :第二次以后啟動只需要
1.啟動zk
2.start-dfs.sh
Web瀏覽器查看集群管理界面
node1:50070
node2:50070
問題紀(jì)錄:
1.多次格式化集群會出現(xiàn)問題 ,解決辦法是手工將四個節(jié)點(diǎn)的name、data文件下文件清空
????/home/hadoop/hadoop/hdfs/ha/dfs/name/XXX
????/home/hadoop/hadoop/hdfs/ha/dfs/data/XXX
然后在node1、node2、node3啟動 ??hadoop-daemon.sh start journalnode
然后在node1、node2節(jié)點(diǎn)重新格式化namenode ? [hdfs namenode –format]
如果還有問題,刪除以下目錄緩存文件或者重啟四臺機(jī)器
/tmp/hadoop/dfs/journalnode/mycluster
如果以上辦法都不行則根據(jù)報錯信息收工修改
view /home/hadoop/hadoop/logs/hadoop-hadoop-namenode-node1.log
This node has namespaceId '1252632511 and clusterId 'CID-614ab438-d36e-4e37-8c20-a631ee8a1783' but the requesting node expected '276561900' and 'CID-8fd68be0-6c4d-4cde-a171-34397ce9cd83'
/tmp/hadoop/dfs/journalnode/mycluster/current/VERSION 中的?namespaceID、clusterID
#Sat Jul 13 08:22:37 EDT 2019
namespaceID=276561900
clusterID=CID-8fd68be0-6c4d-4cde-a171-34397ce9cd83
cTime=0
storageType=JOURNAL_NODE
layoutVersion=-57
~
~
2.配置zookeeper時出現(xiàn)問題 ,原因是zookeeper文件組權(quán)限及文件擁有者
sudo chmod -R ?777 ?/home/hadoop/zookeeper ? [改變文件權(quán)限]
sudo chown hadoop:hadoop ?/home/hadoop/zookeeper [改變文件擁有者]
3.在格式化node1節(jié)點(diǎn)zkfc時出現(xiàn)連接拒絕問題
?hdfs zkfc ?–formatZK
原因是需要先在node2、node3、node4節(jié)點(diǎn)啟動zk服務(wù)??zkServer.sh ?start,然后在node2節(jié)點(diǎn)運(yùn)行zkCli.sh,最后在node1節(jié)點(diǎn)格式化zkfc?
4. 啟動namenode 、datanode、或journalnode若有報錯
則到該目錄下查看相應(yīng)的錯誤日志?/home/hadoop/hadoop/logs
zookeeper錯誤日志 在當(dāng)前執(zhí)行zk命令的目錄下查看?zookeeper.out
5.ha環(huán)境配置好后,以后只需要啟動zk和start-dfs.sh服務(wù)即可
? ?在node2、node3、node4機(jī)器啟動zk服務(wù) ?[zkServer.sh start]
? ?在node1 機(jī)器啟動hdfs服務(wù) ?start-dfs.sh