hbase高可用性分佈式集羣搭建(3節點超詳細集羣安裝)

一、前言

1.1 簡述

Hbase的高可用性集羣是建立在hadoop的高可用集羣的基礎之上的,所以在安裝hbase的高可用集羣之前要先創建hadoop的高可用集羣。

1.2環境要求

本地環境:window7 64位
虛擬機環境:centOs 6.5 64位(三臺master,slave1,slave2),hadoop-2.7.7,hbase-1.2.8,zookeeper-3.4.13、jdk1.8.0_171。

二、Linux主機名設置

2.1 臨時修改hostname

注:如果是雲服務器推薦使用域名作爲主機名,如果是虛擬機可以自定義.

# hostname master

2.2 永久修改hostname

# vi /etc/sysconfig/network

結果如下:
在這裏插入圖片描述

2.3 配置Host

# vi /etc/hosts

結果如下:
在這裏插入圖片描述
若配置完,沒生效可以重啓服務器

2.4 防火牆設置

本文推薦自己設置防火牆入棧規制,不要直接關閉防火牆.本文只是學習,所以在這裏選擇關閉防火牆,若是要直接使用的話最好不要關閉防火牆.
查看防火牆狀態:

# service iptables status

臨時關閉防火牆:

# service iptables stop

永久關閉防火牆:

# chkconfig iptables off

在這裏插入圖片描述
其他兩臺虛擬機也要進行以上操作。

三、設置無密碼登錄

Hadoop集羣中的各個機器間會相互地通過SSH訪問,每次訪問都輸入密碼是不現實的,所以要配置各個機器間的SSH是無密碼登錄的。

3.1 安裝ssh服務

檢查是否已安裝了ssh服務,如圖現在明顯未安裝ssh服務

# rpm -qa openssh*

在這裏插入圖片描述
安裝ssh服務:

# yum install -y openssh-clients

在這裏插入圖片描述

3.2 在master上生成公鑰

[root@master ~]# ssh-keygen -t rsa

一路回車,都設置爲默認值,然後再當前用戶的Home目錄下的.ssh目錄中會生成公鑰文件(id_rsa.pub)和私鑰文件(id_rsa)。

3.3 分發公鑰

[root@master ~]# ssh-copy-id master
[root@master ~]# ssh-copy-id slave1
[root@master ~]# ssh-copy-id slave2

3.4 設置slave1、slave2到其他機器的無密鑰登錄

同樣的在slave1、slave2上生成公鑰和私鑰後,將公鑰分發到三臺機器上。

四、Jdk安裝

在確保linux系統本身沒有安裝jdk的時候,執行下面步驟:

4.1 上傳jdk

將jdk-8u171-linux-x64.tar.gz這個文件上傳到linux虛擬機然後,解壓到/opt/modules/soft/這個目錄下,若沒有這個目錄可以用mkdir -p,創建目錄。
在這裏插入圖片描述

4.2 解壓jdk

# tar -zxvf jdk-8u171-linux-x64.tar.gz  -C  /opt/modules/soft

在這裏插入圖片描述

4.3 配置環境變量

# vi /etc/profile

在文件末尾行添加

#set java environment
JAVA_HOME=/opt/modules/soft/jdk1.8.0_171
CLASSPATH=.:$JAVA_HOME/lib/tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH

使配置生效:

#source /etc/profile 使更改的配置立即生效
#java -version 驗證結果是否正確

在這裏插入圖片描述

4.4 分發jdk到其他的服務器

首先在slave1,slave2上創建/opt/modules/soft這個目錄,用於接收分發的文件

[root@master ~]# scp -r /opt/modules/soft/jdk1.8.0_171 -C slave1:/opt/modules/soft
[root@master ~]# scp -r /opt/modules/soft/jdk1.8.0_171 -C slave2:/opt/modules/soft

在slave1,slave2上重複4.3的操作

五、Zookeeper集羣安裝。

5.1 Zookeeper說明

Zookeeper是分佈式管理協作框架,Zookeeper集羣用來保證Hbase集羣的高可用,(高可用的含義是:集羣中就算有一部分服務器宕機,也能保證正常地對外提供服務。)
Zookeeper集羣能夠保證master服務高可用的原理是:Hbase集羣中有兩個master服務,兩個master都定時地給Zookeeper發送心跳,告訴Zookeeper我還活着,可以提供服務,單某一個時間只有一個是master是提供服務,另外一個是備用的master,一旦Zookeeper檢測不到master發送來的心跳後,就切換到備用的master上,將它設置爲提供服務的狀態,所以集羣中總有一個可用的master,達到了master的高可用目的。
Zookeeper集羣也能保證自身的高可用,保證自身高可用的原理是,Zookeeper集羣中的各個機器分爲Leader和Follower兩個角色,寫入數據時,要先寫入Leader,Leader同意寫入後,再通知Follower寫入。客戶端讀取數時,因爲數據都是一樣的,可以從任意一臺機器上讀取數據。
這裏Leader角色就存在單點故障的隱患,高可用就是解決單點故障隱患的。Zookeeper從機制上解決了Leader的單點故障問題,Leader是哪一臺機器是不固定的,Leader是選舉出來的。選舉流程是,集羣中任何一臺機器發現集羣中沒有Leader時,就推薦自己爲Leader,其他機器來同意,當超過一半數的機器同意它爲Leader時,選舉結束,所以Zookeeper集羣中的機器數據必須是奇數。這樣就算當Leader機器宕機後,會很快選舉出新的Leader,保證了Zookeeper集羣本身的高可用。
集羣中的寫入操作都是先通知Leader,Leader再通知Follower寫入,實際上當超過一半的機器寫入成功後,就認爲寫入成功了,所以就算有些機器宕機,寫入也是成功的。
zookeeperk客戶端讀取數據時,可以讀取集羣中的任何一個機器。所以部分機器的宕機並不影響讀取。
zookeeper服務器必須是奇數臺,因爲zookeeper有選舉制度,角色有:領導者、跟隨者、觀察者,選舉的目的是保證集羣中數據的一致性。

5.2 安裝zookeeper

5.2.1 解壓zookeeper安裝包

在master服務器上安裝解壓zookeeper的安裝包,到/opt/moodules/newsoft目錄下:
在這裏插入圖片描述

5.2.2 修改配置

拷貝conf下的zoo_sample.cfg副本,並改名爲zoo.cfg。zoo.cfg是zookeeper的配置文件:

[root@master conf]# cp zoo_sample.cfg zoo.cfg

在這裏插入圖片描述

[root@master conf]# vi zoo.cfg

在這裏插入圖片描述
dataDir屬性設置zookeeper的數據文件存放的目錄:

dataDir=/opt/modules/newsoft/zookeeper-3.4.13/data/zData

並創建該目錄。
指定zookeeper集羣中各個機器的信息:

server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888

server後面的數字範圍是1到255,所以一個zookeeper集羣最多可以有255個服務器。2181端口與client提供服務有關,2888端口作爲選舉leader使用,
3888端口作爲集羣內機器通訊使用(Leader監聽此端口)。

5.2.3 創建myid文件

在dataDir所指定的目錄下創一個名爲myid的文件,文件內容爲server點後面的數字。

[root@master zookeeper-3.4.13]# touch data/zData/myid
[root@master zookeeper-3.4.13]# echo 1 >> data/zData/myid

在這裏插入圖片描述

5.2.4 分發到其他服務器

[root@master zookeeper-3.4.13]# scp -r /opt/modules/newsoft/zookeeper-3.4.13 slave1:/opt/modules/newsoft
[root@master zookeeper-3.4.13]# scp -r /opt/modules/newsoft/zookeeper-3.4.13 slave2:/opt/modules/newsoft

5.2.5 修改其他服務器的myid文件

在這裏插入圖片描述
在這裏插入圖片描述

5.2.6 配置zookeeper的環境變量

[root@master zookeeper-3.4.13]# vi /etc/profile
[root@master zookeeper-3.4.13]# source /etc/profile

在這裏插入圖片描述
在slave1,slave2上也要配置環境變量。

5.2.7 啓動zookeeper

[root@master zookeeper-3.4.13]# zkServer.sh start
[root@slave1 zookeeper-3.4.13]# zkServer.sh start
[root@slave2 zookeeper-3.4.13]# zkServer.sh start

六、安裝hadoop高可用性集羣

6.1 環境準備

創建三臺虛擬機(可以先創建一臺虛擬機,在克隆出另外兩臺虛擬機,這裏就不再詳細講述虛擬機的安裝),分別是master、slave1、slave2。
虛擬機的配置:

Master:192.168.0.25,安裝jdk,安裝zookeeper,centos6.5
Slave1:192.168.0.26,安裝jdk,安裝zookeeper,centos6.5
Slave2:192.168.0.27,安裝jdk,安裝zookeeper,centos6.5

6.2 hadoop集羣規劃

6.2.1 服務器集羣功能規劃

Master Slave1 Slave2
NameNode NameNode
QuorumPeerMain QuorumPeerMain QuorumPeerMain
NodeManager NodeManager NodeManager
DFSZKFailoverController DFSZKFailoverController
JournalNode JournalNode JournalNode
DataNode DataNode DataNode
ResourceManager ResourceManager

節點介紹:

  1. NameNode

目錄的管理者,每一個集羣都有一個,記錄實時的數據變化,如果沒有namenode,HDFS就無法工作,系統中的文件將會全部丟失,就無法將位於不同datanode上的文件快(blocks)重建文件。因此它的容錯機制很有必要。
它主要負責:
接收用戶的請求;
維護文件系統的目錄結構;
管理文件與Block之間的練習

  1. DataNode

是文件系統的工作節點,他們根據客戶端或者是namenode的調度存儲和檢索,並且定期向namenode發送他們所存儲的塊(block)的列表。
集羣中的每個服務器都運行一個DataNode後臺程序,這個後臺程序負責把HDFS數據塊讀寫到本地的文件系統。當需要通過客戶端讀/寫某個 數據時,先由NameNode告訴客戶端去哪個DataNode進行具體的讀/寫操作,然後,客戶端直接與這個DataNode服務器上的後臺程序進行通信,並且對相關的數據塊進行讀/寫操作。
它主要負責:
存放數據;
文件被分割以Block的形式被存儲在磁盤上;

  1. ResourceManager

①與客戶端進行交互,處理來自於客戶端的請求,如查詢應用的運行情況等。
②啓動和管理各個應用的ApplicationMaster,並且爲ApplicationMaster申請第一個Container用於啓動和在它運行失敗時將它重新啓動。
③管理NodeManager,接收來自NodeManager的資源和節點健康情況彙報,並向NodeManager下達管理資源命令,例如kill掉某個container。
④資源管理和調度,接收來自ApplicationMaster的資源申請,並且爲其進行分配。這個是它的最重要的職能。

  1. NodeManager

NM是ResourceManager在每臺機器上的代理,負責容器管理,並監控它們的資源使用情況,以及向ResourceManager/Scheduler提供資源使用報告。

  1. JournalNode

JournalNode可以讓兩個namenode之間進行相互通信,達到數據同步的作用。當active狀態的NameNode的命名空間有任何修改時,會告知大部分的JournalNodes進程。standby狀態的NameNode有能力讀取JNs中的變更信息,並且一直監控edit log的變化,把變化應用於自己的命名空間。standby可以確保在集羣出錯時,命名空間狀態已經完全同步了。
運行的JournalNode進程非常輕量,可以部署在其他的服務器上。注意:必須允許至少3個節點。當然可以運行更多,但是必須是奇數個,如3、5、7、9個等等。當運行N個節點時,系統可以容忍至少(N-1)/2(N至少爲3)個節點失敗而不影響正常運行。

  1. QuorumPeerMain

Zookeeper的運行進程,zookeeper的詳細介紹可以參考5.1的解說。

  1. DFSZKFailoverController

DFSZKFailoverController是Hadoop-2.7.7中HDFS NameNode HA實現的中心組件,它負責整體的故障轉移控制等。它是一個守護進程,通過main()方法啓動,繼承自ZKFailoverController.

6.2.2 HDFS HA架構圖

在這裏插入圖片描述

  1. HDFS HA架構中有兩臺NameNode節點,一臺是處於活動狀態(Active)爲客戶端提供服務,另外一臺處於熱備份狀態(Standby)。
  2. 元數據文件有兩個文件:fsimage和edits,備份元數據就是備份這兩個文件。JournalNode用來實時從Active NameNode上拷貝edits文件,JournalNode有三臺也是爲了實現高可用。
  3. Standby NameNode不對外提供元數據的訪問,它從Active NameNode上拷貝fsimage文件,從JournalNode上拷貝edits文件,然後負責合併fsimage和edits文件,相當於SecondaryNameNode的作用。最終目的是保證Standby的NameNode上的元數據信息和Active NameNode上的元數據信息一致,以實現熱備份。
  4. Zookeeper來保證在Active NameNode失效時及時將Standby NameNode修改爲Active狀態。
  5. ZKFC(失效檢測控制)是Hadoop裏的一個Zookeeper客戶端,在每一個NameNode節點上都啓動一個ZKFC進程,來監控NameNode的狀態,並把NameNode的狀態信息彙報給Zookeeper集羣,其實就是在Zookeeper上創建了一個Znode節點,節點裏保存了NameNode狀態信息。當NameNode失效後,ZKFC檢測到報告給Zookeeper,Zookeeper把對應的Znode刪除掉,Standby ZKFC發現沒有Active狀態的NameNode時,就會用shell命令將自己監控的NameNode改爲Active狀態,並修改Znode上的數據。
  6. Znode是個臨時的節點,臨時節點特徵是客戶端的連接斷了後就會把znode刪除,所以當ZKFC失效時,也會導致切換NameNode。
  7. DataNode會將心跳信息和Block彙報信息同時發給兩臺NameNode,DataNode只接受Active NameNode發來的文件讀寫操作指令。

6.2.3 YARN HA 架構圖

在這裏插入圖片描述

  1. MasterHADaemon:控制RM的 Master的啓動和停止,和RM運行在一個進程中,可以接收外部RPC命令。
  2. 共享存儲:Active Master將信息寫入共享存儲,Standby Master讀取共享存儲信息以保持和Active Master同步。
  3. ZKFailoverController:基於Zookeeper實現的切換控制器,由ActiveStandbyElector和HealthMonitor組成,ActiveStandbyElector負責與Zookeeper交互,判斷所管理的Master是進入Active還是Standby;HealthMonitor負責監控Master的活動健康情況,是個監視器。
  4. Zookeeper:核心功能是維護一把全局鎖控制整個集羣上只有一個Active的ResourceManager。

6.3 HDFS HA集羣安裝

6.3.1 配置jdk的環境變量

配置Hadoop JDK路徑修改hadoop-env.shmapred-env.sh、yarn-env.sh文件中的JDK路徑:

export JAVA_HOME=/opt/modules/soft/jdk1.8.0_171

在這裏插入圖片描述

6.3.2 配置hdfs-site.xml

在configuration中,添加一下內容:

    <property>
       <!-- 爲namenode集羣定義一個services name -->
      <name>dfs.nameservices</name>
      <value>ns1</value>
    </property>
    <property>
      <!-- nameservice 包含哪些namenode,爲各個namenode起名 -->
      <name>dfs.ha.namenodes.ns1</name>
      <value>nn1,nn2</value>
    </property>
    <property>
      <!--  名爲nn1的namenode 的rpc地址和端口號,rpc用來和datanode通訊 -->
      <name>dfs.namenode.rpc-address.ns1.nn1</name>
      <value>master:8020</value>
    </property>
    <property>
      <!-- 名爲nn2的namenode 的rpc地址和端口號,rpc用來和datanode通訊  -->
      <name>dfs.namenode.rpc-address.ns1.nn2</name>
      <value>slave1:8020</value>
    </property>
    <property>
      <!--名爲nn1的namenode 的http地址和端口號,web客戶端 -->
      <name>dfs.namenode.http-address.ns1.nn1</name>
      <value>master:50070</value>
    </property>
    <property>
      <!--名爲nn2的namenode 的http地址和端口號,web客戶端 -->
      <name>dfs.namenode.http-address.ns1.nn2</name>
      <value>slave1:50070</value>
    </property>
    <property>
      <!--  namenode間用於共享編輯日誌的journal節點列表 -->
      <name>dfs.namenode.shared.edits.dir</name>
      <value>qjournal://master:8485;slave1:8485;slave2:8485/ns1</value>
    </property>
    <property>
      <!--  journalnode 上用於存放edits日誌的目錄,該目錄可以自己定義,當推薦在hadoop的配置文件夾下創建,方便分發 -->
      <name>dfs.journalnode.edits.dir</name>
      <value>/opt/modules/hadoopha/hadoop-2.7.7/tmp/data/dfs/jn</value>
    </property>
    <property>
      <!--  客戶端連接可用狀態的NameNode所用的代理類 -->
      <name>dfs.client.failover.proxy.provider.ns1</name>
      <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    <property>
      <!--   -->
      <name>dfs.ha.fencing.methods</name>
      <value>sshfence</value>
    </property>
     <!--用於指定你的ssh目錄文件,該路徑是指ssh無密碼登錄的私鑰存儲路徑,默認是在/home/.ssh/id_rsa下-->
    <property>
      <name>dfs.ha.fencing.ssh.private-key-files</name>
      <value>/home/.ssh/id_rsa</value>
   </property>
    <!--指定namenode和datanode的文件目錄-->
     <property>
  <name>dfs.namenode.name.dir</name>
  <value>/opt/modules/hadoop-2.7.7/dfsNode/namenode</value>
     </property>
     <property>
  <name>dfs.datanode.data.dir</name>
  <value>/opt/modules/hadoop-2.7.7/dfsNode/datanode</value>
    </property>

6.3.3 配置core-site.xml文件

  <property>
    <!--  hdfs 地址,ha中是連接到nameservice -->
    <name>fs.defaultFS</name>
    <value>hdfs://ns1</value>
  </property>
  <property>
    <!-- 該目錄可以自己指定 -->
    <name>hadoop.tmp.dir</name>
    <value>/opt/modules/hadoopha/hadoop-2.7.7/data/tmp</value>
  </property>

hadoop.tmp.dir設置hadoop臨時目錄地址,默認時,NameNode和DataNode的數據存在這個路徑下。

6.3.4 配置slaves文件

配置內容如下:
在這裏插入圖片描述

6.4.5 分發到其他的節點

分發之前先將share/doc目錄刪除,這個目錄中是幫助文件,並且很大,可以刪除。

[hadoop@master hadoop-2.7.7]# scp -r /opt/modules/hadoopha slave1:/opt/modules
[hadoop@master hadoop-2.7.7]# scp -r /opt/modules/hadoopha slave2:/opt/modules

6.3.6 啓動HDFS HA集羣

三臺服務器分別啓動Journalnode

[hadoop@master hadoop-2.7.7]# sbin/hadoop-daemon.sh start journalnode
[hadoop@slave1 hadoop-2.7.7]# sbin/hadoop-daemon.sh start journalnode
[hadoop@slave2 hadoop-2.7.7]# sbin/hadoop-daemon.sh start journalnode

可以使用jps查看,可以發現JournalNode是否已正常啓動

6.3.7 啓動zookeeper

在三臺服務器上分別啓動zookeeper服務

[hadoop@master hadoop-2.7.7]# zkServer.sh start
[hadoop@slave1 hadoop-2.7.7]# zkServer.sh start
[hadoop@slave2 hadoop-2.7.7]# zkServer.sh start

使用jps查看,可以發現QuorumPeerMain已啓動

6.3.8 格式化主節點

[hadoop@master hadoop-2.7.7]# bin/hdfs namenode -format

在這裏插入圖片描述

6.3.9 啓動主節點

[hadoop@master hadoop-2.7.7]# sbin/hadoop-daemon.sh start namenode

6.3.10 格式化備份節點

[hadoop@slave1 hadoop-2.7.7]# bin/hdfs namenode -bootstrapStandby

在這裏插入圖片描述

6.3.11 啓動備份節點

[hadoop@slave1 hadoop-2.7.7]# sbin/hadoop-daemon.sh start namenode

使用jps查看,可以看到master、slave1都已啓動namenode節點,此時通過網頁查http://master:50070、http://slave1:50070兩個頁面均處於standy狀態。
將master轉換成active狀態:

[hadoop@master hadoop-2.7.7]# bin/hdfs haadmin -transitionToActive nn1

加上forcemanual 能將slave1強制轉換成active狀態:

[hadoop@slave1 hadoop-2.7.7]# bin/hdfs haadmin -transitionToActive -forcemanual nn2

在這裏插入圖片描述
在這裏插入圖片描述

6.3.12 配置故障轉移

利用zookeeper集羣實現故障自動轉移,在配置故障自動轉移之前,要先關閉集羣,不能在HDFS運行期間進行配置。

[hadoop@master hadoop-2.7.7]# sbin/hadoop-daemon.sh stop namenode
[hadoop@master hadoop-2.7.7]# sbin/hadoop-daemon.sh stop journalnode
[hadoop@master hadoop-2.7.7]# zkServer.sh stop
[hadoop@slave1 hadoop-2.7.7]# sbin/hadoop-daemon.sh stop namenode
[hadoop@slave1 hadoop-2.7.7]# sbin/hadoop-daemon.sh stop journalnode
[hadoop@slave1 hadoop-2.7.7]# zkServer.sh stop
[hadoop@slave2 hadoop-2.7.7]# sbin/hadoop-daemon.sh stop namenode
[hadoop@slave2 hadoop-2.7.7]# sbin/hadoop-daemon.sh stop journalnode
[hadoop@slave2 hadoop-2.7.7]# zkServer.sh stop

修改hdfs-site.xml,加上下面的配置:

<property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
</property>

修改core-site.aml,加上下面的配置:

<property>
   <name>ha.zookeeper.quorum</name>
   <value>master:2181,slave1:2181,slave2:2181</value>
</property>

將hdfs-site.xml、core-site.xml文件分發到slave1,slave2服務器上或者直接上其他的服務器上修改文件也可。
創建一個znode節點用於監聽namenode節點
注:在之前注意要先開啓zookeeper,還有開啓防火牆2181端口(或者直接關閉防火牆)

[hadoop@master hadoop-2.7.7]# bin/hdfs zkfc -formatZK

6.3.13 啓動HDFS服務

[hadoop@master hadoop-2.7.7]# sbin/start-dfs.sh

自此,HDFS HA高可用性集羣搭建成功.

注:若出現一個namenode啓動完後自動關閉的情況時,可以按以下順序啓動hdfs服務:
1、啓動zookeeper(每臺都執行)
zkServer.sh status
2、啓動journalnode(每臺都執行)
hadoop-daemon.sh start journalnode
3、啓動hdfs(只在作爲active狀態的服務器上使用)
start-dfs.sh

6.5 安裝YARN HA高可用性集羣

6.5.1 原理

Hadoop2.4版本之前,ResourceManager也存在單點故障的問題,也需要實現HA來保證ResourceManger的高可也用性。
ResouceManager從記錄着當前集羣的資源分配情況和JOB的運行狀態,YRAN HA 利用Zookeeper等共享存儲介質來存儲這些信息來達到高可用。另外利用Zookeeper來實現ResourceManager自動故障轉移。

6.5.2 修改yarn-site.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
  <property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
  </property>
  <property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>106800</value>
  </property>
  <property>
    <!--  啓用resourcemanager的ha功能 -->
    <name>yarn.resourcemanager.ha.enabled</name>
    <value>true</value>
  </property>
  <property>
    <!--  爲resourcemanage ha 集羣起個id -->
    <name>yarn.resourcemanager.cluster-id</name>
    <value>yarn-cluster</value>
  </property>
  <property>
    <!--  指定resourcemanger ha 有哪些節點名 -->
    <name>yarn.resourcemanager.ha.rm-ids</name>
    <value>rm12,rm13</value>
  </property>
  <property>
    <!--  指定第一個節點的所在機器 -->
    <name>yarn.resourcemanager.hostname.rm12</name>
    <value>slave1</value>
  </property>
  <property>
    <!--  指定第二個節點所在機器 -->
    <name>yarn.resourcemanager.hostname.rm13</name>
    <value>slave2</value>
  </property>
  <property>
    <!--  指定resourcemanger ha 所用的zookeeper 節點 -->
    <name>yarn.resourcemanager.zk-address</name>
    <value>master:2181,slave1:2181,slave2:2181</value>
  </property>
  <property>
    <!--  -->
    <name>yarn.resourcemanager.recovery.enabled</name>
    <value>true</value>
  </property>
  <property>
    <!--  -->
    <name>yarn.resourcemanager.store.class</name>
    <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
  </property>
</configuration>

配置完將yarn-site.xml文件,分發到其他服務器上。

6.5.2 啓動yarn服務

[hadoop@master hadoop-2.7.7]# sbin/start-yarn.sh

在slave1,slave2上啓動resourcemanager:

[hadoop@slave1 hadoop-2.7.7]# sbin/yarn-daemon.sh start resourcemanager
[hadoop@slave2 hadoop-2.7.7]# sbin/yarn-daemon.sh start resourcemanager

在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述
Web客戶端訪問slave1機器上的resourcemanager正常,它是active狀態的。
http://slave1:8088/cluster
訪問另外一個resourcemanager,因爲他是standby,會自動跳轉到active的resourcemanager
http://slave2:8088/cluster
在這裏插入圖片描述

七、hbase集羣搭建

7.1 hbase集羣規劃

節點名稱 ip 安裝軟件 運行的進程
Master(主服務器) 192.168.0.25 Jdk、Hadoop、Zookeeper、hbase DataNode、HRegionServer、HMaster、NameNode、NodeManager、QuorumPeerMain、DFSZKFailoverController、JournalNode
slave1(備份服務器) 192.168.0.26 Jdk、Hadoop、Zookeeper、hbase DataNode、HRegionServer、HMaster、NameNode、NodeManager、QuorumPeerMain、DFSZKFailoverController、JournalNode、ResourceManager
slave1(數據存儲服務器) 192.168.0.27 Jdk、Hadoop、Zookeeper、hbase DataNode、HRegionServer、NodeManager、QuorumPeerMain、JournalNode、ResourceManager

注:由於hbase集羣是建立在hadoop集羣之上的,所以必須要先搭建hadoop集羣才能夠正常運行hbase集羣。
Hbase相關節點介紹:

  1. HMaster

HBase的管理節點,通常在一個集羣中設置一個主Master,一個備Master,主備角色的"仲裁"由ZooKeeper實現。 Master主要職責:
①負責管理所有的RegionServer。
②建表/修改表/刪除表等DDL操作請求的服務端執行主體。
③管理所有的數據分片(Region)到RegionServer的分配。
④如果一個RegionServer宕機或進程故障,由Master負責將它原來所負責的Regions轉移到其它的RegionServer上繼續提供服務。
⑤Master自身也可以作爲一個RegionServer提供服務,該能力是可配置的。

  1. HRegionServer

①存放和管理本地HRegion。
②讀寫HDFS,管理Table中的數據。
③Client直接通過HRegionServer讀寫數據(從HMaster中獲取元數據,找到RowKey所在的HRegion/HRegionServer後)。

HBase Client通過RPC方式和HMaster、HRegionServer通信;一個HRegionServer可以存放1000個HRegion;底層Table數據存儲於HDFS中,而HRegion所處理的數據儘量和數據所在的DataNode在一起,實現數據的本地化;數據本地化並不是總能實現,比如在HRegion移動(如因Split)時,需要等下一次Compact才能繼續回到本地化。

7.2 hbase系統架構

在這裏插入圖片描述
在這裏插入圖片描述

7.3 HRegion Sever架構圖

在這裏插入圖片描述

7.4 解壓hbase

將hbase-1.2.8-bin.tar.gz解壓到/opt/modules/soft目錄下:
在這裏插入圖片描述
7.5 配置hbase-env.sh文件

[root@master conf]# vi hbase-env.sh

修改如下內容:

export JAVA_HOME=/opt/modules/soft/jdk1.8.0_171
export HBASE_MANAGES_ZK=false

注:hbase自帶zookeeper插件,默認狀態下是隨hbase啓動而啓動的,但是由於hbase自帶的zookeeper插件,在集羣的狀態下並不方便管理,所以應該把 HBASE_MANAGES_ZK的值設置成false,相當於不開啓hbase自帶的zookeeper插件而使用我們自己安裝的zookeeper軟件,這樣更方便管理。

7.6 配置hbase-site.xml文件

[root@master conf]# vi hbase-site.xml

添加如下內容:

<!-- 指定hbase在hdfs上存儲的路徑 -->
<property>
  <name>hbase.rootdir</name>
  <value>hdfs://ns1/hbase</value>
</property>
<!-- 指定hbase是分佈式的 -->
<property>
  <name>hbase.cluster.distributed</name>
  <value>true</value>
</property>
<!-- 指定zk的地址,多個用“,”分割 -->
<property>
  <name>hbase.zookeeper.quorum</name>
  <value>master:2181,slave1:2181,slave2:2181</value>
</property>
<!--開放60010端口用於瀏覽器訪問,hbase1.2.8版本默認不開啓瀏覽器訪問端口-->
<property>
  <name>hbase.master.info.port</name>
  <value>60010</value>
</property>

在這裏插入圖片描述

7.7 配置regionservers文件

[root@master conf]# vi regionservers

配置結果如下:
在這裏插入圖片描述

7.8 將hadoop的datanode、namenode映射關係拷貝到/hbase-1.2.8/conf/目錄下

[root@master conf]# cd /opt/modules/hadoopha/hadoop-2.7.7/etc/hadoop/
[root@master hadoop]# cp core-site.xml hdfs-site.xml /opt/modules/soft/hbase-1.2.8/conf/

在這裏插入圖片描述

7.9 創建backup-masters文件,用來存儲備份服務器的名稱

在這裏插入圖片描述
注:作爲hbase的主服務器的Hadoop的namenode必須處於active狀態

7.10 將配置好的hbase分發到slave1、slave2服務器上

[root@master hadoopha]# scp -r hbase-1.2.8 slave1:/opt/modules/hadoopha
[root@master hadoopha]# scp -r hbase-1.2.8 slave2:/opt/modules/hadoopha

7.11 啓動hbase

[root@master hbase-1.2.8]# ./bin/start-hbase.sh

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
注:如果出現HRegionServer啓動一會然後又自動關閉的情況時,是因爲服務器集羣的時間不一致引起的,處理這個問題可以把所有服務器的時間設置在同一個時間,如下:
在這裏插入圖片描述
當然,其他的服務器也要設置一下時間。除了這個方法,我們還可以通過搭建ntp服務器來調節整個集羣環境的時間。本文也推薦使用第二種方法。

7.12 啓動shell

[root@master hbase-1.2.8]# ./bin/hbase shell
在這裏插入圖片描述

7.13 訪問hbase的web界面

訪問hbase的主服務web界面:
http://master:60010
在這裏插入圖片描述
若是系統正常運行,可以在下圖看到看到regionservers集羣的數量:
在這裏插入圖片描述
可以在下圖看到備份服務器的名稱,服務端口,運行時間等:
在這裏插入圖片描述
還可以看到,hbase創建的表:
在這裏插入圖片描述
訪問備份服務器的web界面:
http://slave1:60010/master-status
在這裏插入圖片描述
可以看到若系統正常運行的狀態下,備份服務器是處於standy狀態下的,只有master服務器是處於active狀態。

7.14 測試hbase服務器集羣的高可用性。

停止正在運行的master服務器的HMaster進程,模仿master服務器宕機。
在這裏插入圖片描述
訪問master主服務器的界面:
http://master:60010
在這裏插入圖片描述
這時候master服務器的主界面已經無法正常使用。
訪問備份服務器的界面:
在這裏插入圖片描述
可以發現備份服務器的服務已啓用,通過備份服務器我們依然可以正常的使用hbase集羣。

7.15 常見問題

(1)在安裝hbase-1.2.8時發現一個問題,hbase能夠正常使用,hbase shell 完全可用,但是60010頁面卻打不開,最後找到問題,是因爲1.2.8版本的hbase的master web 默認是不運行的,所以需要自己配置默認端口。
在hbase-site.xml中加入,下面內容:

<property>
    <name>hbase.master.info.port</name>
    <value>60010</value>
</property>

同樣道理,也可以配置regionserver web端口。

八、hbase的shell常用命令及java實例

8.1 hbase的shelll常用命令

8.1.1通用命令

(1)status: 提供HBase的狀態,例如,服務器的數量。
在這裏插入圖片描述
(2)version: 提供正在使用HBase版本。
在這裏插入圖片描述
(3)table_help: 表引用命令提供幫助。
在這裏插入圖片描述
(4)whoami: 提供有關用戶的信息.

在這裏插入圖片描述

8.1.2 數據定義語言

(1) create: 創建一個表。
在這裏插入圖片描述
(2)list: 列出HBase的所有表。
在這裏插入圖片描述
(3)disable: 禁用表。
在這裏插入圖片描述
(4)is_disabled: 驗證表是否被禁用。
表示被禁用:
在這裏插入圖片描述
表示啓用:
在這裏插入圖片描述
(5)enable: 啓用一個表。
在這裏插入圖片描述
(6)is_enabled: 驗證表是否已啓用。
表示啓用:
在這裏插入圖片描述
表示被禁用:
在這裏插入圖片描述
(7)describe: 提供了一個表的描述。
在這裏插入圖片描述
(8)alter: 改變一個表。
在這裏插入圖片描述
(9)exists: 驗證表是否存在。

在這裏插入圖片描述
(10)drop: 從HBase中刪除表。
分兩步:首先disable,然後drop
在這裏插入圖片描述

(11)drop_all: 丟棄在命令中給出匹配“regex”的表。

hbase> drop_all 't.*'

注意:要刪除表,則必須先將其禁用。
假設有一些表的名稱如下:
在這裏插入圖片描述
所有這些表以字母test0開始。首先使用disable_all命令禁用所有這些表如下所示。
在這裏插入圖片描述
現在,可以使用 drop_all 命令刪除它們,如下所示。
在這裏插入圖片描述
(12)Java Admin API: 在此之前所有的上述命令,Java提供了一個通過API編程來管理實現DDL功能。在這個org.apache.hadoop.hbase.client包中有HBaseAdmin和HTableDescriptor 這兩個重要的類提供DDL功能。

8.1.3 數據操縱語言
(1) put: 把指定列在指定的行中單元格的值在一個特定的表。

put 'table name','row ','Column family:column name','new value'

在這裏插入圖片描述
(2)get: 取行或單元格的內容。

get '<table name>','row1'

在這裏插入圖片描述
(3)delete: 刪除表中的單元格值。

delete '<table name>', '<row>', '<column name >', '<time stamp>'

在這裏插入圖片描述
(4)deleteall: 刪除給定行的所有單元格。

deleteall '<table name>', '<row>',

在這裏插入圖片描述
(5)scan: 掃描並返回表數據。

scan '<table name>'

在這裏插入圖片描述
(6)count: 計數並返回表中的行的數目。

count ‘<table name>’

在這裏插入圖片描述
(7)truncate: 禁用,刪除和重新創建一個指定的表。

truncate ‘table name’
在這裏插入圖片描述
在這裏插入圖片描述
(8)Java client API: 在此之前所有上述命令,Java提供了一個客戶端API來實現DML功能,CRUD(創建檢索更新刪除)操作更多的是通過編程,在org.apache.hadoop.hbase.client包下。 在此包HTable 的 Put和Get是重要的類。

8.2 java實例

8.2.1 準備

如果是用虛擬機搭建的hbase環境,要對虛擬機服務器的ip進行硬編碼.如果是雲服務器則可採用域名直接訪問hbase服務.進行硬編碼時,推薦採用switchhost進行硬編碼,不要直接在C盤下操作host文件.
在這裏插入圖片描述
測試硬編碼是否已正常啓用可以使用瀏覽器用:
http://hbase.domain:60010/master-status
在這裏插入圖片描述

8.2.2 java程序與hbase服務器的交互

詳細可參考案例代碼:
案例代碼:
鏈接:https://pan.baidu.com/s/1eb0xUI0vg2QNFtZKLC61mA
提取碼:nnrd
相關軟件:
鏈接:https://pan.baidu.com/s/1_xEGQYihzdNl3dsDY3-URA
提取碼:7fpt

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章