天天看點

《HBase企業應用開發實戰》—— 2.2 HBase運作模式

本節書摘來自華章出版社《hbase企業應用開發實戰》一 書中的第2章,第2.2節,作者:馬延輝 孟鑫 李立松 ,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

hbase有兩種運作模式:單機模式和分布式模式。在預設情況下hbase運作在單機模式下,如果要運作分布式模式的hbase,需要編輯安裝目錄下conf檔案夾中相關的配置檔案。

不管運作在什麼模式下,都需要編輯安裝包的conf目錄下的hbase-env.sh檔案來告知hbase java的安裝路徑。在這個檔案中還可以設定hbase的運作環境,諸如heap size和其他有關jvm的選項,還有日志檔案儲存目錄、程序優先級等。最重要的是設定java_home指向java安裝的路徑,在該檔案中搜尋java_home,找到如下一行:

去掉前面的#注釋,将java_home配置為實際的java安裝路徑。

這是hbase預設的運作模式,在單機模式中,hbase使用本地檔案系統,而不是hdfs,所有的服務和zookeeper都運作在一個jvm中。zookeeper監聽一個端口,這樣用戶端就可以連接配接hbase了。

1.?配置jdk

需要安裝64位版本的jdk,推薦oracle公司的發行版,可以在www.oracle.com/us/downloads下載下傳并安裝,同時在環境變量中設定java_home和classpath。

2.?hbase安裝

在apache的網站上下載下傳一個穩定版本的安裝包,可以在這裡找到www.apache.org/dyn/closer.cgi/hbase/,本書使用的版本是0.94.18。

在待安裝的目錄下解壓縮安裝包:

tar zxf hbase-0.94.18.tar.gz

除了在安裝包的conf目錄下修改hbase-env.sh的java_home外,還需要修改該目錄下的hbase-site.xml檔案,示例如下:

其中:

hbase.rootdir代表hbase資料存放的位置,單機模式下存儲到本地目錄。

hbase.zookeeper.property.datadir代表zookeeper資料存放的位置。

3.?啟動hbase

運作如下腳本啟動hbase:

bin/start-hbase.sh

啟動成功後通過jps指令應該可以看到如下資訊:

4496 hmaster

通過如下指令可以連接配接到hbase表示安裝成功:

bin/hbase shell

連接配接成功後顯示:

hbase shell; enter 'help' for list of supported commands.

type "exit" to leave the hbase shell

version 0.94.18, r1577788, sat mar 15 04:46:47 utc 2014

hbase(main):001:0>

hbase分布式模式有兩種。僞分布式模式是把所有程序運作在一台機器上,但不是一個jvm上;而完全分布式模式就是把整個服務分布在各個節點上。無論采用哪種分布式模式,都需要使用hdfs。在操作hbase之前,要确認hdfs可以正常運作。

在安裝hbase之後,需要确認僞分布式模式或完全分布式模式的配置是否正确,這兩種模式可以使用相同的驗證腳本。

1.?僞分布式模式

僞分布式模式是一個相對簡單的分布式模式,是用于測試的。不能把這個模式用于生産環節,也不能用于測試性能。

确認hdfs安裝成功之後,就可以先編輯安裝包conf目錄下的hbase-site.xml。在這個檔案中可以加入自己的配置,這個配置會覆寫hbase預設配置(預設配置在hbase-default.xml中)。運作hbase需要設定hbase.rootdir屬性。該屬性是指hbase在hdfs中使用的目錄的位置。例如,hbase根目錄是/hbase,namenode監聽locahost的9000端口,隻有一份資料副本(hdfs預設是3份副本)。可以在hbase-site.xml寫上如下内容:

由hbase自己建立hbase.rootdir。上面hdfs綁定到localhost,也就是說除了本機,其他機器連不上hbase。是以需要将localhost設定成主機名,其他機器才能通路它。

(1)啟動hbase

可以使用如下指令啟動hbase:

也可以在同一伺服器啟動額外備份hmaster:

bin/local-master-backup.sh start 1

“1”表示使用端口60001和60011,該備份的hmaster及其日志檔案放在logs/hbase-${user}-1-master-${hostname}.log中。

啟動多個備份hmaster:

bin/local-master-backup.sh start 2 3

可以啟動9個備份hmaster,最多可以有10個hmaster。

如果要啟動更多regionserver,可以執行如下指令:

bin/local-regionservers.sh start 1

“1”表示使用端口60201和60301,日志檔案存放在logs/hbase-${user}-1-regionserver$-{hostname}.log中。

在剛運作的regionserver上增加4個額外regionserver,最多可以支援100個。

bin/local-regionservers.sh start 2 3 4 5

(2)停止hbase

假設想停止備份hmaster 1,運作如下指令:

cat /${pid_dir}/hbase-${user}-1-master.pid |xargs kill -9

停止regionserver,可以運作如下指令:

bin/local-regionservers.sh stop 1

2.?分布式模式

(1)安裝zookeeper

解壓縮安裝包:

tar zxf zookeeper-3.4.5.tar.gz

将安裝包conf目錄下的zoo_sample.cfg檔案複制一份,命名為zoo.cfg。

修改zoo.cfg配置檔案,示例如下:

其中,2888是zookeeper服務之間通信的端口,而3888是zookeeper與其他應用程式通信的端口。

initlimit:這個配置項用來配置zookeeper接收用戶端(這裡所說的用戶端不是使用者連接配接zookeeper伺服器的用戶端,而是zookeeper伺服器叢集中連接配接到leader的follower伺服器)初始化連接配接時最長能忍受多少個心跳時間間隔數。這裡設定為10,說明如果超過10個心跳時間(也就是10倍ticktime)長度後zookeeper伺服器還沒有收到用戶端的傳回資訊,就表明這個用戶端連接配接失敗。總的時間長度就是10×2000=20(s)。

synclimit:這個配置項辨別leader與follower之間發送消息時請求和應答時間長度,最長不能超過多少個ticktime的時間長度,這裡設定為5,表明總的時間長度就是5×2000=10(s)。

server.a=b:c:d:其中a是一個數字,表示這是第幾号伺服器;b是這台伺服器的ip位址;c表示的是這台伺服器與叢集中的leader伺服器交換資訊的端口;d表示的是萬一叢集中的leader伺服器當機了,需要一個端口來重新進行選舉,選出一個新的leader伺服器,而這個端口就是用來執行選舉時伺服器互相通信的端口。如果是僞叢集的配置方式,由于b都是一樣的,是以不同的zookeeper執行個體通信端口不能一樣,要為它們配置設定不同的端口。

建立datadir參數指定的目錄(這裡指的是/home/hadoop/zookeeper-3.4.5/zookeeperdir/zookeeper-data),并在此目錄下建立檔案,命名為myid。

編輯myid檔案,并在對應的主機名的機器上輸入對應的編号。例如,在host1上,myid檔案内容就是1。由于本次隻在單點上進行安裝配置,是以隻有一個server.1。若還有其他伺服器,比如主機名為host2,則在zoo.cfg檔案中還需加入server.2=host2:2888:3888,那麼myid檔案在host2伺服器上的内容就是2。至此,如果是多伺服器配置,隻需要将zookeeper-3.4.5目錄複制到其他伺服器,然後按照上述方法修改myid。

設定環境變量:

export zookeeper_home=/home/hadoop/zookeeper-3.4.5

path=$zookeeper_home/bin:$path

export path

(2)啟動并測試zookeeper

在所有伺服器中執行:

zkserver.sh start

使用jps指令檢視程序:

19361 quorumpeermain

其中,quorumpeermain是zookeeper程序,說明啟動正常。

檢視服務狀态指令:

zkserver.sh status

列印輸出結果:

jmx enabled by default

using config: /home/hadoop/zookeeper-3.4.5/bin/../conf/zoo.cfg

mode: standalone

啟動用戶端腳本:

zkcli.sh -server host1:2181

停止zookeeper程序:

zkserver.sh stop

(3)配置hbase

一個分布式運作的hbase依賴一個zookeeper叢集。所有的節點和用戶端都必須能夠通路zookeeper。在預設情況下,hbase會管理一個zookeeper叢集。這個叢集會随着hbase的啟動而啟動。當然,也可以自己管理一個zookeeper叢集,需要修改conf/hbase-env.sh中的hbase_manages_zk來切換。hbase_manages_zk的預設值是true,作用是讓hbase啟動的同時也啟動zookeeper。

讓hbase使用一個現有的不被hbase托管的zookeeper叢集,需要設定conf/hbase-env.sh檔案中的hbase_manages_zk屬性為false。由于本書中使用hbase管理zookeeper,是以hbase-env.sh中配置如下:

export hbase_manages_zk=true

(4)配置hbase-site.xml

hbase.rootdir:這個目錄是regionserver的共享目錄,用來持久化hbase。url需要是“完全正确”的,還要包含檔案系統的scheme。例如,“/hbase”表示hbase在hdfs中占用的實際存儲目錄,hdfs的namenonde運作在主機名為host1的9000端口,則hbase.rootdir的設定應為hdfs://host1:9000/hbase。在預設情況下hbase是寫到/tmp中的。不修改這個配置,資料會在重新開機的時候丢失。預設為file:///tmp/hbase-${user.name}/hbase。

hbase.cluster.distributed:hbase的運作模式。為false表示單機模式,為true表示分布式模式。若為false,hbase和zookeeper會運作在同一個jvm中。預設值是false。

當hbase管理zookeeper的時候,可以通過修改zoo.cfg來配置zookeeper。一個更加簡單的方法是在conf/hbase-site.xml中修改zookeeper的配置。zookeeper的配置作為property寫在hbase-site.xml中。

對于zookeeper的配置,至少要在hbase-site.xml中列出全部的zookeeper的主機,具體的參數是hbase.zookeeper.quorum,該屬性的預設值是localhost,這個值對于分布式應用顯然是不可用的(遠端連接配接無法使用)。

zookeeper叢集的位址清單用逗号分隔,例如:“host1,host2,host3”。預設是localhost,是供僞分布式模式使用的,修改才能在完全分布式模式下使用。如果在hbase-env.sh中設定hbase_manages_zk為true,這些zookeeper節點就會和hbase一起啟動。

hbase.zookeeper.property.clientport:表示用戶端連接配接zookeeper的端口。

運作隻有1台主機的zookeeper也是可以的,但是在生産環境中,最好部署3、5、7個節點。部署得越多,可靠性就越高,當然隻能部署奇數個,偶數個是不可以的。需要配置設定給每個zookeeper 1gb左右的記憶體,有可能的話最好配置設定獨立的磁盤。(獨立磁盤可以確定zookeeper是高性能的。)如果叢集負載很重,不要把zookeeper和regionserver運作在同一台機器上。

base.zookeeper.property.datadir:這個參數用于設定zookeeper快照的存儲位置。預設值是/tmp,在操作重新開機的時候該目錄會被清空,應該修改預設值到其他目錄,可以修改到/home/hadoop/zookeeperdata(這個路徑需要運作hbase的使用者擁有讀寫操作權限)。

對于獨立的zookeeper,要指明zookeeper的主機和端口,可以在hbase-site.xml中設定,也可以在hbase的classpath下面加一個zoo.cfg配置檔案。hbase會優先加載zoo.cfg中的配置,覆寫hbase-site.xml中的。

(5)配置regionservers檔案

在完全分布式模式下還需要修改安裝包的conf目錄下的regionservers檔案。在這裡列出了希望運作的全部regionserver,一行寫一個主機名(就像hadoop中的slaves一樣)。這裡列出的server會随着叢集的啟動而啟動,叢集的停止而停止。

regionservers檔案示例:

host1

host2

(6)替換hadoop的jar包

複制hadoop安裝路徑的lib目錄下的hadoop-core-*.jar包到hbase的lib目錄下覆寫hbase自帶的hadoop jar包,否則hbase叢集在運作時可能出現一些難以解決的問題。

(7)運作hbase

當zookeeper由hbase托管的時候,zookeeper叢集的啟動是hbase啟動腳本的一部分。

首先确認hdfs是運作着的,然後用如下指令啟動hbase:

這個腳本在hbase_home的bin目錄中。現在hbase已經啟動了。hbase把log記在logs子目錄中,當hbase啟動出問題的時候,可以檢視log檔案。

一旦hbase啟動,可以使用指令建立表,插入資料,掃描資料表,還有禁用這個表,最後把它删掉。

可以通過如下腳本停止hbase叢集:

$./bin/stop-hbase.sh

停止操作需要一些時間,而且叢集越大,停的時間可能會越長。如果正在運作一個分布式的操作,要确認在hbase徹底停止之前,hadoop不能停止。

可以使用如下指令單獨啟動或停止zookeeper而不啟動hbase:

${hbase_home}/bin/hbase-daemons.sh {start,stop} zookeeper

(8)驗證安裝

可以使用jps指令檢視程序,在hmaster上:

8371 hmaster

8314 hquorumpeer

在regionserver節點上:

4256 hregionserver

4594 hquorumpeer