一、寫在前面??
大家好!我是初心,今天給大家?guī)淼氖荋adoop HA搭建保姆級教程,來自大二學(xué)長的萬字長文自述和筆記!
相信很多人看到這個(gè)標(biāo)題時(shí),可能會產(chǎn)生一種疑問:博主你之前不是出過一期關(guān)于Hadoop HA高可用集群搭建的教程了嗎,這次怎么還出一篇?是有什么改進(jìn)的地方嗎?
沒錯(cuò)!本次將給大家?guī)砀釉敿?xì)的搭建教程以及解釋! 希望能幫助大家更好的理解Hadoop HA集群。
老規(guī)矩,還是先介紹一下自己吧?。ㄔ撟叩牧鞒滩荒苌伲俸俸伲?/p>
?? 個(gè)人主頁:初心%個(gè)人主頁 ??
?? 個(gè)人簡介:大家好,我是初心,和大家共同努力 ??
?? 每日金句分享:迄今所有人生都大寫著失敗,但并不妨礙我繼續(xù)向前?!耔F《王者榮耀》??
??歡迎大家:這里是CSDN,我記錄知識的地方,喜歡的話請三連,有問題請私信??
話不多說,就讓我們一起進(jìn)入正題吧!
二、集群準(zhǔn)備??
這是我們本次搭建要完成的集群規(guī)劃,也就是我們的,終極目標(biāo)(The ultimate goal)。
2.1 集群規(guī)劃
也就是說,總共有hadoop102,hadoop103,hadoop104,hadoop105四個(gè)節(jié)點(diǎn)。先來一張搭建好的圖證明一下我搭建好了:
-
停止集群
- 啟動(dòng)集群
- 查看集群規(guī)劃是否符合預(yù)期
2.2 集群解釋
- NN-1
NameNode節(jié)點(diǎn)1,在 core-site.xml 文件中配置。
<!-- mycluster是集群名稱,值是集群中的所有namenodes -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
- NN-2
NameNode節(jié)點(diǎn)2,也是在 core-site.xml 文件中配置。
- DN
DataNode,在workers中配置。
workers中的主機(jī)名要提前在/etc/hosts文件中做好主機(jī)名與IP的映射。
- ZK
Zookeeper,在 zoo.cfg 文件中配置。
注意要將 zoo_sample.cfg 文件改名為 zoo.cfg,這個(gè)文件在 zookeeper 目錄的 conf 目錄下。不需要啟動(dòng)Zookeeper的節(jié)點(diǎn),不需要配置進(jìn)來。
- ZKFC
ZKFailOverController,不需要主動(dòng)配置,哪里的NameNode正常啟動(dòng)了ZKFC就會啟動(dòng)。
ZKFailOverController是Hadoop中通過ZK實(shí)現(xiàn)FC(故障轉(zhuǎn)移)功能的一個(gè)實(shí)用工具。
- JNN
JournalNode,在需要啟動(dòng)的節(jié)點(diǎn)上啟動(dòng),僅第一次啟動(dòng)Hadoop時(shí)需要手動(dòng)啟動(dòng),后面都不需要手動(dòng)啟動(dòng)。
三、說明??
3.1 主機(jī)名說明
據(jù)了解,很多朋友使用的四個(gè)節(jié)點(diǎn)的名稱 并不是 hadoop102,hadoop103,hadoop104,hadoop105
,有是master、slave1,slave2,slave3的;有namenode,datanode1,datanode2,datanode3的。沒關(guān)系,只是主機(jī)名不一樣而已!
只需要將對應(yīng)的地方修改一下,就可以。(如果你足夠熟練,就知道哪些地方要用自己的主機(jī)名)
3.2 用戶名說明
在搭建過程中,我也沒有使用 root 賬號,使用的是一個(gè)可以執(zhí)行 sudo 命令的普通用戶賬號。
為什么不使用root賬號?
試問一下大家,如果你在公司上班,如果你不是運(yùn)維人員,只是普通的開發(fā)人員,你可以拿到root賬號的權(quán)限嗎?顯然是不可以的,我認(rèn)為我們在平時(shí)的訓(xùn)練中就要養(yǎng)成使用普通用戶賬號的習(xí)慣,實(shí)際操作中才能游刃有余。(類似于接受自己的平庸哈哈哈)
3.3 操作目錄說明
所有操作均在 /opt/module/HA 目錄下,當(dāng)然如果需要修改環(huán)境變量就要切換到 /etc/profile.d/ 目錄下。
3.3 必要工具說明
這里使用到的就是VMware(安裝虛擬機(jī)),XShell(遠(yuǎn)程連接工具)、Xftp(文件傳輸工具)。
至此,我們的需求、要求以及硬件設(shè)備就準(zhǔn)備好了。下面開始準(zhǔn)備軟件吧!
四、上傳資料??
磨刀不誤砍柴工!充分的準(zhǔn)備可以讓我們的搭建過程事半功倍,流暢無比!
,而且,這也是減少返工(軟件工程中的名詞)的重要條件,大家一定要做好哦!
4.1 資料準(zhǔn)備
這里用到的安裝包有:jdk-8u202-linux-x64.tar.gz,點(diǎn)我下載jdk,hadoop-3.1.3.tar.gz,點(diǎn)我下載hadoop,apache-zookeeper-3.5.7-bin.tar.gz。點(diǎn)我下載Zookeeper,如果沒有這些文件的可以私信我獲取,我都上傳到百度網(wǎng)盤了。
4.2 腳本準(zhǔn)備
這里,我主要使用到了分發(fā)腳本(腳本名xsync),Hadoop HA一鍵啟動(dòng)腳本(腳本名myHA),查看所有節(jié)點(diǎn)jps進(jìn)程腳本(腳本名jpsall)。
腳本的使用之前有提到過,這里不再贅述,大家可以參考我的這篇文章或其他文章:hadoop集群啟停腳本分享。
下面是腳本內(nèi)容,需要注意的是如果你的主機(jī)名和我不同,記得修改文中代碼!
- xsync
#! /bin/bash
# 1.判斷參數(shù)個(gè)數(shù)
if [ $# -lt 1 ]
then
echo Not Enough Argument!
exit;
fi
# 2.遍歷所有集群機(jī)器
for host in hadoop102 hadoop103 hadoop104 hadoop105
do
echo ==================== $host ===================
# 3.遍歷所有目錄,挨個(gè)發(fā)送
for file in $@
do
# 4.判斷文件是否存在
if [ -e $file ]
then
# 5.獲取父目錄
pdir=$(cd -P $(dirname $file); pwd)
# 6.獲取當(dāng)前文件的名稱
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
- myHA
#! /bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit;
fi
case $1 in
"start"){
echo "----------啟動(dòng)zookeeper----------"
for i in hadoop103 hadoop104 hadoop105
do
echo ---------- zookeeper $i 啟動(dòng) ------------
ssh $i "/opt/module/HA/zookeeper/bin/zkServer.sh start"
done
echo "---------- 啟動(dòng)hdfs------------"
ssh hadoop102 "/opt/module/HA/hadoop-3.1.3/sbin/start-dfs.sh"
echo "---------- hadoop HA啟動(dòng)成功------------"
};;
"stop"){
echo "----------關(guān)閉hdfs----------"
ssh hadoop102 "/opt/module/HA/hadoop-3.1.3/sbin/stop-dfs.sh"
echo "----------關(guān)閉zookeeper----------"
for i in hadoop103 hadoop104 hadoop105
do
echo ---------- zookeeper $i 停止 ------------
ssh $i "/opt/module/HA/zookeeper/bin/zkServer.sh stop"
done
echo "---------- hadoop HA停止成功------------"
};;
"status"){
for i in hadoop103 hadoop104 hadoop105
do
echo ---------- zookeeper $i 狀態(tài) ------------
ssh $i "/opt/module/HA/zookeeper/bin/zkServer.sh status"
done
};;
*)
echo "Input Args Error"
;;
esac
- jpsall
#! /bin/bash
for host in hadoop102 hadoop103 hadoop104 hadoop105
do
echo ----------$host----------
ssh $host jps
done
4.3 配置文件準(zhǔn)備
由于篇幅原因,這里不展示配置文件的具體內(nèi)容,但是卻是非常重要,重中之重,大家可以私信我獲??!這是搭建HA高可用中的關(guān)鍵,是減少我們遇到 報(bào)錯(cuò)風(fēng)暴
的必由之路。
這里要用到的配置文件有:core-site.xml,hdfs-site.xml,hadoop-env.sh,workers,yarn-site.xml,mapred-site.xml(都在hadoop/etc/hadoop目錄下)zoo.cfg(zookeeper/conf/目錄下),my_env.sh(/etc/profile.d/目錄下),共8個(gè)文件。
這8個(gè)配置文件均已上傳百度網(wǎng)盤!
點(diǎn)我獲取資料。
至此,我們的資料也準(zhǔn)備好了!
五、解壓與修改文件??
5.1 解壓軟件包
將上述我們準(zhǔn)備好的Zookeeper、Hadoop、JDK軟件包通過Xshell+Xftp上傳到 /opt/software 目錄下,并解壓到 /opt/module/HA 目錄下。
上傳文件過程請大家自己完成哦!下面是解壓過程:(該過程只需要在一臺節(jié)點(diǎn)上完成即可,我這里使用的hadoop102,其他的節(jié)點(diǎn)后面使用克?。?。
- 創(chuàng)建HA目錄
mkdir /opt/module/HA
- 解壓JDK
tar -xzvf /opt/software/jdk-8u202-linux-x64.tar.gz -C /opt/module/HA/
- 解壓Hadoop
tar -xzvf /opt/software/hadoop-3.1.3.tar.gz -C /opt/module/HA/
- 解壓Zookeeper
tar -xzvf apache-zookeeper-3.5.7-bin.tar.gz -C /opt/module/HA/
- 重命名Zookeeper
mv apache-zookeeper-3.5.7-bin/ zookeeper
- 重命名JDK
mv jdk1.8.0_202/ jdk1.8
5.2 修改配置文件
hadoop目錄下的文件共六個(gè),在資料中已經(jīng)給出,下面僅展示一部分要特別注意的配置文件。
-
1.core-site.xml
-
2.hdfs-site.xml
-
3.hadoop-env.sh
-
4.workers
hadoop103
hadoop104
hadoop105
- 5.yarn-site.xml
- 6.mapre-site.xml
zookeeper目錄下的文件
- 1.zoo.cfg
server.1=hadoop103:2888:3888
server.2=hadoop104:2888:3888
server.3=hadoop105:2888:3888
- 2.myid
這個(gè)節(jié)點(diǎn)上沒有使用Zookeeper,所以未使用myid文件。
/etc/profile.d目錄下的文件
- my_env.sh
# JAVA_HOME
# 只需修改java_home 因人而異 是自己的jdk安裝目錄
export JAVA_HOME=/opt/module/jdk1.8
export PATH=$PATH:$JAVA_HOME/bin
# HADOOP_HOME
# 同理 這里只需修改Hadoop_home,是Hadoop安裝目錄
export HADOOP_HOME=/opt/module/HA/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
export HDFS_NAMENODE_USER=sky
export HDFS_DATANODE_USER=sky
export HDFS_SECONDARYNAMENODE_USER=sky
export YARN_RESOURCEMANAGER_USER=sky
export YARN_NODEMANAGER_USER=sky
# ZOOKEEPER_HOME
export ZOOKEEPER_HOME=/opt/module/HA/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin
之后記得刷新環(huán)境變量:
source /etc/profile.d/my_env.sh
5.3 創(chuàng)建目錄
創(chuàng)建Hadoop數(shù)據(jù)臨時(shí)目錄:
mkdir /opt/module/HA/tmp
創(chuàng)建JournalNode日志目錄:
mkdir /opt/module/HA/logs
創(chuàng)建Zookeeper數(shù)據(jù)目錄:
mkdir /opt/module/HA/zookeeper/zkData
5.4 分發(fā)HA目錄
分發(fā)HA目錄下的所有內(nèi)容到hadoop103,hadoop104,hadoop105上。
xsync /opt/module/HA/
六、啟動(dòng)HA集群??
6.1 Zookeeper啟動(dòng)測試
分別在hadoop103,hadoop104,hadoop105三個(gè)節(jié)點(diǎn)上啟動(dòng)Zookeeper,因?yàn)檫@三個(gè)節(jié)點(diǎn)在集群規(guī)劃中有ZK。
zkServer.sh start
三個(gè)節(jié)點(diǎn)上的Zookeeper均啟動(dòng)成功!
6.2 啟動(dòng)JournalNode
分別在hadoop102,hadoop103,hadoop104三個(gè)節(jié)點(diǎn)上啟動(dòng)Zookeeper,因?yàn)檫@三個(gè)節(jié)點(diǎn)在集群規(guī)劃中有JNN。
并且,JournalNode只需要手動(dòng)啟動(dòng)一次,以后啟動(dòng)Hadoop HA高可用集群均不需要再次手動(dòng)啟動(dòng)。
hdfs --daemon start journalnode
現(xiàn)在,我們通過jps來查看進(jìn)程,ZK和JNN是否按照集群規(guī)劃啟動(dòng)好了?
可以看到,目前集群規(guī)劃正確,下面我們就可以進(jìn)行下一步操作啦。
6.3 初始化NameNode
在是NameNode節(jié)點(diǎn)上的任意一個(gè)節(jié)點(diǎn)上初始化NameNode,并且只需要初始化一遍,這里我的集群中,hadoop102和hadoop103上都有NameNode,但是因?yàn)閔adoop103上有DataNode,所以我 選擇使用hadoop102作為初始化節(jié)點(diǎn)
。
hdfs namenode -format
6.4 初始化Zookeeper
在具有Zookeeper節(jié)點(diǎn)上的任意一個(gè)節(jié)點(diǎn)上初始化Zookeeper,并且只需要初始化一遍。這里我選擇在hadoop103上進(jìn)行初始化。
hdfs zkfc -formatZK
判斷是否初始化成功:(在三臺都查看一下)
zkCli.sh
ls \
6.5 啟動(dòng)集群
分別在hadoop102,hadoop103上啟動(dòng)NameNode。
hadoop102上執(zhí)行:(只需執(zhí)行一次
)
hdfs --daemon start namenode
hadoop103上執(zhí)行:(只需執(zhí)行一次
)
hdfs namenode -bootstrapStandby
在hadoop102上啟動(dòng)集群:
start-dfs.sh
至此,集群中的NameNode,DataNode,Zookeeper,ZKFC,JournalNode都已經(jīng)啟動(dòng)好了。下面,讓我們一起來看看,我們的集群能否經(jīng)得住檢驗(yàn)吧!
七、檢驗(yàn)集群?
7.1 jps檢查
使用jpsall腳本分別查看四個(gè)節(jié)點(diǎn)上的jps進(jìn)程信息,是否和集群規(guī)劃相符,集群規(guī)劃圖再放一遍:
jpsall
和集群規(guī)劃完全一致!
7.2 網(wǎng)頁檢查
分別訪問NameNode1和NameNode2的兩個(gè)Web頁面,網(wǎng)址是http://hadoop102:9870,http://hadoop103:9870,結(jié)果如下:
網(wǎng)站訪問中hadoop102的NameNode是active狀態(tài),hadoop103中的NameNode是standby狀態(tài)。
7.3 自動(dòng)故障轉(zhuǎn)移檢查
使用如下命令kill掉hadoop102上的NameNode進(jìn)程:
這里,我們遇到了將NameNode-1的進(jìn)程kill掉之后,另外一個(gè)NameNode沒有變成active狀態(tài)的問題,也就是說并沒有實(shí)現(xiàn)自動(dòng)故障轉(zhuǎn)轉(zhuǎn)移!
讓我們一起來解決吧!
7.4 解決NameNode無法自動(dòng)故障轉(zhuǎn)移問題
這里引入一個(gè) “腦裂”
的概念。
active namenode工作不正常后,zkfc在zookeeper中寫入一些數(shù)據(jù),表明異常,這時(shí)standby namenode中的zkfc讀到異常信息,并將standby節(jié)點(diǎn)置為active。
但是,如果之前的active namenode并沒有真的死掉,出現(xiàn)了假死(死了一會兒后又正常了),這樣,就有兩臺namenode同時(shí)工作了。這種現(xiàn)象稱為 腦裂
。
這里提供兩種解決方案:
- 法一:改變kill方式——安裝psmisc插件
上述中,我們使用kill掉NameNode進(jìn)程的方法是:
kill -9 進(jìn)程號
但是這種方式不一定能夠完全 kill 掉NameNode的狀態(tài),可能就會出現(xiàn)殘余從而出現(xiàn)“腦裂”現(xiàn)象,所以我們采用 psmisc插件
的方式來徹底結(jié)束進(jìn)程。
更加神奇的是,這個(gè)插件安裝好了,并不需要我們手動(dòng)使用,而是系統(tǒng)自己調(diào)用的!
在hadoop102、hadoop103上按照psmisc插件:
sudo yum install -y psmisc
- 感受psmisc插件的威力
這里,我們先手動(dòng)將hadoop102的NameNode啟動(dòng)起來,它目前是standby狀態(tài):
hdfs --daemon start namenode
Kill掉Hadoop103的NameNode進(jìn)程:
成功完成了NameNode的自動(dòng)故障轉(zhuǎn)移!
原理
:在備機(jī)準(zhǔn)備上位的時(shí)候,它不管現(xiàn)在的主節(jié)點(diǎn)是不是真的掛機(jī)了,他都會使用遠(yuǎn)程登錄技術(shù)ssh登錄到主機(jī)上, 使用 killall namenode (這個(gè)killall就是psmisc插件的命令) 殺死它的namenode進(jìn)程確保它真的結(jié)束了,有效的防止了出現(xiàn)“腦裂”的問題。
- 法二:修改hdfs-site.xml文件
ZFKC的機(jī)制中,HealthMonitor定期去檢查namenode的健康狀態(tài),如果我們殺掉namenode的服務(wù),該namenode及其端口都關(guān)閉了。
推測因?yàn)闊o法正常通信所以保守確定namenode是否真的失效的等等時(shí)間大大延長。
那么如何解決這個(gè)問題呢?
就是在hdfs-site.xml文件配置隔離機(jī)制的地方加上一行shell(/bin/true),改為:
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
這里不再演示效果,大家可以自行嘗試哦!
八、日后HA啟動(dòng)方式??
之后即可使用 myHA 腳本進(jìn)行啟停了!
九、結(jié)語??
以上就是本期要跟大家分享的全部內(nèi)容了!
初心對于Hadoop HA的理解就是這些了,希望能幫助到大家!
如果你有更好的、更快速的方法,希望各位大佬不吝賜教哦。
十、投票調(diào)查??
你的Hadoop HA高可用搭建好了嗎?
歡迎投票反饋哦!遇到任何問題,記得私信,給我留言~~
??????文章來源:http://www.zghlxwxcb.cn/news/detail-464153.html
最后,小伙伴們的點(diǎn)贊就是給初心最大的支持,能不能給初心來一個(gè)一鍵三連呢?謝謝支持。文章來源地址http://www.zghlxwxcb.cn/news/detail-464153.html
到了這里,關(guān)于大數(shù)據(jù) | Hadoop HA高可用搭建保姆級教程(大二學(xué)長的萬字筆記)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!