HA集群搭建文檔.................................................................................................. 2
1.2 高可用(HA)hadoop集群介紹..................................................................... 2
HA集群搭建文檔
詳細記錄在本地Vmware虛擬機中搭建五節(jié)點的Hadoop HA集群過程
[if !supportLists]1改览、[endif]概述
1.1 安裝環(huán)境
本機系統(tǒng):win10 16GB內(nèi)存
虛擬機系統(tǒng):CentOS6.8 64位
虛擬機軟件:VMWare14.1.1
JDK版本:JDK1.8.0.92
Hadoop版本:2.6.5
Zookeeper版本:3.4.10
1.2 高可用(HA)hadoop集群介紹
1)HDFS高可用
在 Hadoop 2.0之前,在HDFS 集群中NameNode 存在單點故障 (SPOF:A Single Point of Failure)。對于只有一個 NameNode 的集群虐拓,如果NameNode 機器出現(xiàn)故障(比如宕機或是軟件、硬件升級),那么整個集群將無法使用碍拆,直到 NameNode 重新啟動。HDFS 的 HA 功能通過配置 Active/Standby 兩個 NameNodes 實現(xiàn)在集群中對 NameNode 的熱備來解決上述問題慨蓝。如果出現(xiàn)故障感混,如機器崩潰或機器需要升級維護,這時可通過此種方式將 NameNode 很快的切換到另外一臺機器礼烈。????
在一個典型的 HDFS(HA) 集群中弧满,使用兩臺單獨的機器配置為 NameNodes 。在任何時間點此熬,確保 NameNodes 中只有一個處于 Active 狀態(tài)庭呜,其他的處在 Standby 狀態(tài)。其中ActiveNameNode 負責集群中的所有客戶端操作犀忱,StandbyNameNode 僅僅充當備機募谎,保證一旦 ActiveNameNode 出現(xiàn)問題能夠快速切換。為了能夠?qū)崟r同步 Active 和 Standby 兩個NameNode 的元數(shù)據(jù)信息(實際上 editlog)阴汇,需提供一個共享存儲系統(tǒng)数冬,可以是 NFS、QJM(Quorum Journal Manager)或者 Zookeeper鲫寄,Active Namenode 將數(shù)據(jù)寫入共享存儲系統(tǒng)吉执,而 Standby 監(jiān)聽該系統(tǒng),一旦發(fā)現(xiàn)有新數(shù)據(jù)寫入地来,則讀取這些數(shù)據(jù)戳玫,并加載到自己內(nèi)存中,以保證自己內(nèi)存狀態(tài)與 Active NameNode 保持基本一致未斑,如此這般咕宿,在緊急情況下 standby 便可快速切為 active namenode。HDFS NameNode 的高可用整體架構(gòu)如下圖所示:[if !vml]
[endif]
2)YARN高可用
對于ResourceManger也存在單點故障問題蜡秽,ResourceManager(RM)負責跟蹤群集中的資源府阀,并調(diào)度應用程序(例如MapReduce作業(yè))。在Hadoop 2.4之前芽突,ResourceManager是YARN集群中的單點故障试浙。高可用性功能以活動/待機資源管理器對的形式添加冗余,以消除此單一故障點寞蚌。
ResourceManger高可用架構(gòu)圖如下:
[if !vml]
[endif]
1.3 集群規(guī)劃
這里是一個五節(jié)點的Hadoop HA集群田巴,集群規(guī)劃如下:
節(jié)點(IP)角色
Hadoop01(192.168.1.11)namenode,datanode,nodemanager,zookeeper, journalnode
Hadoop02(192.168.1.12)secondaryNamenode,datanode,nodemanager,zookeeper, journalnode
Hadoop03(192.168.1.13)datanode,nodemanager,zookeeper, journalnode
Hadoop04(192.168.1.14)datanode,nodemanager,zookeeper, resourcemanager, journalnode
Hadoop05(192.168.1.15)datanode,nodemanager,zookeeper, resourcemanager, journalnode
2钠糊、Hadoop集群搭建
注意:沒特殊說明,都是使用hadoop用戶進行操作壹哺,需要使用root用戶進行操作的時候抄伍,會特別指出;
首先做一下說明管宵,統(tǒng)一將軟件安裝到/app目錄下截珍,方便管理,安裝軟件的時候箩朴,需要切換到普通hadoop用戶岗喉;
切換到root用戶,在根目錄下創(chuàng)建一個/app目錄隧饼,并修改權(quán)限:
[if !vml]
[endif]
2.1 集群基礎環(huán)境配置
2.1.1 添加hadoop用戶
如果hadoop01~hadoop05節(jié)點沒有hadoop用戶沈堡,請創(chuàng)建一個hadoop用戶;
2.1.2 防火墻配置
在這里直接關(guān)閉了防火墻和SELINUX燕雁,實際生產(chǎn)環(huán)境中不能直接關(guān)閉诞丽,需要添加修改防火墻規(guī)則;
2.1.3 網(wǎng)絡設置
在進行以下操作的前提是:五臺節(jié)點之間的網(wǎng)絡互通拐格,參考:“海工所_VMWware安裝虛擬機文檔_大數(shù)據(jù)_鄭智”文檔中的網(wǎng)絡配置部分僧免;
2.1.4 SSH免密登錄配置(重難點)
1)為什么需要配置SSH免密?
在集群中捏浊,Hadoop控制腳本依賴SSH來執(zhí)行針對整個集群的操作懂衩。例如,某個腳本能夠終止并重啟集群中的所有守護進程金踪。所以浊洞,需要安裝2 SSH琴锭,但是悼沈,SSH遠程登陸的時候西饵,需要密碼驗證甘凭,集群中數(shù)千臺計算機,數(shù)千臺計算機都需要手工輸入密碼撇吞,這是不太現(xiàn)實的斋否,所以枫耳,就需要配置SSH無密碼登錄怨咪。
例如屋剑,如果主機上安裝了ssh服務,但是沒有做任何配置诗眨,也可以使用ssh登錄到遠程主機唉匾,但是需要輸入密碼,如下所示:
[if !vml]
[endif]
即使ssh 本機匠楚,也需要輸入密碼肄鸽;
2)SSH免密登錄原理
客戶機用戶擁有自己的一對公鑰私鑰對卫病,它將公鑰分發(fā)給需要遠程登錄的主機上,然后在客戶機需要ssh登錄遠程主機時典徘,客戶機會發(fā)送一個請求給遠程主機,遠程主機用客戶機的公鑰加密一段信息益咬,然后發(fā)送給客戶機逮诲,客戶機使用私鑰進行解密后,將原始的信息再發(fā)送給遠程主機幽告,遠程主機經(jīng)過驗證后梅鹦,來判斷這個客戶機的身份;
現(xiàn)在配置五臺節(jié)點之間冗锁,hadoop用戶的免密SSH登錄齐唆;
3)生成公鑰密鑰對
下面,以節(jié)點hadoop01為例冻河,介紹下如下在hadoop用戶下生成rsa公鑰密鑰對
首先箍邮,切換到hadoop用戶,運行命令:ssh-keygen -t rsa #(生成的是rsa類型的密鑰)叨叙,出現(xiàn)需要輸入的地方锭弊,直接按“Enter”鍵;
[if !vml]
[endif]
運行完成后看擂错,會在hadoop用戶目錄的.ssh目錄下生成一個公鑰文件和私鑰文件味滞,id_rsa為私鑰文件,id_rsa.pub為公鑰文件,如下圖:
[if !vml]
[endif]
分別在其他四個節(jié)點上執(zhí)行相同的操作钮呀,生成公鑰私鑰對剑鞍;
4)傳送公鑰文件到遠程主機
然后,以節(jié)點hadoop01作為客戶機爽醋,hadoop01蚁署、hadoop02、hadoop03子房、hadoop04形用、hadoop05作為需要遠程登錄的主機,介紹如何實現(xiàn)從客戶機上免密ssh登錄遠程主機的步驟:
首先证杭,在客戶機hadoop1上運行命令:ssh-copy-id user@host田度,將其公鑰傳送到需要遠程登錄的主機host上面,例如解愤,運行命令:ssh-copy-id hadoop@hadoop02
[if !vml]
[endif]
在節(jié)點hadoop02上查看hadoop用戶主目錄下的.ssh/authorized_keys內(nèi)容:
[if !vml]
[endif]
可以看到這條記錄是hadoop01節(jié)點下hadoop用戶目錄下.ssh/id_rsa.pub公鑰文件內(nèi)容:
[if !vml]
[endif]
所以镇饺,實際上,ssh-copy-id user@host這條命令的作用是:將客戶機用戶的公鑰內(nèi)容添加到遠程主機的user用戶主目錄下的./ssh/authorized_keys文件中送讲;
再來驗證一下奸笤,以hadoop01同時作為客戶機和遠程主機惋啃,運行命令:ssh-copy-id hadoop@hadoop01:
[if !vml]
[endif]
同樣的,依次運行命令:ssh-copy-id hadoop@hadoop03监右、ssh-copy-id
hadoop@hadoop04边灭、ssh-copy-id hadoop@hadoop05:
[if !vml]
[endif]
現(xiàn)在,以hadoop01作為客戶機健盒,驗證下ssh登錄其他節(jié)點绒瘦,可以免密直接ssh登錄,如下圖:
[if !vml]
[endif]
至此扣癣,實現(xiàn)了從客戶機節(jié)點hadoop01惰帽,ssh免密登錄遠程主機hadoop01~hadoop05,回顧一下過程父虑,本質(zhì)是將hadoop01客戶機的hadoop用戶公鑰文件內(nèi)容分發(fā)追加到hadoop01~hadoop05主機的hadoop用戶主目錄下的./ssh/authorized_keys文件中该酗;那么,如果將節(jié)點hadoop01作為主機士嚎,節(jié)點hadoop01~hadoop05作為客戶機并可以免密SSH登錄到主機hadoop01呜魄,則hadoop01節(jié)點的hadoop用戶需要擁有hadoop01~hadoop05五個節(jié)點hadoop用戶的公鑰,所以就需要將節(jié)點hadoop01~hadoop05五個節(jié)點的hadoop用戶的公鑰文件分發(fā)傳送到hadoop01節(jié)點上航邢,這樣就實現(xiàn)了hadoop01~hadoop5五個節(jié)點的hadoop用戶免密ssh登錄到主機hadoop01上耕赘;由于現(xiàn)在hadoop01節(jié)點hadoop用戶主目錄下的./ssh/authorized_keys文件中包含了五個節(jié)點的公鑰,所以只需要將這個文件分發(fā)給其他四個節(jié)點hadoop02~hadoop05膳殷,就可以實現(xiàn)五個節(jié)點之間操骡,互相以hadoop用戶免密SSH登錄。
5)五節(jié)點hadoop用戶相互免密SSH登錄
在節(jié)點hadoop02赚窃、hadoop03册招、hadoop04和hadoop05上分別運行命令:ssh-copy-id hadoop@hadoop01,將各節(jié)點上hadoop用戶的公鑰追加到hadoop01節(jié)點hadoop用戶主目錄下勒极,的.ssh/authorized_keys文件中:
[if !vml]
[endif]
然后是掰,將hadoop01節(jié)點hadoop用戶主目錄的./ssh/authorized_keys文件分發(fā)給其余四個節(jié)點hadoop02、hadoop03辱匿、hadoop04以及hadoop05键痛;
[if !vml]
[endif]
在節(jié)點hadoop02上驗證一下用戶主目錄下.ssh/authorized_keys文件中的內(nèi)容,確實保存著五個節(jié)點hadoop用戶的公鑰匾七,如下圖所示:
[if !vml]
[endif]
并將hadoop01節(jié)點hadoop用戶主目錄下的.ssh/known_hosts文件(因為在第4)步以hadoop01作為客戶機絮短,分別ssh登錄haoop01~hadoop05這五個節(jié)點后,known_host文件就保存了可信賴的遠程服務器的信息)分發(fā)給其余四個節(jié)點hadoop02昨忆、hadoop03丁频、hadoop04以及hadoop05,文件中保存的內(nèi)容如下圖,
[if !vml]
[endif]
具體作用是讓客戶端對服務器進行身份驗證席里;known_hosts文件和authorized_keys文件的區(qū)別簡單概括就是:known_hosts文件允許客戶端對服務器進行身份驗證叔磷, authorized_keys文件允許服務器對用戶進行身份驗證。
如果不分發(fā)奖磁,在客戶機節(jié)點用戶主目錄的./ssh/known_hosts文件中沒有遠程主機的信息改基,那么會出來一個確認:
[if !vml]
[endif]
運行命令:scp .ssh/known_hosts user@host:/home/hadoop/.ssh/:
[if !vml]
[endif]
至此,五個節(jié)點之間的hadoop用戶免密互相遠程登錄完成署穗,可以隨機選擇某個節(jié)點作為客戶機寥裂,另外某個節(jié)點作為主機,然后進行驗證案疲;
2.1.5 集群時間同步配置
參考文檔“海工所_CentOS6.8集群時間同步配置_大數(shù)據(jù)_鄭智”,這里不做贅述麻养。
2.1.6 JDK安裝配置
以節(jié)點hadoop01為例褐啡,將jdk安裝解壓到/app目錄下:
[if !vml]
[endif]
然后,切換到root用戶下鳖昌,編輯/etc/prifile文件备畦,命令為:vim /etc/profile,在文件末尾添加如下文本:
JAVA_HOME=/app/jdk1.8.0_92
CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
輸入完成后许昨,按“Esc”鍵退出編輯模式懂盐,然后輸入“:wq”,保存退出糕档;
使用命令:source /etc/prifile更新profiel文件莉恼,并輸入命令:java –versionl來驗證下java安裝是否成功,如果輸出版本信息速那,那么就代表安裝配置成功俐银,如下圖所示:
[if !vml]
[endif]
按照上面的步驟,在其他幾個節(jié)點hadoop02~hadoop04做相同的操作端仰,安裝JDK捶惜;或者直接使用scp命令,將JDK的安裝目錄拷貝過去荔烧,然后修改profile文件即可吱七;
例如:從hadoop01節(jié)點上將jdk安裝目錄拷貝到hadoop02上的/app目錄下,命令為:
scp –r /app/jdk1.8.0_92/hadoop@hadoop02:/app/;
[if !vml]
[endif]
然后在hadoop02節(jié)點上鹤竭,切換到root用戶下踊餐,修改profile文件,配置JDK環(huán)境變量诺擅;
[if !vml]
[endif]
使得配置生效市袖,并檢查:
[if !vml]
[endif]
2.2 集群搭建
2.2.1 Zookeeper集群安裝?????
2.2.1.1簡單介紹
Zookeeper集群為分布式系統(tǒng)提供協(xié)調(diào)服務,比如hadoop集群依靠Zookeeper來實現(xiàn)HDFS
NameNode的自動故障轉(zhuǎn)移,以及YARN ResourceManager的高可用苍碟;以及構(gòu)建在hadoop之上的分布式數(shù)據(jù)庫HBase酒觅,它也使用Zookeeper來實現(xiàn)區(qū)域服務器的主選舉(master selection)、租賃管理以及區(qū)域服務器之間的其他通信微峰;
ZooKeeper 遵循一個簡單的客戶端-服務器模型舷丹,其中客戶端是使用服務的節(jié)點(即機器),而服務器是提供服務的節(jié)點蜓肆。ZooKeeper 服務器的集合形成了一個 ZooKeeper 集合體(ensemble)颜凯。在任何給定的時間內(nèi),一個 ZooKeeper 客戶端可連接到一個 ZooKeeper 服務器仗扬。每個 ZooKeeper 服務器都可以同時處理大量客戶端連接症概,如下圖所示:
[if !vml]
[endif]
在分布式系統(tǒng)中,各節(jié)點將是 ZooKeeper 集合體的客戶端早芭,每個 ZooKeeper 服務器都能夠以可擴展的方式處理大量客戶端彼城。例如,HBase依賴于 ZooKeeper 實現(xiàn)區(qū)域退个,服務器的領導者選舉和租賃管理募壕。可以利用一個相對較少(比如說语盈,五個)節(jié)點的 ZooKeeper 集合體運行有 50 個節(jié)點的大型 HBase 集群舱馅。
當客戶端請求讀取特定 znode 的內(nèi)容時,讀取操作是在客戶端所連接的服務器上進行的刀荒。因此代嗤,由于只涉及集合體中的一個服務器,所以讀取是快速和可擴展的照棋。然而资溃,為了成功完成寫入操作,要求 ZooKeeper 集合體的嚴格意義上的多數(shù)節(jié)點都是可用的烈炭。在啟動 ZooKeeper 服務時溶锭,集合體中的某個節(jié)點被選舉為領導者。當客戶端發(fā)出一個寫入請求時符隙,所連接的服務器會將請求傳遞給領導者趴捅。此領導者對集合體的所有節(jié)點發(fā)出相同的寫入請求。如果嚴格意義上的多數(shù)節(jié)點(也被稱為法定數(shù)量(quorum))成功響應該寫入請求霹疫,那么寫入請求被視為已成功完成拱绑。然后,一個成功的返回代碼會返回給發(fā)起寫入請求的客戶端丽蝎。如果集合體中的可用節(jié)點數(shù)量未達到法定數(shù)量猎拨,那么 ZooKeeper 服務將不起作用膀藐。
法定數(shù)量是通過嚴格意義上的多數(shù)節(jié)點來表示的。在集合體中红省,可以包含一個節(jié)點额各,但它不是一個高可用和可靠的系統(tǒng)。如果在集合體中有兩個節(jié)點吧恃,那么這兩個節(jié)點都必須已經(jīng)啟動并讓服務正常運行虾啦,因為兩個節(jié)點中的一個并不是嚴格意義上的多數(shù)。如果在集合體中有三個節(jié)點痕寓,即使其中一個停機了傲醉,您仍然可以獲得正常運行的服務(三個中的兩個是嚴格意義上的多數(shù))。出于這個原因呻率,ZooKeeper 的集合體中通常包含奇數(shù)數(shù)量的節(jié)點硬毕,因為就容錯而言,與三個節(jié)點相比礼仗,四個節(jié)點并不占優(yōu)勢昭殉,因為只要有兩個節(jié)點停機,ZooKeeper 服務就會停止藐守。在有五個節(jié)點的集群上,需要三個節(jié)點停機才會導致 ZooKeeper 服務停止運作蹂风。
在這里有五個節(jié)點卢厂,按照前面的集群規(guī)劃,會搭建五節(jié)點的Zookeeper集群惠啄,下面以hadoop01節(jié)點為例慎恒,介紹安裝配置zookeeper,然后其他節(jié)點通過scp命令直接將hadoop01上配置好的zookeeper安裝目錄拷貝過去就行撵渡;
2.2.1.2 解壓安裝
切換到zookeeper安裝包所在的目錄融柬,然后運行命令:tar -zxvf zookeeper-3.4.10.tar.gz -C /app/;將zookeeper解壓安裝到目錄/app下趋距,如下圖所示:
[if !vml]
[endif]
切換到/app/下的zookeeper安裝目錄粒氧,查看下zookeeper目錄結(jié)構(gòu):
[if !vml]
[endif]
在zookeeper安裝目錄下,創(chuàng)建一個data目錄节腐,用于保存zookeeper快照日志外盯,如下圖所示:
[if !vml]
[endif]
然后在data目錄下,創(chuàng)建一個datalog文件夾翼雀,用于存儲zookeeper事務日志饱苟,如下圖:
[if !vml]
[endif]
2.2.1.3 配置Zookeeper運行配置文件zoo.cfg
Zookeeper的配置文件存放在zookeeper安裝目錄/app/zookeeper-3.4.10/下的conf文件夾下:
[if !vml]
[endif]
其中,zoo_sample.cfg是管理配置zookeeper的配置文件狼渊;log4j.proeprties是zookeeper運行時日志配置文件箱熬;
將zoo_sample.conf重命名為zoo.cfg,并編輯,將內(nèi)容更改為如下:
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial synchronizationphase can take
initLimit=10
# The number of ticks that can pass betweensending a request and getting an acknowledgement
syncLimit=5
# 存儲內(nèi)存數(shù)據(jù)庫快照日志.
dataDir=/app/zookeeper-3.4.10/data
# 存儲事務日志
dataLogDir=/app/zookeeper-3.4.10/data/datalog
# 監(jiān)聽客戶端連接的端口
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle moreclients
#maxClientCnxns=60
# The number of snapshots to retain indataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable autopurge feature
#autopurge.purgeInterval=1
# zookeeper集群服務器列表信息城须,格式為:server.id=hostName:心跳端口:選舉端口
server.1=hadoop01:2888:3888
server.2=hadoop02:2888:3888
server.3=hadoop03:2888:3888
server.4=hadoop04:2888:3888
server.5=hadoop05:2888:3888
配置參數(shù)解析:
tickTime:基本時間單元蚤认,以毫秒為單位。它用來控制心跳和超時酿傍,默認情況下最小的會話超時時間為兩倍的 tickTime烙懦。
initLimit :此配置表示,允許 follower (相對于 leader 而言的“客戶端”)連接并同步到 leader 的初始化連接時間赤炒,它以 tickTime 的倍數(shù)來表示氯析。當超過設置倍數(shù)的 tickTime 時間,則連接失敗莺褒。
syncLimit :此配置表示掩缓, leader 與 follower 之間發(fā)送消息,請求和應答時間長度遵岩。如果 follower 在設置的時間內(nèi)不能與 leader 進行通信你辣,那么此 follower 將被丟棄。
dataDir :存儲內(nèi)存中數(shù)據(jù)庫快照的位置尘执;注意:如果需要保留zookeeper事務日志信息舍哄,那么可以考慮配置 dataLogDir 的位置。通常情況下數(shù)據(jù)庫快照日志和zookeeper事務日志是分開存儲的誊锭,并且應該謹慎地選擇日志存放的位置表悬,使用專用的日志存儲設備能夠大大地提高系統(tǒng)的性能,如果將日志存儲在比較繁忙的存儲設備上丧靡,那么將會在很大程度上影響系統(tǒng)的性能蟆沫。
clientPort :監(jiān)聽客戶端連接的端口,默認是 2181温治,最好不要修改
最后再增加 ZooKeeper 的服務器列表信息饭庞,格式為: server.id=主機名:心跳端口:選舉端口
例子:server.1=hadoop01:2888:3888
其中 id 雖然可以隨便寫,但是有兩點要求熬荆,第一不能重復舟山,第二范圍是 1-255,并且對應服務器列表上還得存在對應的 id 文件惶看,具體看下面操作
2.2.1.4 配置Zookeeper運行時日志
log4j用于記錄zookeeper集群服務器運行日志捏顺,該日志的配置地址在conf/目錄下的log4j.properties文件中,該文件中有一個配置項為“zookeeper.log.dir=.”纬黎,表示log4j日志文件在與執(zhí)行程序(zkServer.sh)在同一目錄下幅骄。當執(zhí)行zkServer.sh 時,在該文件夾下會產(chǎn)生zookeeper.out日志文件本今。
Zookeeper運行日志配置地址:
[if !vml]
[endif]
Zookeeper運行日志保存位置:
[if !vml]
[endif]
這里就保留默認運行時日志輸出配置拆座;
2.2.1.5配置環(huán)境變量
切換到root用戶下主巍,編輯/etc/profile文件,在文件末尾添加如下兩行:
export ZOOKEEPER_HOME=/app/zookeeper-3.4.10
export PATH=$PATH:$ZOOKEEPER_HOME/bin
2.2.1.6分發(fā)zookeeper安裝目錄到其他服務器節(jié)點上
命令為:
scp -r zookeeper-3.4.10/hadoop@hadoop02:/app/
scp -r zookeeper-3.4.10/ hadoop@hadoop03:/app/
scp -r zookeeper-3.4.10/hadoop@hadoop04:/app/
scp -r zookeeper-3.4.10/hadoop@hadoop05:/app/
2.2.1.7創(chuàng)建myid文件挪凑,保存節(jié)點id
這一步驟孕索,需要在各個節(jié)點上單獨進行操作,應為每個節(jié)點的myid文件保存的內(nèi)容不一樣躏碳,在/app/zookeeper-3.4.10/data目錄下創(chuàng)建一個名叫myid的文件搞旭,用于保存該節(jié)點的id,比如:server.1=hadoop01:2888:3888菇绵,則haddoop01的節(jié)點id就是1肄渗,對應的其他四個服務器節(jié)點都應該做類似的操作,現(xiàn)拿節(jié)點hadoop01為例:
[if !vml]
[endif]
2.2.1.8啟動集群
Zookeeper的可執(zhí)行腳本存放在zookeeper安裝目錄下的bin目錄下咬最,如下圖:
[if !vml]
[endif]
切換到bin目錄翎嫡,運行zkserver.sh腳本啟動集群,命令為:./zkServer.sh start
[if !vml]
[endif]
查看進程:
[if !vml]
[endif]
2.2.1.9 查看集群狀態(tài)
使用命令:./zkServer.sh status查看服務器角色(leader or followe):
[if !vml]
[endif]
出現(xiàn)錯誤“contacting service. It is probably not running”
先停止zookeeper永乌,命令為:./zkServer.sh stop
[if !vml]
[endif]
重新使用命令:./zkServer.sh start-foreground來啟動zookeeper惑申,這個命令是在前臺運行zookeeper,會輸出啟動日志:
[if !vml]
[endif]
日志報錯:”Cannot open channel to 3 at election address
hadoop03/192.168.1.13:3888”翅雏,但是可以從hadoop01節(jié)點上ping通hadoop03:
[if !vml]
[endif]
猜測是防火墻的問題圈驼,查看hadoop01節(jié)點的防火墻狀態(tài)未開啟:
[if !vml]
[endif]
查看hadoop03節(jié)點的防火墻狀態(tài),發(fā)現(xiàn)是開啟狀態(tài)望几;
[if !vml]
[endif]
關(guān)閉hadoop03節(jié)點的防火墻碗脊,并檢查其余幾個節(jié)點的防火墻狀態(tài)是否關(guān)閉,然后重啟Zookeeper集群(注意:雖然我們在配置文件中寫明了服務器的列表信息橄妆,但是還是需要去每一臺服務器去啟動,不是一鍵啟動集群模式)
重啟成功后祈坠,使用命令:./zkServer.sh status查看服務器角色(leader or followe):
Hadoop01節(jié)點上:
[if !vml]
[endif]
Hadoop02節(jié)點上:
[if !vml]
[endif]
Hadoop03節(jié)點上:
[if !vml]
[endif]
Hadoop04節(jié)點上:
[if !vml]
[endif]
Hadoop05節(jié)點上:
[if !vml]
[endif]
至此害碾,zookeeper集群搭建完畢
2.2.2 Hadoop集群安裝
下面以配置節(jié)點hadoop01為例,其余節(jié)點可以通過使用scp命令拷貝hadoop01的hadoop安裝目錄以及其他配置進行安裝赦拘;
2.2.2.1解壓安裝
命令為:tar -zxvf hadoop-2.6.5.tar.gz -C /app/
解壓后的目錄結(jié)構(gòu)如下:
[if !vml]
[endif]
2.2.2.2配置環(huán)境變量
切換到root用戶下慌随,修改/etc/profile文件,添加如下內(nèi)容:
export HADOOP_HOME=/app/hadoop-2.6.5/
exportLD_LIBRARY_PATH=$HADOOP_HOME/lib/native
exportPATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
2.2.2.3修改配置文件
1躺同、配置hadoop-env.sh阁猜,配置JDK安裝路徑:
# The java implementation to use.
export JAVA_HOME=/app/jdk1.8.0_92
2、配置core-site.xml蹋艺,修改內(nèi)容如下:
???????
???????????????fs.defaultFS
??????????????? hdfs://HadoopHACluster
???????
???????????????hadoop.tmp.dir
???????????????/app/hadoop-2.6.5/data/tmpdir
???????
???????????????io.file.buffer.size
??????????????? 4096
???????
???????????????ha.zookeeper.quorum??????????? hadoop01:2181,hadoop02:2181,hadoop03:2181,hadoop04:2181,hadoop05:2181
???????
?????????fs.trash.interval
?????????1440
?????????Number ofminutes between trash checkpoints. If zero, the trash feature isdisabled.
3剃袍、配置hdfs-site.xml文件,配置內(nèi)容如下:
???????
????????????????dfs.namenode.name.dir
????????????????file:/app/hadoop-2.6.5/data/dfs/name
???????
????????????????dfs.datanode.data.dir
???????????????? file:/app/hadoop-2.6.5/data/dfs/data
???????
???????????????dfs.namenode.checkpoint.dir
???????????????file:/app/hadoop-2.6.5/data/dfs/namesecondary
??????????????? secondarynamenode data dir
??????????????? true
???????
???????????????dfs.replication
??????????????? 2
??????????????? hdfs datacopy number
???????
????????????????dfs.nameservices
???????????????? HadoopHACluster
???????
????????????????dfs.ha.namenodes.HadoopHACluster
???????????????? hadoop01,hadoop02
???????
????????????????dfs.namenode.rpc-address.HadoopHACluster.hadoop01
????????????????hadoop01:9000
???????
????????????????dfs.namenode.rpc-address.HadoopHACluster.hadoop02
????????????????hadoop02:9000
???????
???????????????dfs.namenode.http-address.HadoopHACluster.hadoop01
???????????????hadoop01:50070
???????
???????????????dfs.namenode.http-address.HadoopHACluster.hadoop02
???????????????hadoop02:50070
???????
???????????????dfs.namenode.shared.edits.dir
???????????????qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485;hadoop04:8485;hadoop05:8485/HadoopHACluster
???????
????????????????dfs.journalnode.edits.dir
????????????????/app/hadoop-2.6.5/data/journal
???????
????????????????dfs.journalnode.rpc-address
????????????????0.0.0.0:8485
???????????????? journalnode的rpc地址
???????
???????????????dfs.ha.automatic-failover.enabled
??????????????? true
???????
???????????????dfs.client.failover.proxy.provider.HadoopHACluster
???????????????org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
??????????????? 指定hdfs client來識別HadoopHACluster命名空間并在namenode切換期間識別namnode的proxy類
???????
???????????????dfs.ha.fencing.methods
???????????????sshfence
???????
??????????????? dfs.ha.fencing.ssh.private-key-files
???????????????/home/hadoop/.ssh/id_rsa
???????
???????????????ha.failover-controller.cli-check.rpc-timeout.ms
???????????????60000
???????????????getServiceState timout
???????
???????????????ipc.client.connect.timeout
???????????????60000
???????
??????????????? dfs.client.read.shortcircuit.buffer.size
??????????????? 4096
???????
???????????????dfs.image.transfer.bandwidthPerSec
???????????????4194304
??????????????? 用于圖片傳輸?shù)膸?/p>
???????
???????????????dfs.permissions
???????????????false
??????????????? offpermission check
???????
???????????????dfs.support.append
??????????????? true
??????????????? 允許追加文件
???????
??????????????? dfs.datanode.max.xcievers
??????????????? 4096
??????????????? datanode的文件句柄數(shù)限制
4捎谨、配置mapred-site.xml文件民效,配置內(nèi)容如下:
???
???????mapreduce.framework.name
???????yarn
???
???????mapred.system.dir
???????file:/app/hadoop-2.6.5/data/mapred/system
???????true
???
???????mapred.local.dir
???????file:/app/hadoop-2.6.5/data/mapred/local
???????true
???
???????mapreduce.map.memory.mb
???????1024
??? ????每個MapReduce作業(yè)的map任務可以申請的內(nèi)存資源數(shù)量
???
???????mapreduce.map.cpu.vcores
???????1
???????每個MapReduce作業(yè)的map任務可以申請的虛擬CPU資源的數(shù)量
???
???????mapreduce.reduce.memory.mb
???????1024
???????每個MapReduce作業(yè)的reduce任務可以申請的內(nèi)存資源數(shù)量
???
???????mapreduce.jobhistory.address
???????hadoop01:10020
???
???????mapreduce.jobhistory.webapp.address
???????hadoop01:19888
5憔维、配置yarn-site.xml文件,內(nèi)容如下:
???
???????yarn.nodemanager.aux-services
???????mapreduce_shuffle
???????shuffle service that needs to be set for Map Reduceto run
???
???????yarn.resourcemanager.ha.enabled
???????true
??
???????yarn.resourcemanager.ha.automatic-failover.enabled
???????true
??
????????yarn.resourcemanager.cluster-id
????????yarncluster
??
????????yarn.resourcemanager.ha.rm-ids
????????rm1,rm2
??
???????yarn.resourcemanager.hostname.rm1
???????hadoop04
??
???????yarn.resourcemanager.hostname.rm2
???????hadoop05
??
????????yarn.resourcemanager.webapp.address.rm1
????????hadoop04:8088
??
????????yarn.resourcemanager.webapp.address.rm2
????????hadoop05:8088
??
???????yarn.resourcemanager.zk-address
???????hadoop01:2181,hadoop02:2181,hadoop03:2181,hadoop04:2181,hadoop05:2181
6畏邢、配置slaves文件业扒,內(nèi)容如下:
HAhadoop01
HAhadoop02
HAhadoop03
HAhadoop04
HAhadoop05
如下圖:
[if !vml]
[endif]
7、創(chuàng)建配置文件中涉及的目錄
mkdir -p /home/hadoop/app/hadoop-2.6.5/data/tmpdir
mkdir -p /home/hadoop/app/hadoop-2.6.5/data/dfs/name
mkdir -p /home/hadoop/app/hadoop-2.6.5/data/dfs/data
mkdir -p /home/hadoop/app/hadoop-2.6.5/data/dfs/namesecondary
mkdir -p /home/hadoop/app/hadoop-2.6.5/data/journal
mkdir -p /home/hadoop/app/hadoop-2.6.5/data/mapred/system
mkdir -p /home/hadoop/app/hadoop-2.6.5/data/mapred/local
mkdir -p /home/hadoop/app/hadoop-2.6.5/data/yarn/rmlogs
mkdir -p /home/hadoop/app/hadoop-2.6.5/data/yarn/rmstore
如下圖:
[if !vml]
[endif]
2.2.2.4 分發(fā)hadoop安裝目錄以及配置文件profile
1)將hadoop安裝目錄同步到集群其它節(jié)點
scp -r hadoop-2.6.5/ hadoop@hadoop02:/app
scp -r hadoop-2.6.5/ hadoop@hadoop03:/app
scp -r hadoop-2.6.5/ hadoop@hadoop04:/app
scp -r hadoop-2.6.5/ hadoop@hadoop05:/app
2)分發(fā)配置文件/etc/profile
scp -r /etc/profile root@hadoop02:/etc
scp -r /etc/profile root@hadoop03:/etc
scp -r /etc/profile root@hadoop04:/etc
scp -r /etc/profile root@hadoop05:/etc
拷貝過去之后舒萎,記得使用source命令使profile中配置的生效程储,命令是:source /etc/profile。
2.2.2.4 集群初始化操作
1)啟動zookeeper集群
若沒有啟動zookeeper集群臂寝,則分別在節(jié)點hadoop01~hadoop05上運行命令:zkServer.sh start來啟動集群章鲤;
2)格式化ZKFC(在master節(jié)點上執(zhí)行)
命令為:hdfs zkfc –formatZK
這里在hadoop01上:
[if !vml]
[endif]
3)啟動journalnode
分別在hadoop01~hadoop05上執(zhí)行,命令為:hadoop-daemon.sh start journalnode
比如在hadoop01上:
[if !vml]
[endif]
在其他幾個節(jié)點上執(zhí)行相同的操作交煞,使用jps命令咏窿,若出現(xiàn)JournalNode,則表明JournalNode啟動成功素征;
4)格式化HDFS(在master節(jié)點上執(zhí)行)
這里在hadoop01節(jié)點上進行集嵌,命令為:hdfs namenode –format
[if !vml]
[endif]
[if !vml]
[endif]
格式化后會在hadoop工作目錄的元數(shù)據(jù)存儲目錄中生成一些數(shù)據(jù)
[if !vml]
[endif]
5)將格式化后hadoop01節(jié)點hadoop工作目錄中的元數(shù)據(jù)目錄復制到hadoop02節(jié)點上相應的目錄下:
命令為:scp -r /app/hadoop-2.6.5/data/dfs/name/*hadoop@hadoop02:/app/hadoop-2.6.5/data/dfs/name/
如下圖:
[if !vml]
[endif]
到此為止。hadoop集群的初始化就OK 了御毅。以上的初始化在成功了之后根欧,就堅決不能再做了。
2.2.2.5 啟動集群
1)端蛆、啟動Zookeeper集群凤粗;
2)、啟動HDFS 今豆,命令為:start-dfs.sh嫌拣;不管在哪個節(jié)點執(zhí)行都可以[if !vml]
[endif]
分別在hadoop01~hadoop05節(jié)點上查看啟動的進程;
Hadoop01節(jié)點上:
[if !vml]
[endif]
Hadoop02節(jié)點上:
[if !vml]
[endif]
Hadoop03節(jié)點上:
[if !vml]
[endif]
Hadoop04節(jié)點上:
[if !vml]
[endif]
Hadoop05節(jié)點上:
[if !vml]
[endif]
3)啟動YARN集群:start-yarn.sh呆躲;最好在YARN的主節(jié)點上執(zhí)行异逐,(在配置文件中設置yarn主節(jié)點在hadoop04上)
在節(jié)點hadoop04上:
[if !vml]
[endif]
查看進程:
[if !vml]
[endif]
另外一個resourcemanager必須手動啟動,yarn-daemon.sh start resourcemanager(hadoop05是規(guī)劃當中resourcemanager的備份節(jié)點)
在hadoop05節(jié)點上:
[if !vml]
[endif]
各節(jié)點所有進程全部啟動之后各自的進程狀態(tài)如下:
Hadoop01:
[if !vml]
[endif]
Hadoop02:
[if !vml]
[endif]
Hdooop03:
[if !vml]
[endif]
Haodop04:
[if !vml]
[endif]
Hadoop05:
[if !vml]
[endif]
4)通過web界面查看集群狀態(tài)
1插掂、查看hdfs
訪問地址:http://192.168.1.11:50070
[if !vml]
[endif]
訪問地址:http://192.168.1.12:50070
secondary namenode:
[if !vml]
[endif]
2灰瞻、查看yarn節(jié)點啟動情況:
訪問地址:http://192.168.1.14:8088
[if !vml]
[endif]
查看yarn集群節(jié)點:
[if !vml]
[endif]
因為hadoop05是stanby resourcemanager,會自動跳轉(zhuǎn)到hadoop04節(jié)點上:
[if !vml]
[endif]
5)查看集群HA狀態(tài)
Hdfs:
hdfs haadmin -getServiceState hadoop01
hdfs haadmin -getServiceState hadoop02
[if !vml]
[endif]
YARN:
yarn rmadmin -getServiceState rm1
yarn rmadmin -getServiceState rm2
[if !vml]
[endif]
2.2.2.6 集群測試
[if !supportLists]1辅甥、? [endif]測試hdfs HA
在上文中酝润,根據(jù)命令hdfs haadmin -getServiceState hadoop01,可知hadoop01是active namenode節(jié)點璃弄,在節(jié)點hadoop01上kill掉namenode進程后:
[if !vml]
[endif]
可以看到要销,hadoop02變成了active namenode節(jié)點;
再把hadoop01節(jié)點的namenode進程啟動起來夏块,然后查看節(jié)點狀態(tài):
[if !vml]
[endif]
可以看到hadoop01節(jié)點是standby蕉陋,hadoop02節(jié)點是active捐凭;
[if !supportLists]2、? [endif]測試YARN HA
在節(jié)點hadoop04上:
[if !vml]
[endif]
再把hadoop04節(jié)點上的resourceManager進程啟動起來:?????????????
[if !vml]
[endif]