Hadoop集群+Zookeeper實(shí)現(xiàn)高可用集群
設(shè)備的列表信息
節(jié)點(diǎn)類型 | IP | hosts(主機(jī)名) |
---|---|---|
NameNode | 192.168.56.106 | master |
NameNode | 192.168.56.107 | standby-master |
DataNode,JournalNode | 192.168.56.108 | slave1 |
DataNode,JournalNode | 192.168.56.109 | slave2 |
DataNode,JournalNode | 192.168.56.110 | slave3 |
一共配備的5臺(tái)的設(shè)備,master充當(dāng)(active)角色,standby-master充當(dāng)(standby)角色,當(dāng)master出現(xiàn)單點(diǎn)故障的時(shí)候,standby-master就會(huì)頂上去充當(dāng)(active)角色來維持整個(gè)集群的運(yùn)作。
搭建Ha集群依賴環(huán)境
環(huán)境名稱 | 版本號(hào) |
---|---|
CentOS | 7 |
Jdk | jdk-8u131 |
Hadoop | 2.6.5 |
zookeeper | 3.4.10 |
把jdk、Hadoop、zookeeper解壓到/use/local/目錄下
編輯 /etc/profile文件分別加入jdk、Hadoop的環(huán)境變量
vim /etc/profile
加入以下環(huán)境變量:
JAVA_HOME=/usr/local/jdk1.8.0_131/
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME
export PATH
export CLASSPATH
export PATH=$PATH:/usr/local/hadoop-2.6.5/bin:/usr/local/hadoop-2.6.5/sbin
編輯hadoop-2.6.5/etc/hadoop/hadoop-env.sh文件加入Java環(huán)境變量
這是我本次搭建用到的系統(tǒng)版本。
配備zookeeper集群
我會(huì)在slave1、slave2、slave3這三臺(tái)機(jī)器上添zookeeper集群,把JournalNode節(jié)點(diǎn)交給zookeeper做調(diào)度。
解壓后進(jìn)入/zookeeper-3.4.10/conf/目錄
拷貝 cp zoo_sample.cfg 改名成 zoo.cfg
拷貝 cp zoo_sample.cfg zoo.cfg
在zoo.cfg文件添加以下配置:
dataDir=/home/zookeeper/data
dataLogDir=/home/zookeeper/logs
clientPort=2181
server.1=slave1:2888:3888
server.2=slave2:2888:3888
server.3=slave3:2888:3888
配置myid:
我這里有3臺(tái)zk集群機(jī)器,每臺(tái)機(jī)器都需要在/home/zookeeper/data 目錄下創(chuàng)建一個(gè)myid的文件、并且要寫上自己對(duì)應(yīng)的服務(wù)id號(hào),比如我在slave1這臺(tái)機(jī)器對(duì)應(yīng)的service.id是1 那么我在myid就會(huì)寫上1,slave2的service.id是2 就會(huì)寫上2.. 以此類推。
cd /home/zookeeper/data/
vim myid (寫上服務(wù)的id號(hào)保存退出)
編寫開機(jī)啟動(dòng)腳本(為了方便啟動(dòng),不用每次手動(dòng)啟動(dòng)zk集群,如果覺得麻煩可以忽略該步驟)
寫了一個(gè)腳本設(shè)置zookepper開機(jī)啟動(dòng)
在/etc/rc.d/init.d/目錄下添加一個(gè)文件叫zookeeper
命令:touch zookeeper
寫入以下配置,JAVA_HOME是你jdk的安裝位置,ZOO_LOG_DIR是zookeeper存放日志的位置,ZOOKEEPER_HOME是zookeeper的安裝位置。
#!/bin/bash
#chkconfig: 2345 10 90
#description: service zookeeper
export JAVA_HOME=/usr/local/jdk1.8.0_131
export ZOO_LOG_DIR=/home/zookeeper/datalog
ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.10
su root ${ZOOKEEPER_HOME}/bin/zkServer.sh "$1"
為新建的zookeeper文件添加可執(zhí)行權(quán)限
命令:chmod +x /etc/rc.d/init.d/zookeeper
添加zookeeper到開機(jī)啟動(dòng)
命令:chkconfig --add zookeeper
重啟你的的zk集群
檢查你的zookeeper集群確保沒問題
命令:/usr/local/zookeeper-3.4.10/bin/zkServer.sh status
以上已經(jīng)配置好zookeeper集群
設(shè)置SSH免密登陸
兩臺(tái)NameNode之間的協(xié)調(diào)需要SSH登陸來實(shí)現(xiàn),所以兩臺(tái)NameNode必須要配置好
進(jìn)入master這臺(tái)機(jī)器的的根目錄
輸入命令:ssh-keygen -t rsa
出現(xiàn)提示可以不理會(huì) 直接按幾次回車鍵就行了,出現(xiàn)以下界面說明生成私鑰id_rsa和公鑰id_rsa.pub
把生成的公鑰id發(fā)送到 slave1、slave2、slave3、機(jī)器上
輸入命令: ssh-copy-id slave1
slave1會(huì)要求你輸入slave1這臺(tái)機(jī)器上的密碼
密碼輸入正確后你會(huì)看到以下界面,它說已經(jīng)添加了密鑰,它叫你嘗試登陸一下
添加其他的slave2、slave3、slave4、standby-master、master也是同樣的操作。(一共5臺(tái)機(jī)器,包括目前本機(jī))
在master完成以上操作之后,再到standby-master 重復(fù)以上的操作。(記得兩個(gè)NameNode都要進(jìn)行操作,重要的事再說一遍)。
配置Hadoop集群
配置core-site.xml
在core-site.xml加入以下配置
master是整個(gè)服務(wù)的標(biāo)識(shí)、以及配備了zookeeper的配置信息
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoopData/hdfs/temp</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
<!--zookeeper配置-->
<property>
<name>ha.zookeeper.quorum</name>
<value>slave1:2181,slave2:2181,slave3:2181</value>
</property>
</configuration>
配置hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoopData/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoopData/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.permissions.superusergroup</name>
<value>staff</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<!-- NanmeNode主備切換核心配置 -->
<property>
<name>dfs.nameservices</name>
<value>master</value>
</property>
<property>
<name>dfs.ha.namenodes.master</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.master.nn1</name>
<value>master:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.master.nn1</name>
<value>master:50070</value>
</property>
<property>
<name>dfs.namenode.rpc-address.master.nn2</name>
<value>standby-master:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.master.nn2</name>
<value>standby-master:50070</value>
</property>
<!-- 指定NameNode的元數(shù)據(jù)在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://slave1:8485;slave2:8485;slave3:8485/master</value>
</property>
<!-- 指定JournalNode在本地磁盤存放數(shù)據(jù)的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoopData/journal</value>
</property>
<!-- 開啟NameNode故障時(shí)自動(dòng)切換 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.master</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!--ssh免登陸 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
注意事項(xiàng):
我這里一共拆分了3部分來說明、以上的配置的文件分別有備注說明
在dfs.nameservices標(biāo)簽中的value 和core-site.xml配置中的服務(wù)名要一致,因?yàn)槲移鹈衜aster,所以我這里也叫master。
dfs.namenode.shared.edits.dir標(biāo)簽中存放的是你的zk集群的journalnode,后面記得加上你的服務(wù)名。
把這2份配置文件分別拷貝到5臺(tái)機(jī)器上。
安裝fuser
在你的兩臺(tái)NameNode都需要安裝fuser
進(jìn)入你的 .ssh目錄(我的目錄是/root/.ssh)
安裝命令: yum provides "*/fuser"
安裝命令:yum -y install psmisc
同樣另外一臺(tái)standby-master同樣的操作。
啟動(dòng)Hadoop集群
在master上的操作
1.啟動(dòng)journalnode
命令:hadoop-daemon.sh start journalnode
因?yàn)槲以趍aster中配了slaves這個(gè)文件,把slave1、slave2、slave3都加了進(jìn)來所以可以啟動(dòng)它們,查看DataNode節(jié)點(diǎn)上的journalnode是否啟動(dòng)成功
出現(xiàn)journalnode說明啟動(dòng)成功了。
2.格式化zookepper
命令: hdfs zkfc -formatZK
操作完畢出現(xiàn)以下內(nèi)容:
3.格式化hdfs
命令: hadoop namenode -format
操作完畢出現(xiàn)以下內(nèi)容:
4.啟動(dòng)master的NameNode
命令: hadoop-daemon.sh start namenode
啟動(dòng)完畢后切換到standby-master操作
在standby-master操作
在master的NameNode啟動(dòng)之后,我們進(jìn)行對(duì)NameNode的數(shù)據(jù)同步
在standby-master輸入以下命令
命令:hdfs namenode -bootstrapStandby
出現(xiàn)以下信息:
啟動(dòng)Hadoop集群
回到master啟動(dòng)集群輸入以下命令
命令: start-dfs.sh
在游覽器輸入 http://192.168.56.106:50070/ 和 http://192.168.56.107:50070/
出現(xiàn)以下情況說明已經(jīng)成功了。
測(cè)試HA集群可用性
以上是master是active狀態(tài),我現(xiàn)在把它關(guān)閉,看看standby-master是否會(huì)自動(dòng)升級(jí)為active狀態(tài)。
關(guān)閉master:
觀察standby-master:
可以看到standby-master已經(jīng)自動(dòng)升級(jí)為active狀態(tài)說明整個(gè)HA集群搭建完成了。