1.此教程默認(rèn)已經(jīng)搭建好完全分布式
2. Zookeeper 集群搭建
配置完全分布式zk集群
---------------------
1.挑選3臺主機(jī)
cs1 ~ cs3
2.每臺機(jī)器都安裝zk
tar
環(huán)境變量
3.配置zk配置文件
cs1 ~ cs3
[/home/ap/apps/zk/conf/zoo.cfg]
...
dataDir=/home/ap/zookeeper
4.在每臺主機(jī)的/home/centos/zookeeper中添加myid,內(nèi)容分別是1,2,3
[cs1]
$>echo 1 > /home/ap/zookeeper/myid
[cs2]
$>echo 2 > /home/ap/zookeeper/myid
[cs3]
$>echo 3 > /home/ap/zookeeper/myid
5.啟動服務(wù)器集群
$>zkServer.sh start
6.查看每臺服務(wù)器的狀態(tài)
$>zkServer.sh status
* 注意: 如果有3臺機(jī)器, 只啟動一臺的話, 會顯示如下, 因?yàn)楦鶕?jù)配置, 有3臺機(jī)器, 此時只有一臺啟動, 沒有過半數(shù), 整個集群是掛掉的
* 只有啟動的機(jī)器數(shù)量超過配置的半數(shù), zk 集群才有效.
3.HA 集群搭建
首先聲明
筆者用的6臺主機(jī), 主機(jī)名 cs1-cs6, 用戶名為ap, 可以對照改為自己的主機(jī)名&用戶名
另外, 搭建 HA 不會影響原來的完全分布式, 具體操作會在下面告知.
hadoop 安裝目錄層級結(jié)構(gòu):
/home/ap/apps/hadoop/etc/hadoop/hdfs-site.xml
data 目錄層級結(jié)構(gòu):
-
cs1:/home/ap/hadoopdata/namenode/current/edits_00.... -
cs2:/home/ap/hadoopdata/datanode/current/BP-15...
可以對照參考
集群結(jié)構(gòu)如下

開始搭建
首先保證 各節(jié)點(diǎn)直接的 ssh 免密登錄沒問題
- 如果非生產(chǎn)環(huán)境, 可以同時把
.ssh刪掉后, 全部重新生成ssh-keygen, 同時相互發(fā)送, 這樣操作最簡單, 效率最高.
其次上代碼了
- 把原本
/home/ap/apps/hadoop/etc/hadoop中的hadoop目錄改為full,意思是完全分布式. -
cp -r full ha, 復(fù)制一份 full 為 ha, 在這份配置文件中配置 HA -
ln -s /home/ap/apps/hadoop/etc/ha /home/ap/apps/hadoop/etc/hadoop, 用一個軟鏈接hadoop 指向 ha - 配置
/home/ap/apps/hadoop/etc/ha/hdfs-site.xml
[hdfs-site.xml]
------------------------------------------------------------------
<configuration>
<!-- 指定 2個 namenode 的命名空間 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- myucluster下的名稱節(jié)點(diǎn)兩個id -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- 配置每個nn的rpc地址。 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>cs1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>cs6:8020</value>
</property>
<!-- 配置webui端口 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>cs1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>cs6:50070</value>
</property>
<!-- 名稱節(jié)點(diǎn)共享編輯目錄. -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://cs2:8485;cs3:8485;cs4:8485/mycluster</value>
</property>
<!-- java類,client使用它判斷哪個節(jié)點(diǎn)是激活態(tài)。 -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 腳本列表或者java類,在容災(zāi)保護(hù)激活態(tài)的nn. -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- ssh免密登陸 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/ap/.ssh/id_rsa</value>
</property>
<!-- 配置 sshfence 隔離機(jī)制超時時間(可不配) -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<!-- 配置JN存放edit的本地路徑。 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/ap/hadoopdata/journal</value>
</property>
</configuration>
- 配置
core-site.xml, 這里給出完整配置 (目前不包括 Hive 配置)
[core-site.xml]
------------------------------------------------------------
<configuration>
<!-- 指定 hdfs 的 nameservice 為 mycluster -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- 指定 hadoop 工作目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/ap/hadoopdata</value>
</property>
<!-- 指定zk集群訪問地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>cs1:2181,cs2:2181,cs3:2181</value>
</property>
</configuration>
- 配置
mapred-site.xml
[mapred-site.xml]
-------------------
<configuration>
<!-- 指定 mr 框架為 yarn 方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 設(shè)置 mapreduce 的歷史服務(wù)器地址和端口號 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>cs1:10020</value>
</property>
<!-- mapreduce 歷史服務(wù)器的 web 訪問地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>cs1:19888</value>
</property>
</configuration>
- 把
/home/ap/apps/hadoop/etc/*發(fā)給其他所有節(jié)點(diǎn) 2-6- 注意: 軟鏈接scp 的時候會有問題, 最終保證每個節(jié)點(diǎn)跟 cs1一樣就可以了,可以每個節(jié)點(diǎn)單獨(dú)修改, 也可以寫腳本一起修改
ln -sfT /home/ap/apps/hadoop/etc/ha /home/ap/apps/hadoop/etc/hadoop
- 部署細(xì)節(jié)
0.在 zk 節(jié)點(diǎn)啟動 zkServer
cs1-cs3: $>zkServer.sh start
1.在jn節(jié)點(diǎn)分別啟動jn進(jìn)程
$>hadoop-daemon.sh start journalnode
2.啟動jn之后,在兩個NN之間進(jìn)行disk元數(shù)據(jù)同步
a)如果是全新集群,先format文件系統(tǒng),只需要在一個nn上執(zhí)行。
[cs1]
$>hadoop namenode -format
b)如果將非HA集群轉(zhuǎn)換成HA集群,復(fù)制原NN的metadata到另一個nn.
1.步驟一
[cs1]
$>scp -r /home/centos/hadoop/dfs ap@cs6:/home/centos/hadoop/
2.步驟二
在新的nn(未格式化的nn)上運(yùn)行一下命令,實(shí)現(xiàn)待命狀態(tài)引導(dǎo)。
[cs6]
$>hdfs namenode -bootstrapStandby //需要cs1為啟動狀態(tài),提示是否格式化,選擇N.
3.在一個NN上執(zhí)行以下命令,完成edit日志到j(luò)n節(jié)點(diǎn)的傳輸。
$>hdfs namenode -initializeSharedEdits
#查看cs2,cs3,cs4 這幾個 jn 節(jié)點(diǎn)是否有edit數(shù)據(jù).
4.啟動所有節(jié)點(diǎn).
[cs1]
$>hadoop-daemon.sh start namenode //啟動名稱節(jié)點(diǎn)
$>hadoop-daemons.sh start datanode //啟動所有數(shù)據(jù)節(jié)點(diǎn)
[2,3,4]
$>hadoop-daemon.sh start journalnode
[cs6]
$>hadoop-daemon.sh start namenode //啟動名稱節(jié)點(diǎn)
- HA 管理
# 查看web 界面, 是否是2個 standby 狀態(tài)
http://cs1:50070/
http://cs6:50070/
hdfs haadmin : 查看 ha 幫助
-----------------
$>hdfs haadmin -transitionToActive nn1 //切成激活態(tài)
$>hdfs haadmin -transitionToStandby nn1 //切成待命態(tài)
$>hdfs haadmin -transitionToActive --forceactive nn2//強(qiáng)行激活
$>hdfs haadmin -failover nn1 nn2 //模擬容災(zāi)演示,從nn1切換到nn2
- 加入 Zookeeper 容災(zāi)服務(wù) zkfc
<!-- 1.部署容災(zāi) -->
------------------------------
a.停止所有進(jìn)程
$>stop-all.sh
b.配置hdfs-site.xml,啟用自動容災(zāi).
[hdfs-site.xml]
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
c.配置core-site.xml,指定zk的連接地址.
<property>
<name>ha.zookeeper.quorum</name>
<value>cs1:2181,cs2:2181,cs3:2181</value>
</property>
d.分發(fā)以上兩個文件到所有節(jié)點(diǎn)。
<!-- 2.登錄其中的一臺NN(s201),在ZK中初始化HA狀態(tài),
創(chuàng)建 namenode 的 命名空間節(jié)點(diǎn) mycluster -->
------------------------------------
$>hdfs zkfc -formatZK
<!-- 3.啟動hdfs進(jìn)程. -->
$>start-dfs.sh
<!-- 4.查看 webUI, 是否有一臺自動切換為 active 狀態(tài)了 -->
http://cs1:50070/
http://cs6:50070/
<!-- 5.測試自動容災(zāi)(如果cs6是活躍節(jié)點(diǎn)) -->
$>kill -9 cs6的 namenode進(jìn)程號
觀察 cs1:50070的狀態(tài)變化
- 配置RM的HA自動容災(zāi)
1.配置yarn-site.xml
<configuration>
<!-- 是否允許高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- Identifies the cluster. Used by the elector to ensure an RM doesn’t take over as Active for another cluster. -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster1</value>
</property>
<!-- RM 的 id -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 2臺 RM 的宿主 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>cs1</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>cs6</value>
</property>
<!-- 配置web界面 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>cs1:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>cs6:8088</value>
</property>
<!-- zookeeper 地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>cs1:2181,cs2:2181,cs3:2181</value>
</property>
<!-- YARN 集群為 MapReduce 程序提供的 shuffle 服務(wù)(原本的) -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- ===========以下是可選的============= -->
<!-- 開啟 YARN 集群的日志聚合功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- YARN 集群的聚合日志最長保留時長 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>86400</value>
</property>
<!-- 啟用自動恢復(fù) -->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!-- 指定 resourcemanager 的狀態(tài)信息存儲在 zookeeper 集群上-->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
</configuration>
------------------------------------------------------------------
2.使用管理命令
<!-- 查看狀態(tài) -->
$>yarn rmadmin -getServiceState rm1
<!-- 切換狀態(tài)到standby -->
$>yarn rmadmin -transitionToStandby rm1
3.啟動yarn集群
$>start-yarn.sh
4.hadoop沒有啟動兩個resourcemanager,需要手動啟動另外一個
$>yarn-daemon.sh start resourcemanager
5.查看webUI, 點(diǎn)擊 About, 查看 active 或 standby
http://cs1:8088
http://cs6:8088
6.做容災(zāi)模擬.
kill -9 活躍的 RM 端口號
7.注意: 如果容災(zāi)失敗, 檢查下每臺主機(jī)時間是否同步
$>sudo ntpdate ntp1.aliyun.com
至此, 大功告成
4.HA 集群的啟動/關(guān)閉
4.1 HA 的啟動
一:單點(diǎn)啟動
啟動 zk 服務(wù) QuorumPeerMain, 否則后面 RM 會起不來,連不上 ZK 服務(wù)
cs1-cs3: $>zkServer.sh start啟動 namenode/datanode
cs1,cs6: $>hadoop-daemon.sh start namenode
cs1/cs6: $>hadoop-daemons.sh start datanode
cs6: $>hadoop-daemon.sh start namenode啟動 journalnode
cs2-cs4: $>hadoop-daemon.sh start journalnode啟動RM (RM 會自動選出一個 active)
cs1,cs6: $>yarn-daemon.sh start resourcemanager
cs1/cs6: $>yarn-daemons.sh start nodemanager啟動 zk 的 DFSZKFailoverController
cs1,cs6: $>hadoop-daemon.sh start zkfc此外可以啟動MapReduce 的歷史任務(wù)服務(wù)器
[ap@cs1]$> mr-jobhistory-daemon.sh start historyserver
然后訪問配置的 http://cs1:19888/jobhistory
二:懶漢啟動
啟動 zk 服務(wù) QuorumPeerMain, 否則后面 RM 會起不來,連不上 ZK 服務(wù)
cs1-cs3: $>zkServer.sh start-
執(zhí)行啟動全部
cs1: $>
start-all.sh(RM 節(jié)點(diǎn))或者, 使用新的啟動方式
cs1: $>
start-dfs.sh(任意節(jié)點(diǎn))cs1: $>
start-yarn.sh(在 RM 節(jié)點(diǎn)) -
另一個 RM 節(jié)點(diǎn)不會自己啟動,要手動啟動
cs6: $>
yarn-daemon.sh start resourcemanager
4.2 HA 的關(guān)閉
在 一臺NN 上stop-all.sh, 注意 zk 的 server- QuorumPeerMain不會停掉
5.簡單時間同步腳本
# 在所有機(jī)器上寫定時任務(wù)
crontab -e
* */1 * * * /usr/sbin/ntpdate time1.aliyun.com