Hadoop HA分布式集群搭建
注意:apache提供的hadoop-2.7.5的安裝包是在32位操作系統(tǒng)編譯的赎败,因?yàn)閔adoop依賴(lài)一些C++的本地庫(kù)审胸,所以如果在64位的操作上安裝hadoop-2.7.5就需要重新在64操作系統(tǒng)上重新編
hadoop-2.2.0中依然存在一個(gè)問(wèn)題靴跛,就是ResourceManager只有一個(gè)扔茅,存在單點(diǎn)故障赡勘,從hadoop-2.4.1開(kāi)始解決了這個(gè)問(wèn)題从橘,有兩個(gè)ResourceManager矩距,一個(gè)是Active拗盒,一個(gè)是Standby,狀態(tài)由zookeeper進(jìn)行協(xié)調(diào)剩晴。
集群規(guī)劃
主機(jī)名 | IP | 安裝的軟件 | 運(yùn)行的進(jìn)程 |
---|---|---|---|
hdfs02 | 192.168.174.112 | jdk锣咒、hadoop | NameNode侵状、DFSZKFailoverController(zkfc) |
hdfs03 | 192.168.174.113 | jdk、hadoop | NameNode毅整、DFSZKFailoverController(zkfc) |
hdfs04 | 192.168.174.114 | jdk趣兄、hadoop | ResourceManager |
hdfs05 | 192.168.174.115 | jdk、hadoop | ResourceManager |
hdfs06 | 192.168.174.116 | jdk悼嫉、hadoop艇潭、zookeeper | DataNode、NodeManager戏蔑、JournalNode蹋凝、QuorumPeerMain |
hdfs07 | 192.168.174.117 | jdk、hadoop总棵、zookeeper | DataNode鳍寂、NodeManager、JournalNode情龄、QuorumPeerMain |
hdfs08 | 192.168.174.118 | jdk迄汛、hadoop、zookeeper | DataNode骤视、NodeManager鞍爱、JournalNode、QuorumPeerMain |
說(shuō)明:
在hadoop2.0中通常由兩個(gè)NameNode組成专酗,一個(gè)處于active狀態(tài)睹逃,另一個(gè)處于standby狀態(tài)。 Active NameNode對(duì)外提供服務(wù)祷肯,而Standby NameNode則不對(duì)外提供服務(wù)沉填,僅同步active namenode的狀態(tài),以便能夠在它失敗時(shí)快速進(jìn)行切換躬柬。 hadoop2.0官方提供了兩種HDFS HA的解決方案拜轨,一種是NFS,另一種是QJM允青。這里我們使用簡(jiǎn)單的QJM。 在該方案中卵沉,主備N(xiāo)ameNode之間通過(guò)一組JournalNode同步元數(shù)據(jù)信息颠锉,一條數(shù)據(jù)只要成功寫(xiě)入多數(shù)JournalNode即認(rèn)為寫(xiě)入成功。 通常配置奇數(shù)個(gè)JournalNode這里還配置了一個(gè)zookeeper集群史汗,用于ZKFC(DFSZKFailoverController)故障轉(zhuǎn)移琼掠,當(dāng)Active NameNode掛掉了,會(huì)自動(dòng)切換Standby NameNode為standby狀態(tài)
關(guān)閉防火墻
sudo systemctl stop firewalld
創(chuàng)建新的用戶(hù)
root用戶(hù)操作
[root@hdfs02 ~]# adduser admin
為這個(gè)用戶(hù)初始化密碼停撞,linux會(huì)判斷密碼復(fù)雜度瓷蛙,不過(guò)可以強(qiáng)行忽略:
[root@hdfs02 ~]# passwd admin
更改用戶(hù) es 的密碼 悼瓮。
新的 密碼:
無(wú)效的密碼: 密碼未通過(guò)字典檢查 - 過(guò)于簡(jiǎn)單化/系統(tǒng)化
重新輸入新的 密碼:
passwd:所有的身份驗(yàn)證令牌已經(jīng)成功更新。
給新用戶(hù)賦予sudo無(wú)秘權(quán)限
root用戶(hù)操作
[root@hdfs02 ~]# vi /etc/sudoers
添加 : USERNAME ALL=(ALL) NOPASSWD:ALL
此時(shí)切換到新創(chuàng)建的用戶(hù)(admin),以下的所有操作都將在admin用戶(hù)下操作,所有的文件都上傳到/home/admin 路徑下
安裝JDK
解壓配置環(huán)境變量即可使用
[admin@hdfs02 ~]# sudo mkdir -p /opt/env
[admin@hdfs02 ~]# sudo chown -R admin:admin /opt/env
將jdk解壓到env目錄下
tar -zxvf jdk-8u131-linux-x64.tar.gz -C /opt/env
配置環(huán)境變量
export JAVA_HOME=/opt/env/jdk1.8.0_131
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
[admin@hdfs02 ~]# source /etc/profile
#自JDK1.7之后 CLASSPATH 可以不配置
配置hosts
sudo vi /etc/hosts
192.168.174.112 hdfs02
192.168.174.113 hdfs03
192.168.174.114 hdfs04
192.168.174.115 hdfs05
192.168.174.116 hdfs06
192.168.174.117 hdfs07
192.168.174.118 hdfs08
以上的操作需要在每一臺(tái)設(shè)備都要操作
安裝zookeeper
根據(jù)我們的部署規(guī)劃艰猬,我們將會(huì)在hdfs06,hdfs07,hdfs08下安裝zookeeper集群横堡。 接下來(lái)的操作在以上提到的這三臺(tái)機(jī)器上執(zhí)行。
上傳zookeeper安裝包并解壓到相應(yīng)的目錄下
sudo mkdir -p /opt/zookeeper
sudo chown -R admin:admin /opt/zookeeper
tar -zxvf zookeeper-3.4.11.tar.gz -C /opt/zookeeper
sudo chown -R admin:admin /opt/zookeeper
修改配置文件
# cd /opt/zookeeper/zookeeper-3.4.11/conf/
# cp zoo_sample.cfg zoo.cfg
# vi zoo.cfg
修改:dataDir=/opt/zookeeper/data
在最后添加:
server.1=hdfs06:2888:3888
server.2=hdfs07:2888:3888
server.3=hdfs08:2888:3888
保存退出
然后創(chuàng)建一個(gè)data文件夾
mkdir /opt/zookeeper/data
最后穿件myid文件并追加內(nèi)容
echo 1 > /opt/zookeeper/data/myid
將配置好的zookeeper拷貝到其他節(jié)點(diǎn)
# scp -r /opt/zookeeper/ root@hdfs07:/opt/
# scp -r /opt/zookeeper/ root@hdfs08:/opt/
去以上兩臺(tái)機(jī)器上將文件的權(quán)限修改為admin
sudo chown -R admin:admin /opt/zookeeper
注意:修改hdfs07冠桃、hdfs08對(duì)應(yīng)/opt/zookeeper/data/myid內(nèi)容
hdfs07: echo 2 > /opt/zookeeper/data/myid
hdfs08: echo 3 > /opt/zookeeper/data/myid
安裝Hadoop
免密策略
hdfs的免密策略
根據(jù)我們的部署規(guī)劃命贴,我們?cè)趆dfs02,hdfs03,hdfs06,hdfs07,hdfs08上啟動(dòng)了相應(yīng)的進(jìn)程。 因?yàn)槲覀儐?dòng)想要在hdfs02上啟動(dòng)hdfs食听,那么我們其他的機(jī)器就要對(duì)hdfs02免密胸蛛,因?yàn)閔dfs02要通過(guò)ssh去相應(yīng)的機(jī)器上啟動(dòng)相應(yīng)的進(jìn)程。 同時(shí)不要忘了樱报,自己還在在本機(jī)上啟動(dòng)namenode葬项,所以還要對(duì)自己免密。
yarn的免密策略
根據(jù)我們的部署規(guī)劃迹蛤,我們?cè)趆dfs04,hdfs05,hdfs06,hdfs07,hdfs08上啟動(dòng)了相應(yīng)的進(jìn)程民珍。 因?yàn)槲覀儐?dòng)想要在hdfs04上啟動(dòng)yarn,那么我們其他的機(jī)器就要對(duì)hdfs04免密笤受,因?yàn)閔dfs04要通過(guò)ssh去相應(yīng)的機(jī)器上啟動(dòng)相應(yīng)的進(jìn)程穷缤。 但是yarn的啟動(dòng)resourcemanager方式和hdfs啟動(dòng)namenode的方式有些不同,yarn啟動(dòng)resourcemanager的方式是啟動(dòng)的本地進(jìn)程箩兽。 而通過(guò)ssh去啟動(dòng)的nodemanager津肛,而且standby resourcemanager 也需要手動(dòng)單獨(dú)去啟動(dòng)
ssh 的配置命令
# 以下命令只在hdfs02和hdfs04上執(zhí)行即可
ssh_keygen –t rsa 一路回車(chē),什么都不輸入
sudo service sshd start/stop/status/restart
sudo chkconfig sshd on 設(shè)置SSH開(kāi)機(jī)啟動(dòng)
# 接下來(lái)將我們的密鑰發(fā)送到需要對(duì)我們免密的服務(wù)器
hdfs(在hdfs02上執(zhí)行)
ssh-copy-id admin@192.168.174.112 yes PASSWORD 配置設(shè)備免密
ssh-copy-id admin@192.168.174.113 yes PASSWORD 配置設(shè)備免密
ssh-copy-id admin@192.168.174.116 yes PASSWORD 配置設(shè)備免密
ssh-copy-id admin@192.168.174.117 yes PASSWORD 配置設(shè)備免密
ssh-copy-id admin@192.168.174.118 yes PASSWORD 配置設(shè)備免密
yarn(在hdfs04上執(zhí)行)
ssh-copy-id admin@192.168.174.116 yes PASSWORD 配置設(shè)備免密
ssh-copy-id admin@192.168.174.117 yes PASSWORD 配置設(shè)備免密
ssh-copy-id admin@192.168.174.118 yes PASSWORD 配置設(shè)備免密
上傳Hadoop安裝包并解壓到相應(yīng)的目錄下
# 創(chuàng)建data目錄用于存放hdfs的文件
sudo mkdir -p /opt/hadoop/data
sudo chown -R admin:admin /opt/hadoop
# tar -zxvf hadoop-2.7.5-x64.tar.gz -C /opt/hadoop/
創(chuàng)建journaldata目錄用于存放journal的數(shù)據(jù)
只需要在hdfs06,hdfs07,hdfs08上創(chuàng)建即可
sudo mkdir -p /opt/hadoop/journaldata
sudo chown -R admin:admin /opt/hadoop
修改Hadoop配置
# hadoop2.x的配置文件全部在$HADOOP_HOME/etc/hadoop下
# cd /opt/hadoop/hadoop-2.7.5/etc/hadoop
File1:hadoop-env.sh
vi /opt/hadoop/hadoop-2.7.5/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/opt/env/jdk1.8.0_131
File2:core-site.xml
vi /opt/hadoop/hadoop-2.7.5/etc/hadoop/core-site.xml
<configuration>
<!-- 指定hdfs的nameservice為ns1 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs02://ns1/</value>
</property>
<!-- 指定hadoop臨時(shí)目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/data</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>hdfs06:2181,hdfs07:2181,hdfs08:2181</value>
</property>
</configuration>
File3:hdfs-site.xml
vi /opt/hadoop/hadoop-2.7.5/etc/hadoop/hdfs-site.xml
<configuration>
<!--指定hdfs的nameservice為ns1汗贫,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<!-- ns1下面有兩個(gè)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>hdfs02:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>hdfs02:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>hdfs03:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>hdfs03:50070</value>
</property>
<!-- 指定NameNode的元數(shù)據(jù)在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hdfs06:8485;hdfs07:8485;hdfs08:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盤(pán)存放數(shù)據(jù)的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/hadoop/journaldata</value>
</property>
<!-- 開(kāi)啟NameNode失敗自動(dòng)切換 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失敗自動(dòng)切換實(shí)現(xiàn)方式 -->
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔離機(jī)制方法落包,多個(gè)機(jī)制用換行分割部蛇,即每個(gè)機(jī)制暫用一行-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 使用sshfence隔離機(jī)制時(shí)需要ssh免登陸 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/admin/.ssh/id_rsa</value><!-- 這個(gè)是安裝用戶(hù)的ssh的id_rsa文件的路徑,我使用的是admin用戶(hù) -->
</property>
<!-- 配置sshfence隔離機(jī)制超時(shí)時(shí)間 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
File4:mapred-site.xml
mv mapred-site.xml.template mapred-site.xml
vi /opt/hadoop/hadoop-2.7.5/etc/hadoop/mapred-site.xml
<configuration>
<!-- 指定mr框架為yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
File5:yarn-site.xml
vi /opt/hadoop/hadoop-2.7.5/etc/hadoop/yarn-site.xml
<configuration>
<!-- 開(kāi)啟RM高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</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>hdfs04</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hdfs05</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hdfs06:2181,hdfs07:2181,hdfs08:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
File6:slaves
slaves是指定子節(jié)點(diǎn)的位置咐蝇,因?yàn)橐趆dfs01上啟動(dòng)HDFS涯鲁、在hdfs03啟動(dòng)yarn。
所以hdfs02上的slaves文件指定的是datanode的位置有序。
hdfs06
hdfs07
hdfs08
hdfs04上的slaves文件指定的是nodemanager的位置
hdfs06
hdfs07
hdfs08
由于我們現(xiàn)實(shí)生產(chǎn)環(huán)境中抹腿,為了避免過(guò)多的網(wǎng)絡(luò)開(kāi)銷(xiāo),我驚經(jīng)常將nodemanager和datanode部署在相同節(jié)點(diǎn)上旭寿,所以slaves的文件配置也相同
vi /opt/hadoop/hadoop-2.7.5/etc/hadoop/slaves
刪除localhost
添加如下:
hdfs06
hdfs07
hdfs08
將配置好的hadoop發(fā)送到其他節(jié)點(diǎn)
# scp -r /opt/hadoop/ root@hdfs03:/opt/
# scp -r /opt/hadoop/ root@hdfs04:/opt/
# scp -r /opt/hadoop/ root@hdfs05:/opt/
# scp -r /opt/hadoop/ root@hdfs06:/opt/
# scp -r /opt/hadoop/ root@hdfs07:/opt/
# scp -r /opt/hadoop/ root@hdfs08:/opt/
# 記得將這幾臺(tái)設(shè)備的文件的權(quán)限交給admin用戶(hù)
sudo chown -R admin:admin /opt/hadoop
啟動(dòng)Hadoop HA集群
啟動(dòng)zookeeper
分別在在號(hào)hdfs06警绩、hdfs07、hdfs08上執(zhí)行
# cd /opt/zookeeper/zookeeper-3.4.11/bin/
# ./zkServer.sh start
#查看狀態(tài):一個(gè)leader盅称,兩個(gè)follower
# ./zkServer.sh status
啟動(dòng)journalnode(分別在hdfs06肩祥、hdfs07后室、hdfs08上執(zhí)行)
首次啟動(dòng)要單獨(dú)啟動(dòng)這個(gè)進(jìn)程,以后就不需要了混狠。(因?yàn)槲覀冊(cè)谶M(jìn)行namenode format時(shí)需要連接JournalNode監(jiān)聽(tīng)的8485端口)
# cd /opt/hadoop/hadoop-2.7.5
# sbin/hadoop-daemon.sh start journalnode
#運(yùn)行jps命令檢驗(yàn)岸霹,hdfs06、hdfs07檀蹋、hdfs08上多了JournalNode進(jìn)程
格式化HDFS(在hdfs02上執(zhí)行即可)
# cd /opt/hadoop/hadoop-2.7.5
#在hdfs02上執(zhí)行命令:
# bin/hdfs namenode -format
#格式化后會(huì)在根據(jù)core-site.xml中的hadoop.tmp.dir配置生成個(gè)文件松申,這里我配置的是/opt/hadoop/data,然后將/opt/hadoop/data拷貝到hdfs03的/opt/hadoop/下俯逾。
scp -r /opt/hadoop/data hdfs03:/opt/hadoop/
##也可以這樣贸桶,建議hdfs namenode -bootstrapStandby
格式化ZKFC(在hdfs02上執(zhí)行即可)
# bin/hdfs zkfc -formatZK
啟動(dòng)HDFS(在hdfs02上執(zhí)行即可)
# sbin/start-dfs.sh
啟動(dòng)YARN
注意:是在hdfs04上執(zhí)行start-yarn.sh,把namenode和resourcemanager分開(kāi)是因?yàn)樾阅軉?wèn)題桌肴,因?yàn)樗麄兌家加么罅抠Y源皇筛,所以把他們分開(kāi)了,他們分開(kāi)了就要分別在不同的機(jī)器上啟動(dòng))
# cd /opt/hadoop/hadoop-2.7.5
# sbin/start-yarn.sh
# 在hdfs05上單獨(dú)啟動(dòng)resourcemanager
# cd /opt/hadoop/hadoop-2.7.5
# sbin/yarn-daemon.sh start resourcemanager
訪問(wèn)Hadoop頁(yè)面監(jiān)控
http://192.168.174.112:50070
NameNode 'hdfs02:9000' (active)
http://192.168.174.113:50070
NameNode 'hdfs03:9000' (standby)
http://192.168.174.114:8088
ResourceManager 'hdfs04:8088' (active)
http://192.168.174.115:8088
ResourceManager 'hdfs05:8088' (standby)
驗(yàn)證HA集群
驗(yàn)證HDFS HA
首先向hdfs上傳一個(gè)文件
hadoop fs -put /etc/profile /profile
hadoop fs -ls /
然后再kill掉active的NameNode
kill -9 <pid of NN>
通過(guò)瀏覽器訪問(wèn):http://192.168.174.113:50070
NameNode 'hdfs03:9000' (active)
這個(gè)時(shí)候hdfs03上的NameNode變成了active
在執(zhí)行命令:
hadoop fs -ls /
-rw-r--r-- 3 root supergroup 1926 2018-01-06 15:36 /profile
剛才上傳的文件依然存在W蛊摺K住!
手動(dòng)啟動(dòng)那個(gè)掛掉的NameNode
sbin/hadoop-daemon.sh start namenode
通過(guò)瀏覽器訪問(wèn):http://192.168.174.112:50070
NameNode 'hdfs02:9000' (standby)
驗(yàn)證YARN
運(yùn)行一下hadoop提供的demo中的WordCount程序:
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.5.jar wordcount /profile /out
高可用集群的安裝
centos安裝 zip unzip 命令 yum -y install zip unzip