一、前言
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 |
節點介紹:
- NameNode
目錄的管理者,每一個集羣都有一個,記錄實時的數據變化,如果沒有namenode,HDFS就無法工作,系統中的文件將會全部丟失,就無法將位於不同datanode上的文件快(blocks)重建文件。因此它的容錯機制很有必要。
它主要負責:
接收用戶的請求;
維護文件系統的目錄結構;
管理文件與Block之間的練習
- DataNode
是文件系統的工作節點,他們根據客戶端或者是namenode的調度存儲和檢索,並且定期向namenode發送他們所存儲的塊(block)的列表。
集羣中的每個服務器都運行一個DataNode後臺程序,這個後臺程序負責把HDFS數據塊讀寫到本地的文件系統。當需要通過客戶端讀/寫某個 數據時,先由NameNode告訴客戶端去哪個DataNode進行具體的讀/寫操作,然後,客戶端直接與這個DataNode服務器上的後臺程序進行通信,並且對相關的數據塊進行讀/寫操作。
它主要負責:
存放數據;
文件被分割以Block的形式被存儲在磁盤上;
- ResourceManager
①與客戶端進行交互,處理來自於客戶端的請求,如查詢應用的運行情況等。
②啓動和管理各個應用的ApplicationMaster,並且爲ApplicationMaster申請第一個Container用於啓動和在它運行失敗時將它重新啓動。
③管理NodeManager,接收來自NodeManager的資源和節點健康情況彙報,並向NodeManager下達管理資源命令,例如kill掉某個container。
④資源管理和調度,接收來自ApplicationMaster的資源申請,並且爲其進行分配。這個是它的最重要的職能。
- NodeManager
NM是ResourceManager在每臺機器上的代理,負責容器管理,並監控它們的資源使用情況,以及向ResourceManager/Scheduler提供資源使用報告。
- JournalNode
JournalNode可以讓兩個namenode之間進行相互通信,達到數據同步的作用。當active狀態的NameNode的命名空間有任何修改時,會告知大部分的JournalNodes進程。standby狀態的NameNode有能力讀取JNs中的變更信息,並且一直監控edit log的變化,把變化應用於自己的命名空間。standby可以確保在集羣出錯時,命名空間狀態已經完全同步了。
運行的JournalNode進程非常輕量,可以部署在其他的服務器上。注意:必須允許至少3個節點。當然可以運行更多,但是必須是奇數個,如3、5、7、9個等等。當運行N個節點時,系統可以容忍至少(N-1)/2(N至少爲3)個節點失敗而不影響正常運行。
- QuorumPeerMain
Zookeeper的運行進程,zookeeper的詳細介紹可以參考5.1的解說。
- DFSZKFailoverController
DFSZKFailoverController是Hadoop-2.7.7中HDFS NameNode HA實現的中心組件,它負責整體的故障轉移控制等。它是一個守護進程,通過main()方法啓動,繼承自ZKFailoverController.
6.2.2 HDFS HA架構圖
- HDFS HA架構中有兩臺NameNode節點,一臺是處於活動狀態(Active)爲客戶端提供服務,另外一臺處於熱備份狀態(Standby)。
- 元數據文件有兩個文件:fsimage和edits,備份元數據就是備份這兩個文件。JournalNode用來實時從Active NameNode上拷貝edits文件,JournalNode有三臺也是爲了實現高可用。
- Standby NameNode不對外提供元數據的訪問,它從Active NameNode上拷貝fsimage文件,從JournalNode上拷貝edits文件,然後負責合併fsimage和edits文件,相當於SecondaryNameNode的作用。最終目的是保證Standby的NameNode上的元數據信息和Active NameNode上的元數據信息一致,以實現熱備份。
- Zookeeper來保證在Active NameNode失效時及時將Standby NameNode修改爲Active狀態。
- ZKFC(失效檢測控制)是Hadoop裏的一個Zookeeper客戶端,在每一個NameNode節點上都啓動一個ZKFC進程,來監控NameNode的狀態,並把NameNode的狀態信息彙報給Zookeeper集羣,其實就是在Zookeeper上創建了一個Znode節點,節點裏保存了NameNode狀態信息。當NameNode失效後,ZKFC檢測到報告給Zookeeper,Zookeeper把對應的Znode刪除掉,Standby ZKFC發現沒有Active狀態的NameNode時,就會用shell命令將自己監控的NameNode改爲Active狀態,並修改Znode上的數據。
- Znode是個臨時的節點,臨時節點特徵是客戶端的連接斷了後就會把znode刪除,所以當ZKFC失效時,也會導致切換NameNode。
- DataNode會將心跳信息和Block彙報信息同時發給兩臺NameNode,DataNode只接受Active NameNode發來的文件讀寫操作指令。
6.2.3 YARN HA 架構圖
- MasterHADaemon:控制RM的 Master的啓動和停止,和RM運行在一個進程中,可以接收外部RPC命令。
- 共享存儲:Active Master將信息寫入共享存儲,Standby Master讀取共享存儲信息以保持和Active Master同步。
- ZKFailoverController:基於Zookeeper實現的切換控制器,由ActiveStandbyElector和HealthMonitor組成,ActiveStandbyElector負責與Zookeeper交互,判斷所管理的Master是進入Active還是Standby;HealthMonitor負責監控Master的活動健康情況,是個監視器。
- Zookeeper:核心功能是維護一把全局鎖控制整個集羣上只有一個Active的ResourceManager。
6.3 HDFS HA集羣安裝
6.3.1 配置jdk的環境變量
配置Hadoop JDK路徑修改hadoop-env.sh、mapred-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相關節點介紹:
- HMaster
HBase的管理節點,通常在一個集羣中設置一個主Master,一個備Master,主備角色的"仲裁"由ZooKeeper實現。 Master主要職責:
①負責管理所有的RegionServer。
②建表/修改表/刪除表等DDL操作請求的服務端執行主體。
③管理所有的數據分片(Region)到RegionServer的分配。
④如果一個RegionServer宕機或進程故障,由Master負責將它原來所負責的Regions轉移到其它的RegionServer上繼續提供服務。
⑤Master自身也可以作爲一個RegionServer提供服務,該能力是可配置的。
- 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