Hadoop2對HDFS的改進(jìn)很大,支持HDFS(NameNode) 和ResourceManager高可用性,避免集群中單點(diǎn)故障造成整個集群不可用。那么,從本文開始將部署一套高可用Hadoop集群及家族中相關(guān)開源系統(tǒng),具體根據(jù)下面規(guī)劃來,本文只部署高可用Hadoop集群,后續(xù)很快更新其他軟件部署及使用。
一、部署前準(zhǔn)備
操作系統(tǒng):CentOS7_x64
安裝目錄:/opt
1. 節(jié)點(diǎn)分配
HostNameIPHadoopHBaseZookeeperHive
HMaster0192.168.18.215NameNodeHMaster/Hive
HMaster1192.168.18.216NameNodeHMaster/Hive-client
HSlave0192.168.18.217DataNodeHRegionServerQuorumPeerMain/
HSlave1192.168.18.218DataNodeHRegionServerQuorumPeerMain/
HSlave2192.168.18.219DataNodeHRegionServerQuorumPeerMain/
2. 版本及功能
軟件名
版本號功能
Hadoophadoop-2.6.0.tar.gz為海量數(shù)據(jù)提供分布式存儲(HDFS)和分布式計算(YARN)。
HBasehbase-1.0.1.1-src.tar.gz基于Hadoop的分布式、面向列的NoSQL數(shù)據(jù)庫,適用于非結(jié)構(gòu)化數(shù)據(jù)存儲的數(shù)據(jù)庫。
Zookeeperzookeeper-3.4.6.tar.gz一個分布式應(yīng)用程序協(xié)調(diào)服務(wù),為應(yīng)用提供一致性服務(wù),是Hadoop和Hbase的重要組件。
Hiveapache-hive-1.2.0-bin.tar.gz基于Hadoop的一個數(shù)據(jù)倉庫工具,將結(jié)構(gòu)化的數(shù)據(jù)文件映射成一張表,并提供簡單的SQL查詢功能,將SQL語句轉(zhuǎn)換為MapReduce任務(wù)運(yùn)行處理。
Phoenix
phoenix-4.4.0-HBase-1.0-bin.tar.gzHbase的SQL驅(qū)動,Phoenix讓Hbase支持以JDBC方式訪問,并將SQL查詢轉(zhuǎn)換成Hbase的掃描和相應(yīng)的操作。
JDKjdk-7u79-linux-x64.gzJAVA運(yùn)行環(huán)境
Hadoop生態(tài)系統(tǒng)下載地址:http://www.apache.org/dist/
JDK下載地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
3. 邏輯結(jié)構(gòu)圖
NameNode(NN) HA實現(xiàn)方式:
一種是將NN維護(hù)的元數(shù)據(jù)保存一份到NFS上,當(dāng)NN故障,可以通過另一臺NNe讀取NFS目錄中的元數(shù)據(jù)備份進(jìn)行恢復(fù)工作,需要手動進(jìn)行操作,并不是真正意義上的HA方案。
另一種是準(zhǔn)備一臺備用NN節(jié)點(diǎn),通過定期下載NN的元數(shù)據(jù)和日志文件來備份,當(dāng)NN故障時,可以通過這臺進(jìn)行恢復(fù),由于主備節(jié)點(diǎn)元數(shù)據(jù)和日志并不是實時同步,所以會丟失一些數(shù)據(jù)。
前兩種方案都不是很理想,社區(qū)提供一種更好的方案,基于QJM(Qurom Journal Manager)的共享日志方案。QJM的基本原理是NN(Active)把日志寫本地和2N+1(奇數(shù))臺JournalNode上,當(dāng)數(shù)據(jù)操作返回成功時才寫入日志,這個日志叫做editlog,而元數(shù)據(jù)存在fsimage文件中,NN(Standby)定期從JournalNode上讀取editlog到本地。在這手動切換的基礎(chǔ)上有開發(fā)了基于Zookeeper的ZKFC(ZookeeperFailover Controller)自動切換機(jī)制,Active和Standby節(jié)點(diǎn)各有ZKFC進(jìn)程監(jiān)控NN監(jiān)控狀況,定期發(fā)送心跳,當(dāng)Active節(jié)點(diǎn)故障時Standby會自動切換為ActiveNode,我們這次就用的此方案,如下圖所示。
ResourceManager(RM) HA實現(xiàn)方式:
RM將狀態(tài)信息存儲在Zookeeper中,當(dāng)Active故障,Standby切換為Active后,從ZK讀取相應(yīng)的作業(yè)信息,重新構(gòu)建作業(yè)的內(nèi)存信息,然后開始接受NodeManager心跳,并接受客戶端提交作業(yè)的請求等。
二、搭建高可用Hadoop集群
1.基礎(chǔ)環(huán)境配置
1.1 安裝JDK(每臺配置)
1
2
3
4
5
6
7
8
# tar zxvf jdk-7u79-linux-x64.gz
# mv jdk1.7.0_79 /usr/local/jdk1.7
# vi /etc/profile
JAVA_HOME=/usr/local/jdk1.7
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export JAVA_HOME PATH CLASSPATH
# source /etc/profile #使配置生效
1.2 修改主機(jī)名,并添加hosts文件(每臺配置)
1
2
3
# hostname HMaster0
# vi /etc/hostname
HMaster0
1
2
3
4
5
6
7
8
# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4localhost4.localdomain4
::1 localhost localhost.localdomainlocalhost6 localhost6.localdomain6
192.168.18.215 HMaster0
192.168.18.216 HMaster1
192.168.18.217 HSlave0
192.168.18.218 HSlave1
192.168.18.219 HSlave2
1.3 配置SSH無密碼登陸(在HMaster1做同樣的操作)
1
2
3
4
5
6
7
8
9
10
11
12
# ssh-kegen #一直回車創(chuàng)建秘鑰對
[root@HMaster0]# cat /root/.ssh/id_rsa.pub > /root/.ssh/authorized_keys
[root@HMaster0]# scp /root/.ssh/authorized_keys root@HMaster0:/root/.ssh
[root@HMaster0]# scp /root/.ssh/authorized_keys root@HMaster1:/root/.ssh
[root@HMaster0]# scp /root/.ssh/authorized_keys root@HSlave0:/root/.ssh
[root@HMaster0]# scp /root/.ssh/authorized_keys root@HSlave1:/root/.ssh
[root@HMaster0]# scp /root/.ssh/authorized_keys root@HSlave2:/root/.ssh
[root@HMaster0]# ssh root@HMaster0 'chmod 600 /root/.ssh/authorized_keys && chmod 700 /root/.ssh'
[root@HMaster0]# ssh root@HMaster1 'chmod 600 /root/.ssh/authorized_keys && chmod 700 /root/.ssh'
[root@HMaster0]# ssh root@HSlave0 'chmod 600 /root/.ssh/authorized_keys && chmod 700 /root/.ssh'
[root@HMaster0]# ssh root@HSlave1 'chmod 600 /root/.ssh/authorized_keys && chmod 700 /root/.ssh'
[root@HMaster0]# ssh root@HSlave2 'chmod 600 /root/.ssh/authorized_keys && chmod 700 /root/.ssh'
現(xiàn)在就可以不用密碼登陸某一臺了。
2. Zookeeper集群安裝與配置(三臺HSlave配置)
2.1 安裝與配置
1
2
3
4
# tar zxvf zookeeper-3.4.6.tar.gz
# mv zookeeper-3.4.6 /opt
# cd /opt/zookeeper-3.4.6/conf
# cp zoo_sample.cfg zoo.cfg
1
2
3
4
5
6
7
8
9
10
# vi zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/zookeeper/data
dataLogDir=/home/zookeeper/logs
clientPort=2181
server.0=HSlave0:2888:3888
server.1=HSlave1:2888:3888
server.2=HSlave2:2888:3888
參數(shù)說明:
tickTime:ZK服務(wù)器之間或客戶端與服務(wù)器之間間隔多長時間發(fā)送一個心跳,單位毫秒
initLimit:ZK服務(wù)器集群中連接Leader的Follower服務(wù)器初始化連接時最長忍受多長心跳時間間隔(5*20000=10s)
syncLimit:標(biāo)識Leader與Follower同步消息,如果超過時間(5*2000=10s),未完成同步,將剔除這個節(jié)點(diǎn),所有連接此Follower服務(wù)器的客戶端將連接到另一個Foolower服務(wù)器上
dataDir:ZK保存數(shù)據(jù)的目錄,默認(rèn)情況下,ZK也會將日志文件保存在此目錄
dataLogDir:指定日志文件目錄
clientPort:客戶端連接ZK服務(wù)器端口
server.0:第一個0代表第幾號ZK服務(wù)器,HSlave0是這個服務(wù)器的主機(jī)名或IP,2888是這個ZK服務(wù)器與集群中Leader服務(wù)器交換信息的端口,3888是Leader服務(wù)器出現(xiàn)故障時,用這個端口通信重新選舉,在選出一個新的Leader
2.2 創(chuàng)建目錄和id文件(三臺HSlave對應(yīng)操作)
# mkdir /home/zookeeper/data
# mkdir /home/zookeeper/logs
# vi /home/zookeeper/data/myid
0
#必須創(chuàng)建這個id,否則啟動會報錯。分別ZK集群節(jié)點(diǎn)創(chuàng)建myid號,myid一定對應(yīng)好zoo.cfg中配置的server后面0、1和2這個ZK號
2.3 分別啟動三個ZK節(jié)點(diǎn)(三臺HSlave操作)
# /opt/zookeeper-3.4.6/bin/zkServer.sh start
注意:每次都需要分別啟動ZK節(jié)點(diǎn),不能通過hadoop管理啟動
2.4 檢查是否啟動成功
分別查看ZK每個節(jié)點(diǎn)狀態(tài)可以看到有兩個follower節(jié)點(diǎn),一個leader節(jié)點(diǎn):
# /opt/zookeeper-3.4.6/bin/zkServer.sh status
1
2
3
4
5
6
JMX enabled by default
Using config:/opt/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
JMX enabled by default
Using config:/opt/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: leader
在集群任意一節(jié)點(diǎn)都會啟動一個進(jìn)程:
# jps
1990 QuorumPeerMain
博客地址:http://lizhenliang.blog.51cto.com
3. Hadoop安裝與配置(每臺都同樣配置)
3.1 安裝與配置
# tar zxvf hadoop-2.6.0.tar.gz
# mv hadoop-2.6.0 /opt
# cd /opt/hadoop-2.6.0/etc/hadoop
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# vi core-site.xml
<configuration>
<!--HDFS路徑邏輯名稱-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hcluster</value>
</property>
<!--Hadoop存放臨時文件位置-->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/tmp</value>
</property>
<!--使用的zookeeper集群地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>HSlave0:2181,HSlave1:2181,HSlave2:2181</value>
</property>
</configuration>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# vi hdfs-site.xml
<configuration>
<property>
<name>dfs.nameservices</name>
<value>hcluster</value>
</property>
<!--NameNode地址集群標(biāo)識(hcluster),最多兩個-->
<property>
<name>dfs.ha.namenodes.hcluster</name>
<value>HMaster0,HMaster1</value>
</property>
<!--HDFS文件系統(tǒng)數(shù)據(jù)存儲位置,可以分別保存到不同硬盤,突破單硬盤性能瓶頸,多個位置以逗號隔開-->
<property>
<name>dfs.data.dir</name>
<value>/home/hadoop/hdfs/data</value>
</property>
<!--數(shù)據(jù)副本數(shù)量,根據(jù)HDFS臺數(shù)設(shè)置,默認(rèn)3份-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hcluster.HMaster0</name>
<value>HMaster0:9000</value>
</property>
<!--RPC端口-->
<property>
<name>dfs.namenode.rpc-address.hcluster.HMaster1</name>
<value>HMaster1:9000</value>
</property>
<!--NameNode HTTP訪問地址-->
<property>
<name>dfs.namenode.http-address.hcluster.HMaster0</name>
<value>HMaster0:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.hcluster.HMaster1</name>
<value>HMaster1:50070</value>
</property>
<!--NN存放元數(shù)據(jù)和日志位置-->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hadoop/name</value>
</property>
<!--同時把NameNode元數(shù)據(jù)和日志存放在JournalNode上(/home/hadoop/journal/hcluster)-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://HSlave0:8485;HSlave1:8485;HSlave2:8485/hcluster</value>
</property>
<!--JournalNode上元數(shù)據(jù)和日志存放位置-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/journal</value>
</property>
<!--開啟NameNode失敗自動切換-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--NameNode失敗自動切換實現(xiàn)方式-->
<property>
<name>dfs.client.failover.proxy.provider.hcluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--隔離機(jī)制方法,確保任何時間只有一個NameNode處于活動狀態(tài)-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence(hdfs)
shell(/bin/true)</value>
</property>
<!--使用sshfence隔離機(jī)制要SSH免密碼認(rèn)證-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
</configuration>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# vi yarn-site.xml
<configuration>
<!--啟用RM高可用-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!--RM集群標(biāo)識符-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>rm-cluster</value>
</property>
<property>
<!--指定兩臺RM主機(jī)名標(biāo)識符-->
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!--RM故障自動切換-->
<property>
<name>yarn.resourcemanager.ha.automatic-failover.recover.enabled</name>
<value>true</value>
</property>
<!--RM故障自動恢復(fù)
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property> -->
<!--RM主機(jī)1-->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>HMaster0</value>
</property>
<!--RM主機(jī)2-->
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>HMaster1</value>
</property>
<!--RM狀態(tài)信息存儲方式,一種基于內(nèi)存(MemStore),另一種基于ZK(ZKStore)-->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<!--使用ZK集群保存狀態(tài)信息-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>HSlave0:2181,HSlave1:2181,HSlave2:2181</value>
</property>
<!--向RM調(diào)度資源地址-->
<property>
<name>yarn.resourcemanager.scheduler.address.rm1</name>
<value>HMaster0:8030</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.rm2</name>
<value>HMaster1:8030</value>
</property>
<!--NodeManager通過該地址交換信息-->
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm1</name>
<value>HMaster0:8031</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm2</name>
<value>HMaster1:8031</value>
</property>
<!--客戶端通過該地址向RM提交對應(yīng)用程序操作-->
<property>
<name>yarn.resourcemanager.address.rm1</name>
<value>HMaster0:8032</value>
</property>
<property>
<name>yarn.resourcemanager.address.rm2</name>
<value>HMaster1:8032</value>
</property>
<!--管理員通過該地址向RM發(fā)送管理命令-->
<property>
<name>yarn.resourcemanager.admin.address.rm1</name>
<value>HMaster0:8033</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address.rm2</name>
<value>HMaster1:8033</value>
</property>
<!--RM HTTP訪問地址,查看集群信息-->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>HMaster0:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>HMaster1:8088</value>
</property>
</configuration>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# vi mapred-site.xml
<configuration>
<!--指定MR框架為YARN-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 配置 MapReduce JobHistory Server地址 ,默認(rèn)端口10020 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>0.0.0.0:10020</value>
</property>
<!-- 配置 MapReduce JobHistory Server HTTP地址, 默認(rèn)端口19888 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>0.0.0.0:19888</value>
</property>
</configuration>
1
2
# vi hadoop-env.sh
將export JAVA_HOME=${JAVA_HOME}修改為我們安裝的JDK路徑 export JAVA_HOME=/usr/local/jdk1.7
1
2
3
4
# vi slaves
HSlave0
HSlave1
HSlave2
# 配置變量,方便使用hadoop命令
1
2
3
4
5
# vi /etc/profile
HADOOP_HOME=/opt/hadoop-2.6.0
PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HADOOP_HOME PATH
# source /etc/profile
3.1 對NameNode(HMaster0)節(jié)點(diǎn)進(jìn)行格式化
# hadoop namenode -format
注意:格式化第二次有可能會造成DataNode無法啟動,原因是NameSpaceID不一致造成,解決方法是找出不一致的VERSION修改NameSpaceID,也可以嘗試刪除hdfs/data目錄。
3.2 啟動HMaster0(active)節(jié)點(diǎn)NameNode
# hadoop-daemon.sh start namenode
3.3 HMaster1節(jié)點(diǎn)上同步(HMaster0)元數(shù)據(jù)
# hdfs namenode -bootstrapStandby
3.4 在HMaster0格式化ZKFC
# hdfs zkfc -formatZK
3.5 在HMaster0節(jié)點(diǎn)啟動HDFS集群
# start-dfs.sh
3.6 在Master0節(jié)點(diǎn)啟動YARN集群
# start-yarn.sh
3.7 在Master1節(jié)點(diǎn)啟動RM
# yarn-daemon.sh start resourcemanager
3.8 以后也可以通過start-all.sh與stop-all.sh啟停Hadoop集群
3.9 驗證Hadoop集群(HDFS和YARN)是否啟動成功
# jps #在HMaster0節(jié)點(diǎn)可以看到
32040 DFSZKFailoverController #ZKFC用于監(jiān)控NameNode active和standby節(jié)點(diǎn)狀態(tài),并故障切換
30187 ResourceManager #YARN資源管理進(jìn)程
31934 NameNode #HDFS元數(shù)據(jù)進(jìn)程
13607 Jps #運(yùn)行jps命令時自身進(jìn)程
# jps #在HSlave0節(jié)點(diǎn)可以看到
13229 DataNode
31215 NodeManager
1990 QuorumPeerMain
13314 JournalNode
31390 Jps
# 通過訪問Hadoop提供的WEB,查看是否正常
從上圖可以看出,NameNode分為active和standby,ResouceManager也分為active和standby,也就是說,NN和RM均成功實現(xiàn)HA,當(dāng)你測試停止active節(jié)點(diǎn)上NN或者RM時,都會正常切換到standby節(jié)點(diǎn),這時再訪問WEB,狀態(tài)已經(jīng)改變。目前NN只支持兩臺做HA,RM HA支持多臺。
4. HDFS 操作命令
# hadoop dfsadmin -report #查看DataNode節(jié)點(diǎn)信息,可以使用這個命令腳本監(jiān)控DFS狀況
# hadoop fs -ls hdfs://hcluster:9000/ #指定HDFS地址訪問
# hadoop fs -ls / #列出HDFS文件系統(tǒng)目錄下文件和目錄
# hadoop fs -lsr / #遞歸列出目錄
# hadoop fs -mkdir /test #創(chuàng)建test目錄
# hadoop fs -put /root/test.txt /test/test.txt #上傳文件到test目錄
# hadoop fs -cat /test/test.txt #查看文件內(nèi)容
# hadoop fs -du /test/test.txt #查看文件大小
# hadoop fs -rm /test/test.txt #刪除文件
# hadoop fs -rmr /test #遞歸刪除目錄或文件
提醒:Hadoop配置較為復(fù)雜,往往會因為自己的一點(diǎn)點(diǎn)配置錯誤,造成服務(wù)無法啟動,不要心急,這時你應(yīng)該靜下心來仔細(xì)看看安裝目錄中l(wèi)ogs目錄下以.log結(jié)尾的日志,可幫助你解決問題。祝你好運(yùn)!
HBase1.0分布式NoSQL數(shù)據(jù)庫部署及使用請點(diǎn):
http://lizhenliang.blog.51cto.com/7876557/1665130