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


聲明:作者原創,轉載注明出處。

作者:帥氣陳吃蘋果

一、服務器環境

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM