Hadoop(HA)集群+Zookeeper實(shí)現(xiàn)高可用集群

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
profile環(huán)境變量

編輯hadoop-2.6.5/etc/hadoop/hadoop-env.sh文件加入Java環(huán)境變量


Hadoop的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

啟動(dòng)zookeeper集群

以上已經(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ī)器上的密碼


要求你輸入slave1密碼

密碼輸入正確后你會(huì)看到以下界面,它說已經(jīng)添加了密鑰,它叫你嘗試登陸一下


叫你嘗試登陸一下slave1

添加其他的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

安裝fuser

同樣另外一臺(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)成功


查看journalnode是否啟動(dòng)成功

出現(xiàn)journalnode說明啟動(dòng)成功了。

2.格式化zookepper

命令: hdfs zkfc -formatZK

操作完畢出現(xiàn)以下內(nèi)容:


格式化zookepper

3.格式化hdfs

命令: hadoop namenode -format

操作完畢出現(xiàn)以下內(nèi)容:


格式化hdfs

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)以下信息:


NameNode的數(shù)據(jù)同步

啟動(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)成功了。


啟動(dòng)Hadoop集群

測(cè)試HA集群可用性

以上是master是active狀態(tài),我現(xiàn)在把它關(guān)閉,看看standby-master是否會(huì)自動(dòng)升級(jí)為active狀態(tài)。
關(guān)閉master:


關(guān)閉master

觀察standby-master:


觀察standby-master

可以看到standby-master已經(jīng)自動(dòng)升級(jí)為active狀態(tài)說明整個(gè)HA集群搭建完成了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。