Hadoop HA高可用集羣搭建(Hadoop+Zookeeper+HBase)

聲明:做者原創,轉載註明出處。

做者:帥氣陳吃蘋果java

1、服務器環境

主機名 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/

2、集羣規劃

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
HadoopHBase 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 Y Y Y X
Hadoop-2.5.x Y Y Y X
Hadoop-2.6.0 X X X X
Hadoop-2.6.1+ NT Y Y Y
Hadoop-2.7.0 X X X X
Hadoop-2.7.1+ NT Y Y Y
Hadoop-2.8.0 X X X X
Hadoop-2.8.1 X X X X
Hadoop-3.0.0-alphax NT NT NT NT

考慮到HBase與JDK、Hadoop各版本兼容性,咱們採用的組件版本以下:node

組件 版本
JDK 1.8
Hadoop 2.6.5
Zookeeper 3.4.11
HBase 1.3.1

3、安裝配置Zookeeper

一、下載及安裝

下載地址:http://mirrors.hust.edu.cn/ap...web

在master188機器上,下載後解壓到/home/hadoop/目錄下:shell

tar -zxvf zookeeper-3.4.11.tar.gz -C /home/hadoop/

二、拷貝 zoo_sample.cfg

進入zookeeper的conf目錄,拷貝zoo_sample.cfg並重命名爲zoo.cfg數據庫

cd zookeeper-3.4.11/conf/

cp zoo_sample.cfg zoo.cfg

三、修改 zoo.cfg

vi zoo.cfg

修改以下,若原文件沒有dataDir則直接添加:apache

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

四、建立並編輯myid

//在zookeeper根目錄下建立zoo.cfg中配置的目錄
mkdir data/zkData/ -p

//建立並編輯文件
vi myid

//輸入1,即表示當前機器爲在zoo.cfg中指定的server.1
1

//保存退出
:wq

五、拷貝zookeeper到其餘機器

上述操做是在master188機器上進行的,要將zookeeper拷貝到其餘zookeeper集羣機器上:bootstrap

cd /home/hadoop

scp -r zookeeper-3.4.11/ hadoop@master189:/home/hadoop/

scp -r zookeeper-3.4.11/ hadoop@slave190:/home/hadoop/

集羣中各組件的安裝目錄最好保持一致。瀏覽器

六、修改其餘機器的myid文件

myid文件是做爲當前機器在zookeeper集羣的標識,這些標識在zoo.cfg文件中已經配置好了,可是以前在master188這臺機器上配置的myid爲1,因此還須要修改其餘機器的myid文件:bash

//在master189機器上
echo 2 > /home/hadoop/zookeeper-3.4.11/data/zkData/myid
//在slave190機器上
echo 3 > /home/hadoop/zookeeper-3.4.11/data/zkData/myid

七、啓動zookeeper集羣

cd zookeeper-3.4.11/bin/
//分別在master18八、master18九、slave190上啓動
./zkServer.sh start

//查看狀態
./zkServer.sh status

三臺機器的zookeeper狀態必須只有一個leader,其餘都是follower服務器

//查看進程,如有QuorumpeerMain,則啓動成功
jps

4、安裝配置Hadoop

一、下載及安裝

下載地址:http://mirrors.hust.edu.cn/ap...

在master88機器上,解壓到/home/hadoop/目錄下:

tar -zxcf hadoop-2.6.5.tar.gz -C /home/hadoop/

二、配置

進入配置文件目錄,修改配置文件

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

三、拷貝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。

三、啓動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程序:

//分別在master18八、master18九、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高可用集羣搭建完成。

5、安裝配置HBase

一、下載及安裝

下載地址:http://mirrors.hust.edu.cn/ap...

在master188機器上,解壓到/home/hadoop/目錄下:

tar -zxvf hbase-1.3.1-bin.tar.gz

二、配置

進入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

三、拷貝HBase到其餘機器

cd /home/hadoop/

scp -r hbase-1.3.1 hadoop@master189:/home/hadoop/

scp -r hbase-1.3.1 hadoop@slave190:/home/hadoop/

四、啓動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

五、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高可用集羣搭建完成;

六、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'

6、集羣啓動結果

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

7、總結

須要注意的地方:

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」、「集羣機器是否處於同一網段」內等角度考慮;

最後,歡迎指正。喜歡的話,點個讚唄,請你吃蘋果。

相關文章
相關標籤/搜索