1. 程式人生 > >三節點高可用叢集搭建——Hadoop-HA+zookeeper

三節點高可用叢集搭建——Hadoop-HA+zookeeper

 

說明:

1.在hadoop2.0中通常由兩個NameNode組成,一個處於active狀態,另一個處於standby狀態。Active NameNode對外提供服務,而Standby NameNode則不對外提供服務,僅同步active namenode的狀態,以便能夠在它失敗時快速進行切換。

hadoop2.0官方提供了兩種HDFS HA的解決方案,一種是NFS,另一種是QJM。這裡我們使用簡單的QJM。在該方案中,主備NameNode之間通過一組JournalNode同步元資料資訊,一條資料只要成功寫入多數JournalNode即認為寫入成功。通常配置奇數個JournalNode

這裡還配置了一個zookeeper叢集,用於ZKFC(DFSZKFailoverController)故障轉移,當Active NameNode掛掉了,會自動切換Standby NameNode為active狀態.

 

2.hadoop-2.2.0中依然存在一個問題,就是ResourceManager只有一個,存在單點故障,hadoop-2.6.4解決了這個問題,有兩個ResourceManager,一個是Active,一個是Standby,狀態由zookeeper進行協調

主機名

IP

安裝軟體

執行程序

master

192.168.8.101

jdk、hadoop、zookeeper

NameNode、DFSZKFailoverController(zkfc)

ResourceManager

DataNode、NodeManager

JournalNode、QuorumPeerMain

slave1

192.168.8.102

jdk、hadoop、zookeeper

NameNode、DFSZKFailoverController(zkfc)

ResourceManager

DataNode、NodeManager

JournalNode、QuorumPeerMain

slave2

192.168.8.103

jdk、hadoop、zookeeper

DataNode、NodeManager

JournalNode、QuorumPeerMain

  • Hadoop HA叢集搭建

    1. 前期準備

      1. 建立新的虛擬機器

      2. 配置虛擬機器

        • 配置網絡卡
        • 虛擬網路編輯器、本地網路配置器
        • 重啟網絡卡,ping內外網
        • CRT連線虛擬機器,修改編碼格式、字型、背景
        • 修改主機名
        • 配置對映(3臺節點)
        • 關閉防火牆
      3. 克隆虛擬機器

        • 克隆slave1,slave2
        • slave1,slave2 修改網絡卡(IP)
        • 重啟網絡卡,ping內外網
        • CRT連線虛擬機器,修改編碼格式、字型、背景
        • 修改主機名
        • 檢查對映(3臺節點)
        • 檢查防火牆
        • 上傳JDK、hadoop、zookeeper(主節點)

配置環境變數,重新整理(master、slave1、slave2都配置一下環境變數)

export JAVA_HOME=/opt/software/jdk1.8.0_162

export HADOOP_HOME=/opt/software/hadoop-2.7.3

export ZOOKEEPER_HOME=/opt/software/zookeeper-3.4.6

export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin

 

安裝zookeeper叢集

server.ID=host:port:port

ID就是myid檔案中配置的數字。下面會有介紹

第一個埠( port )是從( follower )機器連線到主( leader )機器的埠,

第二個埠是用來進行 leader 選舉的埠。

每臺機器使用三個埠,分別是: clientPort ,2181 ; port , 2888 ; port , 3888 。

配置檔案

cd /opt/software/zookeeper-3.4.6/conf/

cp zoo_sample.cfg zoo.cfg

vi zoo.cfg

dataDir=/opt/software/zookeeper-3.4.6/zkData

dataLogDir=/opt/software/zookeeper-3.4.6/logs

server.1=master:2888:3888

server.2=slave1:2888:3888

server.3=slave2:2888:3888

mkdir /opt/software/zookeeper-3.4.6/zkData

mkdir /opt/software/zookeeper-3.4.6/logs

echo 1 > /opt/software/zookeeper-3.4.6/zkData/my

  1. 拷貝檔案

    1. 拷貝jdk、zookeeper到slave1和slave2節點

scp -r jdk1.8.0_162/ slave1:$PWD

scp -r zookeeper-3.4.6/ slave1:$PWD

 

scp -r jdk1.8.0_162/ slave2:$PWD

scp -r zookeeper-3.4.6/ slave2:$PWD

 

        • 修改02和03節點的myid

slave1:echo 2 > /opt/software/zookeeper-3.4.6/zkData/myid

cat myid

slave2:echo 3 > /opt/software/zookeeper-3.4.6/zkData/myid

cat myid

 

    1. 安裝hadoop叢集

      1. 配置檔案

cd /opt/software/hadoop-2.7.3/etc/hadoop/

        • 修改JAVA_HOME 在hadoop-env.sh yarn-env.sh mapred-env.sh 中

export JAVA_HOME=/opt/software/jdk1.8.0_162


core-site.xml

        •  
<configuration>

<!-- 指定hdfs的nameservice為ns1 -->

<property>

<name>fs.defaultFS</name>

<value>hdfs://ns1/</value>

</property>

<!-- 指定hadoop臨時目錄 -->

<property>

<name>hadoop.tmp.dir</name>

<value>/opt/software/hadoop-2.7.3-HA/tmpData</value>

</property>



<!-- 指定zookeeper地址 -->

<property>

<name>ha.zookeeper.quorum</name>

<value>master:2181,slave1:2181,slave2:2181</value>

</property>

</configuration>

mkdir /opt/software/hadoop-2.7.3-HA/tmpData

        • hdfs-site.xml

<!--指定hdfs的nameservice為ns1,需要和core-site.xml中的保持一致 -->

<property>

<name>dfs.nameservices</name>

<value>ns1</value>

</property>

<!-- ns1下面有兩個NameNode,分別是nn1,nn2 -->

<property>

<name>dfs.ha.namenodes.ns1</name>

<value>nn1,nn2</value>

</property>


<!-- nn1的RPC通訊地址 -->

<property>

<name>dfs.namenode.rpc-address.ns1.nn1</name>

<value>master:9000</value>

</property>


<!-- nn1的http通訊地址 -->

<property>

<name>dfs.namenode.http-address.ns1.nn1</name>

<value>master:50070</value>

</property>



<!-- nn2的RPC通訊地址 -->

<property>

<name>dfs.namenode.rpc-address.ns1.nn2</name>

<value>slave1:9000</value>

</property>



<!-- nn2的http通訊地址 -->

<property>

<name>dfs.namenode.http-address.ns1.nn2</name>

<value>slave1:50070</value>

</property>

<!-- 指定NameNode的元資料在JournalNode上的存放位置 -->

<property>

<name>dfs.namenode.shared.edits.dir</name>

<value>qjournal://master:8485;slave1:8485;slave2:8485/ns1</value>

</property>



<!-- 指定JournalNode在本地磁碟存放資料的位置 -->

<property>

<name>dfs.journalnode.edits.dir</name>

<value>/root/hdpdata/journaldata</value>

</property>



<!-- 開啟NameNode失敗自動切換 -->

<property>

<name>dfs.ha.automatic-failover.enabled</name>

<value>true</value>

</property>


<!--zkfc 配置失敗自動切換實現方式-->

<property>

<name>dfs.client.failover.proxy.provider.ns1</name>

<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>

</property>



<!-- 配置隔離機制方法,多個機制用換行分割,即每個機制暫用一行-->

<property>

<name>dfs.ha.fencing.methods</name>

<value>sshfence

shell(/bin/true)

</value>

</property>



<!-- 使用sshfence隔離機制時需要ssh免登陸 -->

<property>

<name>dfs.ha.fencing.ssh.private-key-files</name>

<value>/root/.ssh/id_rsa</value>

</property>



<!-- 配置sshfence隔離機制超時時間 -->

<property>

<name>dfs.ha.fencing.ssh.connect-timeout</name>

<value>30000</value>

</property>



</configuration>

mkdir -p /root/hdpdata/journaldata

        • mapred-site.xml

<configuration>



<!-- 指定mr框架為yarn方式 -->

<property>

<name>mapreduce.framework.name</name>

<value>yarn</value>

</property>



</configuration>
        • yarn-site.xml

<configuration>

<!-- 開啟RM高可用 -->

<property>

<name>yarn.resourcemanager.ha.enabled</name>

<value>true</value>

</property>



<property>

<name>yarn.resourcemanager.ha.automatic-failover.enabled</name>

<value>true</value>

</property>



<!--  ha.id的配置,rm1和rm2不一樣,且其他slaves不用配 -->

<property>

<name>yarn.resourcemanager.ha.id</name>

<value>rm1</value>

</property>



<!-- 指定RM的cluster id -->

<property>

<name>yarn.resourcemanager.cluster-id</name>

<value>yrc</value>

</property>

<!-- 指定RM的名字 -->

<property>

<name>yarn.resourcemanager.ha.rm-ids</name>

<value>rm1,rm2</value>

</property>

<!-- 分別指定RM的地址 -->

<property>

<name>yarn.resourcemanager.hostname.rm1</name>

<value>master</value>

</property>

<property>

<name>yarn.resourcemanager.hostname.rm2</name>

<value>slave1</value>

</property>

<!-- 指定zk叢集地址 -->

<property>

<name>yarn.resourcemanager.zk-address</name>

<value>master:2181,slave1:2181,slave2:2181</value>

</property>

<property>

<name>yarn.nodemanager.aux-services</name>

<value>mapreduce_shuffle</value>

</property>

</configuration>

 

        • slaves

master

slave1

slave2

 

      1. 拷貝檔案到其他節點

        • 刪除hadoop目錄中share目錄下的doc文件

cd /opt/software/hadoop-2.7.3-HA/share/

rm -rf doc/

 

        • 設定免密

首先要配置master、slave1、slave2的免密碼登陸。

#在hadoop01上生產一對鑰匙:ssh-keygen -t rsa

#將公鑰拷貝到其他節點,包括自己

ssh-coyp-id master

ssh-coyp-id slave1

ssh-coyp-id slave2

 

#注意:兩個namenode之間要配置ssh免密碼登陸,別忘了配置slave1到master的免登陸

在slave1上生產一對鑰匙:

ssh-keygen -t rsa

        ssh-coyp-id -i slave1

        • 將配置好的hadoop拷貝到其他節點

scp -r hadoop-2.7.3-HA/ slave1:$PWD

scp -r hadoop-2.7.3-HA/ slave2:$PWD

        • 測試Hadoop是否安裝成功

[[email protected]]# hadoop version

[[email protected] opt]# hadoop version

[[email protected] opt]# hadoop version

顯示對用版本就成功了!

    1. 啟動叢集

       

使用date命令

date -s "2017-4-14 10:16:00"

在單點故障HDFS叢集的基礎上建立

分別在master、slave1、slave2上執行:zkServer.sh start

檢視各節點的狀態(一個leader,兩個follower):zkServer.sh status

分別在master、slave1、slave2上執行:hadoop-daemon.sh start journalnode

執行jps命令檢驗,master、slave1、slave2上多了JournalNode程序

在master上執行命令:hdfs namenode -format

格式化後會在根據core-site.xml中的hadoop.tmp.dir配置生成個檔案,這裡我配置的是/opt/software/hadoop-2.7.3-HA/tmpData,然後將/opt/software/hadoop-2.7.3-HA/tmpData/拷貝到slave1的/opt/software/hadoop-2.7.3-HA/tmpData下:scp -r dfs/ slave1:$PWD

master執行:hdfs zkfc -formatZK

master執行:start-dfs.sh

master執行:start-yarn.sh

在slave1上啟動resourcemanager: yarn-daemon.sh start resourcemanager

        • jps檢視程序

        • 檢視網頁

可以看到剛開始我們的HDFS上面是什麼都沒有的。

 

    1. 測試

        • 上傳檔案到HDFS

上傳一個檔案到hdfs:hadoop fs /root/wc.txt /

新建資料夾在hdfs上:

                開始上傳:

        • 驗證HA模式

到web頁面檢視檔案以及namenode狀態,然後kill掉為active的namenode,到另一個namenode頁面上檢視資料以及namenode狀態,當namenode狀態由standby變為active,也能檢視資料,則安裝叢集成功。

再次啟動被kill掉的namenode,到web頁面檢視,namenode狀態變為standby。

殺死namenode程序

Node1網頁無法連線

重啟namenode程序

殺死namenode上的ZKFC

Node1和node2切換主從關係

    1. 關閉叢集:

關閉Hadoop叢集stop-all.sh

關閉zookeeper叢集zkServer.sh stop

        • 二次啟動