在本節(jié)中,你將首先學(xué)習(xí)單節(jié)點(diǎn)、獨(dú)立的HBase的設(shè)置,并且學(xué)會(huì)運(yùn)行單節(jié)點(diǎn)、獨(dú)立的HBase實(shí)例!
在一個(gè)獨(dú)立的HBase實(shí)例中,它具有所有的HBase系統(tǒng)服務(wù)程序:Master、RegionServers 和 ZooKeeper(在一個(gè)持續(xù)到本地文件系統(tǒng)的單一 JVM 中運(yùn)行)。這是我們最基本的部署配置文件。我們將向您展示如何使用 HBase shell CLI 在 HBase 中創(chuàng)建表,在表中插入行,對(duì)表執(zhí)行放置和掃描操作,啟用或禁用表,以及啟動(dòng)和停止 HBase。除了下載 HBase,只要10分鐘就可以完成以下的操作。
注意:在HBase 0.94.x之前,HBase預(yù)計(jì)環(huán)回IP地址為127.0.0.1。Ubuntu和其他一些發(fā)行版默認(rèn)為127.0.1.1,這會(huì)給你帶來問題。請(qǐng)參閱為什么HBase關(guān)心/ etc / hosts?為細(xì)節(jié)
以下/etc/hosts文件可以在Ubuntu的HBase 0.94.x及更早版本上正確運(yùn)行。如果遇到麻煩,請(qǐng)將其作為模板使用。
127.0.0.1 localhost ubuntu.ubuntu-domain Ubuntu下的127.0.0.1
這個(gè)問題已經(jīng)在hbase-0.96.0及更高版本中得到修復(fù)。
HBase要求安裝JDK。
選擇一個(gè)Apache 下載鏡像,下載 HBase Releases。點(diǎn)擊stable目錄,然后下載后綴為.tar.gz的二進(jìn)制文件到你的到本地文件系統(tǒng);例如 hbase-0.95-SNAPSHOT.tar.gz。
解壓下載的文件,然后進(jìn)入到那個(gè)要解壓的目錄。
$ tar xfz hbase-0.95-SNAPSHOT.tar.gz
$ cd hbase-0.95-SNAPSHOT
在你啟動(dòng)HBase之前,需要先設(shè)置 JAVA_HOME 環(huán)境變量。您可以通過操作系統(tǒng)的常規(guī)機(jī)制來設(shè)置變量,但HBase提供了一個(gè)中心機(jī)制 conf/hbase-env.sh,編輯此文件,取消注釋以下行JAVA_HOME
,并將其設(shè)置為您的操作系統(tǒng)的適當(dāng)位置,JAVA_HOME 變量應(yīng)設(shè)置為包含可執(zhí)行文件 bin/JAVA 的目錄。大多數(shù)現(xiàn)代 Linux 操作系統(tǒng)都提供了一種機(jī)制,例如在 RHEL 或 CentOS 上的替代方法,用于在 Java 等可執(zhí)行版本之間進(jìn)行透明切換。在這種情況下,您可以將
JAVA_HOME 設(shè)置為包含指向 bin/JAVA 的符號(hào)鏈接的目錄,這通常是:/usr。
JAVA_HOME = / USR
編輯conf/hbase-site.xml,這是HBase的主要配置文件。此時(shí),您只需要在HBase和ZooKeeper寫入數(shù)據(jù)的本地文件系統(tǒng)上指定目錄即可。默認(rèn)情況下,在/tmp下創(chuàng)建一個(gè)新目錄。許多服務(wù)器被配置為在重啟時(shí)刪除/tmp的內(nèi)容,所以你應(yīng)該在其他地方存儲(chǔ)數(shù)據(jù)。以下配置將把HBase的數(shù)據(jù)存儲(chǔ)在hbase目錄下的testuser
用戶主目錄中。將<property>
標(biāo)簽粘貼到標(biāo)簽下<configuration>
,在新的HBase安裝中應(yīng)該是空的。
獨(dú)立HBase的hbase-site.xml:
<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:///home/testuser/hbase</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/testuser/zookeeper</value>
</property>
</configuration>
您不需要?jiǎng)?chuàng)建HBase數(shù)據(jù)目錄,HBase會(huì)為你做這個(gè)。
注意:上述示例中的hbase.rootdir指向本地文件系統(tǒng)中的一個(gè)目錄。'file:/'前綴是我們?nèi)绾伪硎颈镜匚募到y(tǒng)。要在現(xiàn)有的HDFS實(shí)例上安裝HBase,請(qǐng)將hbase.rootdir設(shè)置為指向您實(shí)例上的目錄:例如,hdfs://namenode.example.org:8020/hbase。有關(guān)更多信息,請(qǐng)參見下面關(guān)于獨(dú)立 HBase HDFS 的部分。
提供了bin/start-hbase.sh腳本來方便的啟動(dòng)HBase。發(fā)出命令,如果一切正常,則會(huì)將消息記錄到標(biāo)準(zhǔn)輸出,顯示HBase已成功啟動(dòng)。您可以使用該jps命令來驗(yàn)證您是否有一個(gè)名為 HMaster 的正在運(yùn)行的進(jìn)程。在獨(dú)立模式下,HBase在單個(gè)JVM中運(yùn)行所有守護(hù)進(jìn)程,即HMaster,單個(gè)HRegionServer和ZooKeeper守護(hù)進(jìn)程。
為此,打開HBase主文件夾,然后運(yùn)行HBase啟動(dòng)腳本,如下所示:
$cd /usr/local/HBase/bin
$./start-hbase.sh
如果一切順利,當(dāng)運(yùn)行HBase啟動(dòng)腳本,它會(huì)提示一條消息:HBase已經(jīng)啟動(dòng)
starting master, logging to /usr/local/HBase/bin/../logs/hbase-tpmaster-localhost.localdomain.out
提示:Java需要安裝并可用。如果您得到一個(gè)錯(cuò)誤,指示Java未安裝,但它位于您的系統(tǒng)上(可能位于非標(biāo)準(zhǔn)位置),請(qǐng)編輯conf / hbase-env.sh文件,并將該JAVA_HOME
設(shè)置修改為指向包含在你的系統(tǒng)上的bin/Java。
$ ./bin/hbase shell
hbase(main):001:0>
hbase(main):001:0> create 'test', 'cf'
0 row(s) in 0.4170 seconds
=> Hbase::Table - test
hbase(main):002:0> list 'test'
TABLE
test
1 row(s) in 0.0180 seconds
=> ["test"]
hbase(main):003:0> put 'test', 'row1', 'cf:a', 'value1'
0 row(s) in 0.0850 seconds
hbase(main):004:0> put 'test', 'row2', 'cf:b', 'value2'
0 row(s) in 0.0110 seconds
hbase(main):005:0> put 'test', 'row3', 'cf:c', 'value3'
0 row(s) in 0.0100 seconds
在這里,我們插入三個(gè)值,一次一個(gè)。第一個(gè)插入是在row1,列cf:a,值為value1。HBase 中的列由列族前綴組成,在此示例中為cf,后跟一個(gè)冒號(hào),然后是一個(gè)列限定符后綴(在本例中為 a)。hbase(main):006:0> scan 'test'
ROW COLUMN+CELL
row1 column=cf:a, timestamp=1421762485768, value=value1
row2 column=cf:b, timestamp=1421762491785, value=value2
row3 column=cf:c, timestamp=1421762496210, value=value3
3 row(s) in 0.0230 seconds
hbase(main):007:0> get 'test', 'row1'
COLUMN CELL
cf:a timestamp=1421762485768, value=value1
1 row(s) in 0.0350 seconds
hbase(main):008:0> disable 'test'
0 row(s) in 1.1820 seconds
hbase(main):009:0> enable 'test'
0 row(s) in 0.1770 seconds
如果您測(cè)試了上面的“enable”命令,請(qǐng)?jiān)俅谓帽砀瘢?pre lang="javascript">hbase(main):010:0> disable 'test'
0 row(s) in 1.1820 seconds
hbase(main):011:0> drop 'test'
0 row(s) in 0.1370 seconds
$ ./bin/stop-hbase.sh
stopping hbase....................
$
以上向您展示了如何啟動(dòng)和停止一個(gè)獨(dú)立的HBase實(shí)例。在接下來的部分中,我們將簡(jiǎn)要介紹一下HBase部署的其他模式。
在通過快速啟動(dòng)HBase的獨(dú)立模式工作之后,您可以重新配置HBase以偽分布式模式運(yùn)行。偽分布模式意味著HBase仍然在單個(gè)主機(jī)上完全運(yùn)行,但是每個(gè)HBase守護(hù)進(jìn)程(HMaster,HRegionServer和ZooKeeper)作為一個(gè)單獨(dú)的進(jìn)程運(yùn)行:在獨(dú)立模式下,所有守護(hù)進(jìn)程都運(yùn)行在一個(gè)jvm進(jìn)程/實(shí)例中。默認(rèn)情況下,除非按照快速啟動(dòng)HBase的獨(dú)立模式中所述配置hbase.rootdir屬性,否則您的數(shù)據(jù)仍存儲(chǔ)在/tmp/中。在本演練中,我們將數(shù)據(jù)存儲(chǔ)在HDFS中,假設(shè)您有HDFS可用。您可以跳過HDFS配置,繼續(xù)將數(shù)據(jù)存儲(chǔ)在本地文件系統(tǒng)中。
Hadoop配置
此過程假定您已在本地系統(tǒng)或遠(yuǎn)程系統(tǒng)上配置Hadoop和HDFS,并且它們正在運(yùn)行且可用。它還假定您正在使用Hadoop 2。
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
接下來,將 hbase rootdir 從本地文件系統(tǒng)更改為您的 HDFS 實(shí)例的地址,使用 HDFS:////或 URI 語法。在這個(gè)例子中,HDFS在端口8020的本地主機(jī)上運(yùn)行。<property>
<name>hbase.rootdir</name>
<value>hdfs://localhost:8020/hbase</value>
</property>
您不需要在HDFS中創(chuàng)建目錄。HBase會(huì)為你做這個(gè)。如果你創(chuàng)建了這個(gè)目錄,HBase會(huì)試圖做一個(gè)遷移,這不是你想要的。$ ./bin/hadoop fs -ls /hbase
Found 7 items
drwxr-xr-x - hbase users 0 2014-06-25 18:58 /hbase/.tmp
drwxr-xr-x - hbase users 0 2014-06-25 21:49 /hbase/WALs
drwxr-xr-x - hbase users 0 2014-06-25 18:48 /hbase/corrupt
drwxr-xr-x - hbase users 0 2014-06-25 18:58 /hbase/data
-rw-r--r-- 3 hbase users 42 2014-06-25 18:41 /hbase/hbase.id
-rw-r--r-- 3 hbase users 7 2014-06-25 18:41 /hbase/hbase.version
drwxr-xr-x - hbase users 0 2014-06-25 21:49 /hbase/oldWALs
注意:在同一個(gè)硬件上運(yùn)行多個(gè)HMaster實(shí)例在生產(chǎn)環(huán)境中是沒有意義的,就像運(yùn)行偽分布式集群對(duì)于生產(chǎn)沒有意義一樣。此步驟僅供測(cè)試和學(xué)習(xí)之用。
HMaster服務(wù)器控制HBase集群。你可以啟動(dòng)最多9個(gè)備份HMaster服務(wù)器,這個(gè)服務(wù)器總共有10個(gè)HMaster計(jì)算主服務(wù)器。要啟動(dòng)備份HMaster,請(qǐng)使用local-master-backup.sh。對(duì)于要啟動(dòng)的每個(gè)備份主節(jié)點(diǎn),請(qǐng)?zhí)砑右粋€(gè)表示該主節(jié)點(diǎn)的端口偏移量的參數(shù)。每個(gè)HMaster使用三個(gè)端口(默認(rèn)情況下為16010,16020和16030)。端口偏移量被添加到這些端口,因此使用偏移量2,備份HMaster將使用端口16012,16022和16032。以下命令使用端口:16012/16022/16032,16013/16023/16033和16015/16025/16035啟動(dòng)3個(gè)備份服務(wù)器。
$ ./bin/local-master-backup.sh start 2 3 5
要在不殺死整個(gè)群集的情況下殺死備份主機(jī),則需要查找其進(jìn)程ID(PID)。PID存儲(chǔ)在一個(gè)名為/tmp/hbase-USER-X-master.pid的文件中。該文件的唯一內(nèi)容是PID。您可以使用該kill -9命令來殺死該P(yáng)ID。以下命令將終止具有端口偏移1的主服務(wù)器,但保持群集正在運(yùn)行:
$ cat /tmp/hbase-testuser-1-master.pid |xargs kill -9
$ .bin/local-regionservers.sh start 2 3 4 5
要手動(dòng)停止RegionServer,請(qǐng)使用帶有stop參數(shù)和服務(wù)器偏移量的local-regionservers.sh命令停止。
$ .bin/local-regionservers.sh stop 3
實(shí)際上,您需要一個(gè)完全分布式的配置來全面測(cè)試HBase,并將其用于實(shí)際場(chǎng)景中。在分布式配置中,集群包含多個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)運(yùn)行一個(gè)或多個(gè)HBase守護(hù)進(jìn)程。這些包括主要和備份主實(shí)例,多個(gè)ZooKeeper節(jié)點(diǎn)和多個(gè)RegionServer節(jié)點(diǎn)。
此高級(jí)快速入門將兩個(gè)以上的節(jié)點(diǎn)添加到您的群集。架構(gòu)如下:
節(jié)點(diǎn)名稱 | Master | ZooKeeper | RegionServer |
---|---|---|---|
node-a.example.com | 是 | 是 | 沒有 |
node-b.example.com | 備用 | 是 | 是 |
node-c.example.com | 沒有 | 是 | 是 |
這個(gè)快速入門假定每個(gè)節(jié)點(diǎn)都是虛擬機(jī),并且它們都在同一個(gè)網(wǎng)絡(luò)上。它基于之前的快速入門、偽分布式本地安裝,假設(shè)您在該過程中配置的系統(tǒng)是現(xiàn)在node-a。繼續(xù)之前,在node-a停止HBase 。
提示:請(qǐng)確保所有節(jié)點(diǎn)都具有完全的通信訪問權(quán)限,并且沒有任何防火墻規(guī)則可以阻止它們相互交談。如果您看到任何錯(cuò)誤,如no route to host
,請(qǐng)檢查您的防火墻。
node-a需要能夠登錄node-b和node-c(和自己)才能啟動(dòng)守護(hù)進(jìn)程。實(shí)現(xiàn)這一點(diǎn)的最簡(jiǎn)單的方法是在所有主機(jī)上使用相同的用戶名,并配置無密碼的SSH登錄,從node-a到其他的。
$ ssh-keygen -t rsa
如果命令成功,密鑰對(duì)的位置將打印到標(biāo)準(zhǔn)輸出。公鑰的默認(rèn)名稱是id_rsa.pub。
$ cat id_rsa.pub >> ~/.ssh/authorized_keys
node-a將運(yùn)行您的主要主服務(wù)器和ZooKeeper進(jìn)程,但不運(yùn)行RegionServers。從node-a停止啟動(dòng)RegionServer。
<property>
<name>hbase.zookeeper.quorum</name>
<value>node-a.example.com,node-b.example.com,node-c.example.com</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/usr/local/zookeeper</value>
</property>
node-b 將運(yùn)行一個(gè)備份主服務(wù)器和一個(gè)ZooKeeper實(shí)例。
$ bin/start-hbase.sh
node-c.example.com: starting zookeeper, logging to /home/hbuser/hbase-0.98.3-hadoop2/bin/../logs/hbase-hbuser-zookeeper-node-c.example.com.out
node-a.example.com: starting zookeeper, logging to /home/hbuser/hbase-0.98.3-hadoop2/bin/../logs/hbase-hbuser-zookeeper-node-a.example.com.out
node-b.example.com: starting zookeeper, logging to /home/hbuser/hbase-0.98.3-hadoop2/bin/../logs/hbase-hbuser-zookeeper-node-b.example.com.out
starting master, logging to /home/hbuser/hbase-0.98.3-hadoop2/bin/../logs/hbase-hbuser-master-node-a.example.com.out
node-c.example.com: starting regionserver, logging to /home/hbuser/hbase-0.98.3-hadoop2/bin/../logs/hbase-hbuser-regionserver-node-c.example.com.out
node-b.example.com: starting regionserver, logging to /home/hbuser/hbase-0.98.3-hadoop2/bin/../logs/hbase-hbuser-regionserver-node-b.example.com.out
node-b.example.com: starting master, logging to /home/hbuser/hbase-0.98.3-hadoop2/bin/../logs/hbase-hbuser-master-nodeb.example.com.out
ZooKeeper首先啟動(dòng),然后是master,然后是RegionServers,最后是backup masters。例子:node-a jps輸出:
$ jps
20355 Jps
20071 HQuorumPeer
20137 HMaster
示例:node-b jps輸出:$ jps
15930 HRegionServer
16194 Jps
15838 HQuorumPeer
16010 HMaster
例子:node-c jps輸出:$ jps
13901 Jps
13639 HQuorumPeer
13737 HRegionServer
ZooKeeper進(jìn)程名稱這個(gè)HQuorumPeer過程是一個(gè)由HBase控制和啟動(dòng)的ZooKeeper實(shí)例。如果以這種方式使用ZooKeeper,則每個(gè)群集節(jié)點(diǎn)僅限于一個(gè)實(shí)例,并且僅適用于測(cè)試。如果ZooKeeper在HBase之外運(yùn)行,則調(diào)用該進(jìn)程QuorumPeer。
更多建議: