聲明:作者原創,轉載注明出處。
作者:帥氣陳吃蘋果
一、服務器環境
主機名 | IP | 用戶名 | 密碼 | 安裝目錄 |
---|---|---|---|---|
master188 | 192.168.29.188 | hadoop | hadoop | /home/hadoop/ |
master189 | 192.168.29.189 | hadoop | hadoop | /home/hadoop/ |
slave190 | 192.168.29.190 | hadoop | hadoop | /home/hadoop/ |
二、集群規划
master188 | master189 | slave190 |
---|---|---|
NameNode | NameNode | |
DataNode | DataNode | DataNode |
Zookeeper | Zookeeper | Zookeeper |
ResourceManager | ResourceManager | |
NodeManager | NodeManager | NodeManager |
HMaster | HMasetr | |
RegionServer | RegionServer | RegionServer |
JDK、Hadoop、HBase版本兼容性(NS:不兼容;NT:未測試;Y:兼容):
HBase Version | JDK 6 | JDK 7 | JDK 8 |
---|---|---|---|
2.0 | X | X | Y |
1.3 | X | Y | Y |
1.2 | X | Y | Y |
1.1 | X | Y | NT |
1.0 | X | Y | NT |
0.98 | Y | Y | NT |
0.94 | Y | Y | N |
Hadoop\HBase | HBase-1.1.x | HBase-1.2.x | HBase-1.3.x | HBase-2.0.x |
---|---|---|---|---|
Hadoop-2.0.x-alpha | X | X | X | X |
Hadoop-2.1.0-beta | X | X | X | X |
Hadoop-2.2.0 | NT | X | X | X |
Hadoop-2.3.x | NT | X | X | X |
Hadoop-2.4.x | S | S | S | X |
Hadoop-2.5.x | S | S | S | X |
Hadoop-2.6.0 | X | X | X | X |
Hadoop-2.6.1+ | NT | S | S | S |
Hadoop-2.7.0 | X | X | X | X |
Hadoop-2.7.1+ | NT | S | S | S |
Hadoop-2.8.0 | X | X | X | X |
Hadoop-2.8.1 | X | X | X | |
Hadoop-3.0.0-alphax | NT | NT | NT | NT |
考慮到HBase與JDK、Hadoop各版本兼容性,我們采用的組件版本如下:
組件 | 版本 |
---|---|
JDK | 1.8 |
Hadoop | 2.6.5 |
Zookeeper | 3.4.11 |
HBase | 1.3.1 |
三、安裝配置Zookeeper
1、下載及安裝
下載地址:http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.11/zookeeper-3.4.11.tar.gz
在master188機器上,下載后解壓到/home/hadoop/目錄下:
tar -zxvf zookeeper-3.4.11.tar.gz -C /home/hadoop/
2、拷貝 zoo_sample.cfg
進入zookeeper的conf目錄,拷貝zoo_sample.cfg
並重命名為zoo.cfg
:
cd zookeeper-3.4.11/conf/
cp zoo_sample.cfg zoo.cfg
3、修改 zoo.cfg
vi zoo.cfg
修改如下,若原文件沒有dataDir則直接添加:
dataDir=/home/hadoop/zookeeper-3.4.11/data/zkData
//在最后添加,指定zookeeper集群主機及端口,機器數必須為奇數
server.1=master188:2888:3888
server.2=master189:2888:3888
server.3=slave190:2888:3888
4、創建並編輯myid
//在zookeeper根目錄下創建zoo.cfg中配置的目錄
mkdir data/zkData/ -p
//創建並編輯文件
vi myid
//輸入1,即表示當前機器為在zoo.cfg中指定的server.1
1
//保存退出
:wq
5、拷貝zookeeper到其他機器
上述操作是在master188機器上進行的,要將zookeeper拷貝到其他zookeeper集群機器上:
cd /home/hadoop
scp -r zookeeper-3.4.11/ hadoop@master189:/home/hadoop/
scp -r zookeeper-3.4.11/ hadoop@slave190:/home/hadoop/
集群中各組件的安裝目錄最好保持一致。
6、修改其他機器的myid
文件
myid
文件是作為當前機器在zookeeper集群的標識,這些標識在zoo.cfg
文件中已經配置好了,但是之前在master188這台機器上配置的myid
為1,所以還需要修改其他機器的myid
文件:
//在master189機器上
echo 2 > /home/hadoop/zookeeper-3.4.11/data/zkData/myid
//在slave190機器上
echo 3 > /home/hadoop/zookeeper-3.4.11/data/zkData/myid
7、啟動zookeeper集群
cd zookeeper-3.4.11/bin/
//分別在master188、master189、slave190上啟動
./zkServer.sh start
//查看狀態
./zkServer.sh status
三台機器的zookeeper狀態必須只有一個leader
,其他都是follower
。
//查看進程,若有QuorumpeerMain,則啟動成功
jps
四、安裝配置Hadoop
1、下載及安裝
下載地址:http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.6.5/hadoop-2.6.5.tar.gz
在master88機器上,解壓到/home/hadoop/目錄下:
tar -zxcf hadoop-2.6.5.tar.gz -C /home/hadoop/
2、配置
進入配置文件目錄,修改配置文件
cd hadoop-2.6.5/etc/hadoop/
1)vi hadoop-env.sh
配置JDK安裝路徑:
JAVA_HOME=/opt/jdk
2)vi core-site.xml
<configuration>
<!-- hdfs地址,ha模式中是連接到nameservice -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
</property>
<!-- 這里的路徑默認是NameNode、DataNode、JournalNode等存放數據的公共目錄,也可以單獨指定 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hadoop-2.6.5/tmp</value>
</property>
<!-- 指定ZooKeeper集群的地址和端口。注意,數量一定是奇數,且不少於三個節點-->
<property>
<name>ha.zookeeper.quorum</name>
<value>master188:2181,master189:2181,slave190:2181</value>
</property>
</configuration>
3)vi hdfs-site.xml
<configuration>
<!-- 指定副本數,不能超過機器節點數 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 為namenode集群定義一個services name -->
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<!-- nameservice 包含哪些namenode,為各個namenode起名 -->
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>master188,master189</value>
</property>
<!-- 名為master188的namenode的rpc地址和端口號,rpc用來和datanode通訊 -->
<property>
<name>dfs.namenode.rpc-address.ns1.master188</name>
<value>master188:9000</value>
</property>
<!-- 名為master189的namenode的rpc地址和端口號,rpc用來和datanode通訊 -->
<property>
<name>dfs.namenode.rpc-address.ns1.master189</name>
<value>master189:9000</value>
</property>
<!--名為master188的namenode的http地址和端口號,用來和web客戶端通訊 -->
<property>
<name>dfs.namenode.http-address.ns1.master188</name>
<value>master188:50070</value>
</property>
<!-- 名為master189的namenode的http地址和端口號,用來和web客戶端通訊 -->
<property>
<name>dfs.namenode.http-address.ns1.master189</name>
<value>master189:50070</value>
</property>
<!-- namenode間用於共享編輯日志的journal節點列表 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master188:8485;master189:8485;slave190:8485/ns1</value>
</property>
<!-- 指定該集群出現故障時,是否自動切換到另一台namenode -->
<property>
<name>dfs.ha.automatic-failover.enabled.ns1</name>
<value>true</value>
</property>
<!-- journalnode 上用於存放edits日志的目錄 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/hadoop-2.6.5/tmp/data/dfs/journalnode</value>
</property>
<!-- 客戶端連接可用狀態的NameNode所用的代理類 -->
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 一旦需要NameNode切換,使用ssh方式進行操作 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 如果使用ssh進行故障切換,使用ssh通信時用的密鑰存儲的位置 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<!-- connect-timeout超時時間 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
4)vi mapred-site.xml
<!-- 采用yarn作為mapreduce的資源調度框架 -->
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
5)vi yarn-site.xml
<configuration>
<!-- 啟用HA高可用性 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定resourcemanager的名字 -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<!-- 使用了2個resourcemanager,分別指定Resourcemanager的地址 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 指定rm1的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>master188</value>
</property>
<!-- 指定rm2的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>master189</value>
</property>
<!-- 指定當前機器master188作為rm1 -->
<property>
<name>yarn.resourcemanager.ha.id</name>
<value>rm1</value>
</property>
<!-- 指定zookeeper集群機器 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>master188:2181,master189:2181,slave190:2181</value>
</property>
<!-- NodeManager上運行的附屬服務,默認是mapreduce_shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
6)vi slaves
master188
master189
slave190
3、拷貝hadoop到其他機器
1)拷貝
scp -r hadoop-2.6.5 hadoop@master189:/home/hadoop/
scp -r hadoop-2.6.5 hadoop@slave190:/home/hadoop/
2)修改yarn-site.xml
在master189機器,即ResourceManager備用主節點上修改如下屬性,表示當前機器作為rm2::
<property>
<name>yarn.resourcemanager.ha.id</name>
<value>rm2</value>
</property>
同時刪除slave190機器上的該屬性對,因為slave190機器並不作為ResourceManager。
3、啟動Hadoop
1)啟動Journalnode
cd hadoop-2.6.5/sbin/
./hadoop-daemon.sh start
//查看進程JouralNode是否啟動
jps
2)格式化 NameNode和ZKFC
在master188機器上,執行格式化操作:
cd hadoop-2.6.5/bin
./hdfs namenode -format
./hdfs zkfc -formatZK
3)備用主節點同步主節點元數據
在master189(備用主節點)機器上,執行同步操作:
cd hadoop-2.6.5/bin
./hdfs namenode -bootstrapStanby
4)安裝fuster
若服務器是最小化安裝centeros時,有可能系統沒有fuster程序,那么跳過這個安裝步驟直接進行后面的操作時,將有可能出現以下問題:
master188作為主節點時,kill掉master188上的NameNode和ResourceManager進程時,可以實現故障轉移,master189將從stanby狀態自動變成active狀態;但是當master189作為主節點時,若kill掉master189上的進程,master188上的進程狀態卻還是stanby,並不能實現故障自動轉移。原因是我們在 hdfs-site.xml中配置了當集群需要故障自動轉移時采用SSH方式進行,而因為缺少fuster程序,將在zkfc的日志文件中發現如下錯誤:
PATH=$PATH:/sbin:/usr/sbin fuser -v -k -n tcp 9000 via ssh: bash: fuser: 未找到命令
Unable to fence service by any configured method
java.lang.RuntimeException: Unable to fence NameNode at master189/192.168.29.189:9000
提示未找到fuster程序,導致無法進行fence,所以可以通過如下命令來安裝,Psmisc軟件包中包含了fuster程序:
//分別在master188、master189、slave190上執行
sudo yum install psmisc
5)啟動HDFS、YARN、ZookeeperFailoverController
在master188機器上:
cd hadoop-2.6.5/sbin
./start-dfs.sh
//驗證,顯示NameNode和DataNode
jps
./start-yarn.sh
//驗證,顯示ResourceManager和NodeManager
jps
./hadoop-daemon.sh start zkfc
//驗證,顯示ZookeeperFailoverController
jps
在master189機器上,啟動ResourceManager,備用主節點的ResourceManager需要手動啟動:
cd hadoop-2.6.5/sbin
yarn-daemon.sh start resourcemanager
6)查看Namenode、ResourceManager狀態
在master188機器上執行:
hdfs haadmin -getServiceState master188
yarn rmadmin -getServiceState rm1
hdfs haadmin -getServiceState master189
yarn rmadmin -getServiceState rm2
也可以通過Web界面來查看,瀏覽器中輸入 ip:50070 查看HDFS,輸入 ip:8088/cluster/cluster 查看YARN。
7)測試高可用
a.主節點--->備用主節點
kill掉主節點的namenode,查看備用主節點的namenode狀態是否切換為active;
kill掉主節點的ResourceManager,查看備用主節點的ResourceManager是否切換為active;
b.備用主節點--->主節點
若上述操作執行成功,那么再測試反向故障自動轉移
先啟動被殺死的原主節點的namenode和ResourceManager
hadoop-daemon.sh start namenode
yarn-daemon.sh start resourcemanager
再kill備用主節點的namenode和ResourceManager,查看主節點的狀態,若能切換為active,那么Hadoop HA高可用集群搭建完成。
五、安裝配置HBase
1、下載及安裝
下載地址:http://mirrors.hust.edu.cn/apache/hbase/1.3.1/hbase-1.3.1-bin.tar.gz
在master188機器上,解壓到/home/hadoop/目錄下:
tar -zxvf hbase-1.3.1-bin.tar.gz
2、配置
進入hbase-1.3.1/conf/目錄,修改配置文件:
cd hbase-1.3.1/conf/
1)vi hbase-env.sh
//配置JDK
export JAVA_HOME=/opt/jdk
//保存pid文件
export HBASE_PID_DIR=/home/hadoop/data/hbase/pids
//修改HBASE_MANAGES_ZK,禁用HBase自帶的Zookeeper,因為我們是使用獨立的Zookeeper
export HBASE_MANAGES_ZK=false
2)vi hbase-site.xml
<configuration>
<!-- 設置HRegionServers共享目錄,請加上端口號 -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://master188:9000/hbase</value>
</property>
<!-- 指定HMaster主機 -->
<property>
<name>hbase.master</name>
<value>hdfs://master188:60000</value>
</property>
<!-- 啟用分布式模式 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 指定Zookeeper集群位置 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>master188:2181,master189:2181,slave190:2181</value>
</property>
<!-- 指定獨立Zookeeper安裝路徑 -->
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/hadoop/zookeeper-3.4.11</value>
</property>
<!-- 指定ZooKeeper集群端口 -->
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
</configuration>
3)vi regionservers
修改regionservers文件,因為當前是使用獨立的Zookeeper集群,所以要指定RegionServers所在機器:
master188
master189
slave190
4)創建pid文件保存目錄
在/home/hadoop/目錄下:
mkdir data/hbase/pids -p
3、拷貝HBase到其他機器
cd /home/hadoop/
scp -r hbase-1.3.1 hadoop@master189:/home/hadoop/
scp -r hbase-1.3.1 hadoop@slave190:/home/hadoop/
4、啟動HBase
在主節點上啟動HBase(這里的主節點是指NameNode狀態為active的節點,而非指文中對本實驗的機器聲明):
cd hbase-1.3.1/bin
./start-hbase.sh
//查看HMaster、Regionserver進程是否啟動
jps
注意:此時Hadoop集群應處於啟動狀態,並且是在主節點執行start-hbase.sh啟動HBase集群,否則HMaster進程將在啟動幾秒后消失,而備用的HMaster進程需要在備用主節點單獨啟動,命令是:
./hbase-daemon.sh start master
。
在備用主節點啟動HMaster進程,作為備用HMaster:
cd hbase-1.3.1/bin
./hbase-daemon.sh start master
5、HA高可用測試
在瀏覽器中輸入 ip:16010
,查看主節點和備用主節點上的HMaster的狀態,在備用主節點的web界面中,可以看到“Current Active Master: master188”,表示當前HBase主節點是master188機器;
主節點--->備用主節點
這里的主節點指使用start-hbase.sh命令啟動HBase集群的機器
kill掉主節點的HMaster進程,在瀏覽器中查看備用主節點的HBase是否切換為active;
若上述操作成功,則在主節點啟動被殺死的HMaster進程:
cd hbase-1.3.1/bin/
./hbase-daemon.sh start master
然后,kill掉備用主節點的HMaster進程,在瀏覽器中查看主節點的HBase是否切換為active,若操作成功,則HBase高可用集群搭建完成;
6、HBase基本操作
//啟動HBase
[root@vnet ~] start-hbase.sh
//進入HBase Shell
[root@vnet ~] hbase shell
//查看當前HBase有哪些表
hbase(main):> list
//創建表t_user,cf1和cf2是列族,列族一般不超過3個
hbase(main):> create 't_user','cf1','cf2'
//獲得表t_user的描述信息
hbase(main):> describe 't_user'
//禁用表
hbase(main):> disable 't_user'
//刪除表,刪除表之前要先把表禁用掉
hbase(main):> drop 't_user'
//查詢表是否存在
hbase(main):> exists 't_user'
//查看全表數據
hbase(main):> scan 't_user'
//插入數據,分別是表名、key、列(列族:具體列)、值。HBase是面向列的數據庫,列可無限擴充
hbase(main):> put 't_user' ,'001','cf1:name','chenxj'
hbase(main):> put 't_user' ,'001','cf1:age','18'
hbase(main):> put 't_user' ,'001','cf2:sex','man'
hbase(main):> put 't_user' ,'002','cf1:name','chenxj'
hbase(main):> put 't_user' ,'002','cf1:address','fuzhou'
hbase(main):> put 't_user' ,'002','cf2:sex','man'
//獲取數據,可根據key、key和列族等進行查詢
hbase(main):> get 't_user','001'
hbase(main):> get 't_user','002','cf1'
hbase(main):> get 't_user','001','cf1:age'
六、集群啟動結果
Hadoop + Zookeeper + HBase 高可用集群啟動后,進程狀態如下:
描述 | master188 | master189 | slave190 |
---|---|---|---|
HDFS主 | NameNode | NameNode | |
HDFS從 | DataNode | DataNode | DataNode |
YARN主 | ResourceManager | ResourceManager | |
YARN從 | NodeManager | NodeManager | NodeManager |
HBase主 | HMaster | HMaster | |
HBase從 | HRegionServer | HRegionServer | HRegionServer |
Zookeeper獨立進程 | QuorumPeerMain | QuorumPeerMain | QuorumPeerMain |
NameNodes數據同步 | JournalNode | JournalNode | JournalNode |
主備故障切換 | DFSZKFailoverController | DFSZKFailoverController |
七、總結
需要注意的地方:
1)備用節點上的NameNode、ResourceManager、HMaster均需單獨啟動;
hadoop-daemon.sh start namenode yarn-daemon.sh start resourcemanager hbase-daemon.sh start master
2)可以使用-forcemanual參數強制切換主節點與備用主節點,但強制切換后集群的自動故障轉移將會失效,需要重新格式化zkfc:
hdfs zdfc -formatZK
;hdfs haadmin -transitionToActive/transitionToStandby -forcemanual master189 yarn rmadmin -transitionToActive/transitionToStandby -forcemanual rm2
3)在備用主節點同步主節點的元數據時,主節點的HDFS必須已經啟動;
4)無法查看standby狀態的節點上的hdfs;
5)格式化namenode時要先啟動各個JournalNode機器上的journalnode進程:
hadoop-daemon.sh start journalnode
;6)若遇到問題,可以先考慮是哪個組件出現問題,然后查看該組件或與該組件相關的組件的日志信息;若各組件web頁面無法訪問,或存在其他連接問題,可以從「防火牆是否關閉」、「端口是否被占用」、「SSH」、「集群機器是否處於同一網段」內等角度考慮;