1. Zookeeper介紹:
1.基本介紹:
Zookeeper: 為分布式應(yīng)用提供分布式協(xié)作(協(xié)調(diào))服務(wù)。使用類似文件系統(tǒng)的樹形結(jié)構(gòu)。目的是分布式服務(wù)不再需要由于協(xié)作沖突而另外實現(xiàn)協(xié)作服務(wù)。
一般情況下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集群。
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。
另外,在hadoop 2.x版本之前,沒有自帶HA功能,如果要實現(xiàn)此功能,可以使用Linux上的keepalived軟件進行熱備。
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只涉及到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:
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)容如下:
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/
我們可以上傳一個測試文件到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 HA 自動故障轉(zhuǎn)移,需要借助Zookeeper來完成。使用ZKFC組件來協(xié)助完成。
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)。
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):
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ī)劃安裝列表:
修改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í)行日志如下:
通過日志,可以看到,在rm1的resourcemanager進程殺掉后,自動切換到rm2,作業(yè)繼續(xù)執(zhí)行,最后執(zhí)行成功。