6. Zookeeper和 集群HA配置

1. Zookeeper介紹:

1.基本介紹:

Zookeeper: 為分布式應(yīng)用提供分布式協(xié)作(協(xié)調(diào))服務(wù)。使用類似文件系統(tǒng)的樹形結(jié)構(gòu)。目的是分布式服務(wù)不再需要由于協(xié)作沖突而另外實現(xiàn)協(xié)作服務(wù)。

Zookeeper's Hierarchical Namespace

一般情況下Zookeeper集群的服務(wù)器數(shù)量是奇數(shù)個,2N+1, N代表允許宕機的個數(shù),下面文章中介紹使用3臺主機進行實驗。

Zookeeper集群統(tǒng)一為其他分布式應(yīng)用(也是集群,例如HDFS集群、Yarn集群等等)集群提供協(xié)作服務(wù)。

2. Zookeeper角色。

Zookeeper角色不是手工配置的,而是集群自動選舉產(chǎn)生的:

(1)Leader:做決策(做什么決策跟Zookeeper實現(xiàn)的功能有關(guān)),更新系統(tǒng)狀態(tài)

(2)Follower:接入客戶端。接收客戶端請求,并返回響應(yīng)結(jié)果給客戶端。

(3)Observer:

(4)Client:使用協(xié)作服務(wù)的分布式應(yīng)用,例如HDFS集群。

Zookeeper Service

3.Zookeeper的典型應(yīng)用場景:

(1)統(tǒng)一命名服務(wù)(Name Service)

(2)配置管理(Configuration Management)

(3)集群管理(Group Membership)

(4)共享鎖(Locks)/ 同步鎖


2. Zookeeper集群環(huán)境搭建和啟動:

如果有單獨的集群規(guī)劃,可以在單獨的機器上安裝Zookeeper集群,我使用的是實驗虛擬機環(huán)境,就直接在hadoop-senior01、hadoop-senior02、hadoop-senior03安裝,與Hadoop共存,沒有問題。

1. 下載Zookeeper安裝包:

使用版本:zookeeper-3.4.5.tar.gz

(1)java環(huán)境安裝:

見前邊文章。

(2)上傳解壓安裝包:

$ tar -zxf zookeeper-3.4.5.tar.gz -C /opt/modules/

2. 配置Zookeeper:

(1)復(fù)制配置文件:

Zookeeper的主目錄的conf文件夾下,有一個實例的配置文件zoo_sample.cfg,我們復(fù)制一份出來:

$ cd /opt/modules/zookeeper-3.4.5/conf

$ cp -a zoo_sample.cfg zoo.cfg

$ vi zoo.cfg

$ mkdir data

下面通過編輯這個文件來完成Zookeeper的配置:

(2)配置數(shù)據(jù)存儲目錄:

按照開發(fā)規(guī)范,我們通常在zookeeper的安裝目錄下,新建一個目錄data,將這個目錄作為zookeeper的數(shù)據(jù)存儲目錄。

dataDir=/opt/modules/zookeeper-3.4.5/data

zoo.cfg重要參數(shù)介紹:

tickTime:zookeeper服務(wù)器與服務(wù)器之間,或者服務(wù)器與客戶端之間維持心跳的時間間隔。單位:毫秒。

clientPort:客戶端連接zookeeper服務(wù)器的端口。默認2181

dataDir:Zookeeper保存數(shù)據(jù)的目錄。

(3)在zoo.cfg中添加服務(wù)器信息:

格式: server.A=B:C:D ?。 在zoo.cfg中添加如下內(nèi)容:

server.1=192.168.8.128:2888:3888

server.2=192.168.8.129:2888:3888

server.3=192.168.8.130:2888:3888

(4)在每臺服務(wù)器的$ZOOKEEPER_HOME/data/目錄創(chuàng)建myid文件。

在hadoop-senior01服務(wù)器(192.168.8.128)上,cd 到$ZOOKEEPER_HOME/data/目錄,創(chuàng)建myid文件,myid文件的內(nèi)容是1

在hadoop-senior02服務(wù)器(192.168.8.129)上,cd 到$ZOOKEEPER_HOME/data/目錄,創(chuàng)建myid文件,myid文件的內(nèi)容是2

在hadoop-senior03服務(wù)器(192.168.8.130)上,cd 到$ZOOKEEPER_HOME/data/目錄,創(chuàng)建myid文件,myid文件的內(nèi)容是3

注意:myid文件在linux下用vi創(chuàng)建。

在一臺機器上配置好,拷貝到其他服務(wù)器:

$ scp -r zookeeper-3.4.5/ natty@hadoop-senior02.pmpa.com:/opt/modules/


3.啟動Zookeeper:

(1)啟動Zookeeper:

$ bin/zkServer.sh start

(2)查看狀態(tài)

$ bin/zkServer.sh status

$ jps

注意:啟動操作需要在三臺服務(wù)器上都執(zhí)行


3. Zookeeper基本命令介紹

使用命令,可以使用bin/zkCli.sh腳本

$ bin/zkCli.sh

在zkCli.sh進入命令行模式后,可以敲命令操作。使用help命令來查看可以使用的所有的命令。

[zk: localhost:2181(CONNECTED) 0] ls /

[zk: localhost:2181(CONNECTED) 1] help

[zk: localhost:2181(CONNECTED) 2] create /test pmpa_test

查看剛才創(chuàng)建的/test的信息:

[zk: localhost:2181(CONNECTED) 4] get /test


4. Namenode HA 介紹:

為了防止Namenode的單點故障,Hadoop 2.x版本增加了HA(High Available 高可用)功能。在下邊兩種情況下,需要配置HA:Namenode機器發(fā)生意外;Namenode機器需要升級。 HDFS HA通過配置Active/Standby 兩個Namenode實現(xiàn)在集群中對Namenode的熱備。下面實現(xiàn)配置:使用Quorum Journal Manager(QJM) 在Active Namenode和Standby Namenode來共享edit logs。

HDFS HA設(shè)計


另外,在hadoop 2.x版本之前,沒有自帶HA功能,如果要實現(xiàn)此功能,可以使用Linux上的keepalived軟件進行熱備。

HDFS HA設(shè)計


1. HDFS HA using QJM 架構(gòu):

在典型的HA集群中,Active Namenode響應(yīng)客戶端的操作請求,而Standby Namenode作為一個slave執(zhí)行,只是保持跟Active Namenode的狀態(tài)一致。Active namenode和Standby namenode為了保持一致,他們都與JournalNodes(JNs)進行通信。每當(dāng)Active node修改namespace時,都會將修改日志計入JNs中,Standby node從JNs讀取edit logs,并時刻監(jiān)控JNs(只要Edit Logs有改動就同步),因為Standy node在時刻監(jiān)控,就可以保證在故障轉(zhuǎn)移發(fā)生時,Standby node的edit Logs與Active node完全一致,從而直接切換成Active狀態(tài)。

為了實現(xiàn)快速故障轉(zhuǎn)移,Standby node必須清楚集群中數(shù)據(jù)塊的位置,為datanodes配置這2個Namenods(Active/Standby),并且datanodes同時向兩個namenodes發(fā)送塊信息和心跳。

在HDFS HA集群中,必須保證只有一個Active節(jié)點,否則會造成錯誤和混亂。


2. 硬件資源:

JournalNode daemon是輕量級的,可以和其他hadoop daemons(namenode,resourcemanager等)共同運行在一臺主機。JournalNode主機和Zookeeper主機很相似,必須要有奇數(shù)個(2N+1)主機(最少3個),其中N代表可以宕機的數(shù)量,如果宕機的數(shù)量超過了N,JournalNode集群就不可用了。

Standby namenode不可以代替Secondary Node的作用。


5. Namenode HA搭建配置和測試:

Namenode HA資源規(guī)劃設(shè)計:

Namenode HA資源配置


Namenode HA只涉及到HDFS角色,在hadoop-senior01.pmpa.com上安裝Namenode(Active),在hadoop-senior02.pmpa.com上安裝Namenode(Standby)。與yarn資源不沖突。

1. 先備份之前的hadoop安裝目錄:

先停掉hdfs 和 yarn(拷貝文件夾前最好先停掉應(yīng)用),在senior01上執(zhí)行,停掉hdfs:

$ sbin/stop-dfs.sh

在senior02上執(zhí)行,停掉yarn:

$ sbin/stop-yarn.sh

備份hadoop安裝目錄(Senior01):

$ cp -ra hadoop-2.5.0/ hadoop-2.5.0_bak

下面根據(jù)官方文檔來配置HDFS HA:

HDFS HA with QJM

2. Namenode HA配置:

(1)配置NN HA需要配置 hdfs-site.xml。

a). 配置一個服務(wù)組名稱,默認名字是mycluster(可任意修改), ?配置項:dfs.nameservices。

b). 配置JournalNodes,默認端口是8485,配置項:dfs.namenode.shared.edits.dir。設(shè)計圖中的 “SHARED EDITS”角色。

c). 配置JournalNodes的本地保存目錄,一般情況下會在$HADOOP_HOME/data下創(chuàng)建一個dn目錄指定之,當(dāng)然可以任意指定,配置項:dfs.journalnode.edits.dir

d). 配置代理Proxy,客戶端的訪問入口設(shè)置為代理,不再是之前的單獨namenode。配置項:dfs.client.failover.proxy.provider.mycluster。

e). 配置隔離,采用的sshfence,這一項為了保證兩臺namenode只有一臺是active狀態(tài),正常情況下只有一臺namenode對外提供服務(wù)。

(2)配置core-site.xml:

a). 配置hdfs的訪問入口:訪問入口需要修改成mycluster, 配置項:fs.defaultFS。

兩個配置文件內(nèi)容如下:

core-site.xml

hdfs-site.xml

3.同步配置:

(1)在senior02和senior03上創(chuàng)建 jn目錄(保存journal node文件):

$ mkdir jn

(2)上邊修改了core-site.xml 和 hdfs-site.xml,將這2個配置文件同步senior02和senior03。

$ scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml natty@hadoop-senior02.pmpa.com:/opt/modules/hadoop-2.5.0/etc/hadoop/

$ scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml natty@hadoop-senior03.pmpa.com:/opt/modules/hadoop-2.5.0/etc/hadoop/

4. HA with QJM 啟動:

(1)啟動 JournalNode,需要在三個節(jié)點上執(zhí)行:

$ sbin/hadoop-daemon.sh start journalnode

這時使用jps 可以看到 JournalNode 進程。

(2)在[nn1]上格式化,并啟動namenode:

$ bin/hdfs namenode -format

$ sbin/hadoop-daemon.sh start namenode

(3)在[nn2]上同步[nn1]的元數(shù)據(jù)信息:

$ bin/hdfs namenode --help

$ bin/hdfs namenode -bootstrapStandby

上邊要在nn2上執(zhí)行,nn2向nn1同步一次元數(shù)據(jù)信息。

(4)在[nn2]上啟動namenode:

$ sbin/hadoop-daemon.sh start namenode

(5)將[nn1]切換成Active:

$ bin/hdfs haadmin -transitionToActive nn1

(6)在[nn1]上啟動所有datanode:

$ sbin/hadoop-daemon.sh start datanode

(7)測試[nn1]和[nn2]的狀態(tài):

可以瀏覽器訪問namenode 50070端口,能夠發(fā)現(xiàn)一個是active,一個是standby的狀態(tài)。分別訪問:http://hadoop-senior01.pmpa.com:50070/ 和 http://hadoop-senior02.pmpa.com:50070/

nn1 ?Namnode ?-----Active


nn2 ?Namenode ?---- Standby


我們可以上傳一個測試文件到HDFS,在Active 節(jié)點中可以瀏覽到該文件,在Standby節(jié)點,提示“Operation category READ is not supported in state standby”。

下面把nn1 改成standby狀態(tài),再來查看這兩個頁面(手動切換Active/Standby)

$ bin/hdfs haadmin -transitionToStandby nn1

$ bin/hdfs haadmin -transitionToActive nn2


6. Namenode HA 實現(xiàn)自動故障轉(zhuǎn)移:

Namenode HA實現(xiàn)自動故障轉(zhuǎn)移:

Namenode實現(xiàn)自動故障轉(zhuǎn)移

Namenode HA 自動故障轉(zhuǎn)移,需要借助Zookeeper來完成。使用ZKFC組件來協(xié)助完成。

HDFS ?HA ?Using QJM

1. 配置自動故障轉(zhuǎn)移:

(1) 在hdfs-site.xml開啟自動故障轉(zhuǎn)移,配置項:dfs.ha.automatic-failover.enabled。

(2)在core-site.xml配置Zookeeper的HA,配置項:ha.zookeeper.quorum

(3)同步更改到其他服務(wù)器:

$ scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml natty@hadoop-senior02.pmpa.com:/opt/modules/hadoop-2.5.0/etc/hadoop/

$ scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml natty@hadoop-senior03.pmpa.com:/opt/modules/hadoop-2.5.0/etc/hadoop/


2. 啟動Zookeeper自動故障轉(zhuǎn)移:

(1)關(guān)閉hdfs:

$ sbin/stop-dfs.sh

(2)啟動zookeeper(每臺機器啟動):

$ bin/zkServer.sh start

(3)初始化HA在Zookeeper集群中的狀態(tài)(在其中一臺Namenode上運行):

$ bin/hdfs zkfc -formatZK

(4)啟動hdfs 服務(wù):

$ sbin/start-dfs.sh?

使用start-dfs.sh 啟動hdfs后,也會啟動zkfc。

可以直接在各個Namenode節(jié)點上啟動DFSZK Failover Controller ,通過jps可查看到DFSZKFailoverController進程。

通過sbin/hadoop-daemon.sh ,可以選擇在nn1 和nn2上哪個先啟動zkfc。在哪臺Namenode上先啟動,哪臺就是Active狀態(tài)(另外的就是Standby狀態(tài))。

$ sbin/hadoop-daemon.sh start zkfc


3. 測試Zookeeper 自動故障轉(zhuǎn)移:

啟動了HDFS之后,在瀏覽器訪問50070端口,確定senior02是Active狀態(tài)、Senior01是Standby狀態(tài)?,F(xiàn)在通過在nn2上殺掉Namenode進程(模仿Senior02故障,看看Senior01是否能夠自動切換到Active狀態(tài))。

$ jps

12017 DFSZKFailoverController

5675 QuorumPeerMain

11803 DataNode

11730 NameNode

11892 JournalNode

12119 Jps

$ kill -9 11730

在senior02上殺掉namenode進程后,可以在senior01的50070端口訪問,看到已經(jīng)切換到Active狀態(tài)。

Senior01 切換到Active狀態(tài)


7. ResourceManager HA 介紹:

1. RM HA介紹:

Resource Manager負責(zé)集群中資源跟蹤、分配和應(yīng)用的調(diào)度(例如作業(yè)調(diào)度)。在Hadoop 2.4版本之前,Yarn集群中的Resource Manager存在單點故障。RM HA添加了一組冗余的Active/Standby Resource Manager來防止單點故障。

2. Resource Manager HA架構(gòu):

RM HA Architecture

1. RM記錄的狀態(tài):

(1)Job任務(wù)的狀態(tài),

(2)資源狀態(tài),每個任務(wù)。

假如一個任務(wù)需要執(zhí)行一小時,Job在執(zhí)行到半小時的時候Resource Manager出錯,配置的RM HA應(yīng)該可以直接切換到Standby RM,并且這個任務(wù)應(yīng)該繼續(xù)執(zhí)行后半小時內(nèi)容,不應(yīng)該重新執(zhí)行,這樣會很耗時。

RM的狀態(tài)是記錄在Zookeeper中的。

2. Zookeeper作用

(1)監(jiān)控ResourceManager ;

(2)切換active/standy狀態(tài);

(3)保存狀態(tài):

? ? ? ? ? ? ? a) Job任務(wù)的狀態(tài)

? ? ? ? ? ? ? b) 資源的狀態(tài)


8. ResourceManager HA 搭建配置和測試:

1. 資源主機規(guī)劃:

下面是資源主機規(guī)劃安裝列表:

RM HA 資源規(guī)劃列表

修改mapred-site.xml來修改jobhisotry的配置節(jié)點(原來在senior03,現(xiàn)在切回到senior01)。

停掉jobhistoryserver:

$ sbin/mr-jobhistory-daemon.sh stop historyserver

2. RM HA配置:

需要修改配置文件yarn-site.xml:

可以按照官網(wǎng)的sample configuration 來進行配置,官網(wǎng)地址:?ResourceManagerHA

實現(xiàn)RM HA需要保證Resource Manager的自動重啟,所以還增加Resource Manager Restart的配置。在保存RM狀態(tài)時,有兩種方式,一個是保存在Zookeeper中(架構(gòu)圖中情況),一種是保存在HDFS中。 關(guān)于RM Restart的參考,官網(wǎng)地址:ResourceManagerRestart

保存到Zookeeper和hdfs的狀態(tài)的兩個類分別是:

org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore

org.apache.hadoop.yarn.server.resourcemanager.recovery.FileSystemRMStateStore

3. 配置同步,rm啟動

(1)同步配置:

同步配置到其他兩臺服務(wù)器,我修改了yarn-site.xml和mapred-site.xml:

$ scp etc/hadoop/yarn-site.xml etc/hadoop/mapred-site.xml natty@hadoop-senior02.pmpa.com:/opt/modules/hadoop-2.5.0/etc/hadoop/

$ scp etc/hadoop/yarn-site.xml etc/hadoop/mapred-site.xml natty@hadoop-senior03.pmpa.com:/opt/modules/hadoop-2.5.0/etc/hadoop/

(2)啟動rm1 和 rm2:

a) 在senior02上啟動 yarn:

$ sbin/start-yarn.sh

上邊操作會啟動senior02的resource manager和三臺服務(wù)器的node manager。

b) 在senior03上啟動resource manager:

$ sbin/yarn-daemon.sh start resourcemanager

c) 查看兩個Resource Manager 的狀態(tài):

查看rm1的狀態(tài)(active狀態(tài)):

$ bin/yarn rmadmin -getServiceState rm1

查看rm2的狀態(tài)(standby狀態(tài)):

$ bin/yarn rmadmin -getServiceState rm2

d) 啟動 jobhistoryserver:

$ sbin/mr-jobhistory-daemon.sh? start historyserver


4. 測試RM HA ,通過調(diào)度任務(wù)來測試:

調(diào)度一個wordcount任務(wù):

$ bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar wordcount /words.txt /output20

任務(wù)正常執(zhí)行完,現(xiàn)在rm1(Senior02)是active ?rm2(Senior03)是standby。

下面在任務(wù)執(zhí)行過程中(到map階段),我把senior02的resource manager進程kill掉,按照分析rm2應(yīng)該自動切換為active,并且繼續(xù)執(zhí)行任務(wù)。

在senior01上調(diào)度任務(wù),執(zhí)行日志如下:

RM HA 測試日志

通過日志,可以看到,在rm1的resourcemanager進程殺掉后,自動切換到rm2,作業(yè)繼續(xù)執(zhí)行,最后執(zhí)行成功。

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

推薦閱讀更多精彩內(nèi)容