主流NoSQL數(shù)據(jù)庫(kù)評(píng)測(cè)之HBase
本篇要評(píng)測(cè)的NoSQL產(chǎn)品是HBase,和其他簡(jiǎn)單的Key-Value結(jié)構(gòu)不同,HBase主要面向處理海量數(shù)據(jù)的應(yīng)用,可以認(rèn)為是Google BigTable的一個(gè)開(kāi)源版本。由于Facebook使用HBase來(lái)存儲(chǔ)消息內(nèi)容和大數(shù)據(jù)量的實(shí)時(shí)分析而使得這一產(chǎn)品備受關(guān)注。
一、HBase簡(jiǎn)介
HBase是用Java開(kāi)發(fā)的,是一個(gè)開(kāi)源的、分布式的、面向列的數(shù)據(jù)庫(kù),其存儲(chǔ)的每個(gè)值都有一個(gè)時(shí)間戳,可以根據(jù)定義好的規(guī)則保存多個(gè)版本(默認(rèn)是3個(gè)),這樣就可以記錄數(shù)據(jù)的變動(dòng)情況。
HBase和Hadoop無(wú)縫集成,可以利用HDFS實(shí)現(xiàn)數(shù)據(jù)的底層分布式存儲(chǔ),保證冗余和可靠性,通過(guò)ZooKeeper來(lái)實(shí)現(xiàn)一致性和高可用性。
HBase有兩種部署方式:一種是比較簡(jiǎn)單的單實(shí)例方式,它已經(jīng)內(nèi)置了0.20版本的Hadoop包和一個(gè)本地ZooKeeper,它們運(yùn)行在同一個(gè) JVM之下,可以用本地文件系統(tǒng)而不用HDFS。另外一種比較復(fù)雜的分布式部署,需要在每一個(gè)節(jié)點(diǎn)替換自帶的Hadoop包以免有版本問(wèn)題,而且必須有一個(gè)HDFS實(shí)例,同時(shí)需要獨(dú)立的ZooKeeper集群,這也是處理海量數(shù)據(jù)時(shí)的推薦的部署方式。本文為測(cè)試方便,使用簡(jiǎn)單的單實(shí)例部署方式。
二、安裝和使用
首先從鏡像下載最新版的HBase,目前最新的版本是0.90.3:
- [root@localhost hbase]# wget http://mirror.bjtu.edu.cn/apache/hbase/stable/hbase-0.90.3.tar.gz
先檢查下本地的JDK版本是否在1.6以上:
- [root@localhost hbase]# java -version
- java version "1.6.0_24"
解壓并配置數(shù)據(jù)文件的路徑:
- [root@localhost hbase]# tar zxvf hbase-0.90.3.tar.gz
- [root@localhost hbase]# cd hbase-0.90.3/conf
- [root@localhost conf]# vi hbase-site.xml
- </configuration>
- <configuration>
- <property>
- <name>hbase.rootdir</name>
- <value>/home/banping/hbase/data</value>
- </property>
啟動(dòng)Hbase進(jìn)程:
- [root@localhost hbase-0.90.3]# bin/start-hbase.sh
- starting master, logging to /home/banping/hbase/hbase-0.90.3/bin/../logs/hbase-root-master-localhost.localdomain.out
可以通過(guò)自帶的shell命令來(lái)進(jìn)行基本的操作:
- [root@localhost hbase-0.90.3]# bin/hbase shell
- hbase(main):002:0> create 'test','cf'
- 0 row(s) in 0.9940 seconds
- hbase(main):019:0> list
- TABLE
- test
- 1 row(s) in 0.0290 seconds
- hbase(main):022:0> put 'test', 'row1', 'cf:a', 'value1'
- 0 row(s) in 0.2130 seconds
- hbase(main):023:0> put 'test', 'row2', 'cf:b', 'value2'
- 0 row(s) in 0.0120 seconds
- hbase(main):024:0> put 'test', 'row3', 'cf:c', 'value3'
- 0 row(s) in 0.0130 seconds
- hbase(main):025:0> scan 'test'
- ROW COLUMN+CELL
- row1 column=cf:a, timestamp=1310027460885, value=value1
- row2 column=cf:b, timestamp=1310027469458, value=value2
- row3 column=cf:c, timestamp=1310027476262, value=value3
- 3 row(s) in 0.0870 seconds
- hbase(main):026:0> get 'test', 'row1'
- COLUMN CELL
- cf:a timestamp=1310027460885, value=value1
- 1 row(s) in 0.0250 seconds
- hbase(main):027:0> disable 'test'
- 0 row(s) in 2.0920 seconds
- hbase(main):029:0> drop 'test'
- 0 row(s) in 1.1440 seconds
- hbase(main):030:0> exit
停止Hbase實(shí)例:
- [root@localhost hbase-0.90.3]# ./bin/stop-hbase.sh
- stopping hbase......
如果使用PHP操作Hbase,可以使用Facebook開(kāi)源出來(lái)的thrift,官網(wǎng)是:http://thrift.apache.org/ ,它是一個(gè)類似ice的中間件,用于不同系統(tǒng)語(yǔ)言間信息交換。首先下載最新的版本0.6.1:
- [root@localhost hbase]# wget http://mirror.bjtu.edu.cn/apache//thrift/0.6.1/thrift-0.6.1.tar.gz
安裝需要的依賴包:
- [root@localhost thrift-0.6.1]# sudo yum install automake libtool flex bison pkgconfig gcc-c++ boost-devel libevent-devel zlib-devel python-devel ruby-devel
編譯安裝:
- [root@localhost thrift-0.6.1]# ./configure --prefix=/home/banping/hbase/thrift --with-php-config=/usr/local/php/bin/
- [root@localhost thrift-0.6.1]# make
- [root@localhost thrift-0.6.1]# make install
生成php和hbase的接口文件:
- [root@localhost hbase]# thrift/bin/thrift --gen php /home/banping/hbase/hbase-0.90.3/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift
- [root@localhost hbase]# cd gen-php/Hbase
- [root@localhost Hbase]# ll
- total 320
- -rw-r--r-- 1 root root 285433 Jul 7 19:22 Hbase.php
- -rw-r--r-- 1 root root 27426 Jul 7 19:22 Hbase_types.php
把PHP客戶端需要的包及剛才生成的接口文件復(fù)制出來(lái)供php程序調(diào)用:
- [root@localhost Hbase]# cp -a /home/banping/hbase/thrift-0.6.1/lib/php /home/webtest/thrift/
- [root@localhost Hbase]# cd /home/webtest/thrift/
- [root@localhost thrift]# mkdir packages
- [root@localhost thrift]# cp -a /home/banping/hbase/gen-php/Hbase /home/webtest/thrift/packages
啟動(dòng)hbase和thrift進(jìn)程:
- [root@localhost hbase-0.90.3]# ./bin/start-hbase.sh
- [root@localhost hbase-0.90.3]# ./bin/hbase-daemon.sh start thrift
- starting thrift, logging to /home/banping/hbase/hbase-0.90.3/bin/../logs/hbase-root-thrift-localhost.localdomain.out
thrift服務(wù)默認(rèn)監(jiān)聽(tīng)的端口是9090。至此測(cè)試環(huán)境搭建完畢。
#p#
三、測(cè)試說(shuō)明
1、測(cè)試環(huán)境
HBase部署在一臺(tái)PC 服務(wù)器上,配置如下:
CPU為Xeon 2.80GHz *4
內(nèi)存為4G
硬盤為一塊400G SATA盤
操作系統(tǒng)為64位CentOS 5.3版本
2、測(cè)試方法
采用PHP客戶端進(jìn)行測(cè)試,在安裝過(guò)程中我們已經(jīng)獲取了PHP客戶端訪問(wèn)HBase需要的包含文件。
為了不對(duì)測(cè)試服務(wù)器產(chǎn)生額外的影響,測(cè)試客戶端部署在另外一臺(tái)獨(dú)立的服務(wù)器上,運(yùn)行的PHP的版本是5.3.5,web server是Nginx 0.8.54,通過(guò)fastcgi的方式調(diào)用PHP服務(wù)。使用apache ab工具實(shí)現(xiàn)多個(gè)請(qǐng)求和并發(fā)操作。
測(cè)試過(guò)程首先是進(jìn)行寫操作,通過(guò)500個(gè)請(qǐng)求,每個(gè)請(qǐng)求寫入10000條記錄,并發(fā)度為1來(lái)共寫入500萬(wàn)條數(shù)據(jù),每個(gè)行(row)定義為數(shù)字1到 5000000,列(column)標(biāo)記為id:對(duì)應(yīng)的行id,列value為100個(gè)字節(jié)大小的數(shù)據(jù),版本默認(rèn)為記錄3個(gè)。然后是讀操作,發(fā)起5000 個(gè)請(qǐng)求,每個(gè)請(qǐng)求隨機(jī)根據(jù)row id值讀出1000條記錄,并發(fā)度為10共讀出500萬(wàn)條記錄,評(píng)測(cè)的重點(diǎn)是寫入和讀出數(shù)據(jù)的時(shí)間,以及在此過(guò)程中服務(wù)器的資源使用情況。
四、測(cè)試結(jié)果
1、寫操作
成功寫入500萬(wàn)條記錄,共耗時(shí)5418秒,平均每秒寫入數(shù)據(jù)923筆。磁盤上的數(shù)據(jù)文件大小620M。寫入過(guò)程中,服務(wù)器內(nèi)存、CPU和磁盤等資源使用情況如下圖所示:
可見(jiàn),內(nèi)存使用平穩(wěn)上升,最后占用1G左右,主要用來(lái)緩存數(shù)據(jù),中間有偶爾的內(nèi)存使用高峰,猜測(cè)是JAVA 的垃圾回收后會(huì)釋放內(nèi)存。CPU使用非常平穩(wěn),idle穩(wěn)定在79左右,幾乎沒(méi)有wait發(fā)生。磁盤IO非常低,但是寫入速度較慢??傮w來(lái)說(shuō)占用資源很少,表現(xiàn)也很平穩(wěn)。
2、讀操作
成功讀出500萬(wàn)條記錄,共耗時(shí)8521秒,平均每秒讀出數(shù)據(jù)587筆。
讀數(shù)據(jù)過(guò)程中磁盤IO很低,幾乎沒(méi)有波動(dòng)。CPU消耗較多,Idle值穩(wěn)定在13左右,等待CPU資源的進(jìn)程一直有3到14個(gè)。內(nèi)存表現(xiàn)平穩(wěn)沒(méi)有波動(dòng)。
五、總結(jié)
通過(guò)以上測(cè)試結(jié)果可以看出,HBase讀寫效率并不高,因?yàn)樗轻槍?duì)海量數(shù)據(jù)處理來(lái)設(shè)計(jì)的,側(cè)重的是海量存儲(chǔ)下的性能而非Key-Value存儲(chǔ)的效率,因此這也是正常的,另外由于寫入速度慢,因此磁盤IO占用非常低,這和其他幾款NoSQL有明顯的區(qū)別。隨著淘寶等國(guó)內(nèi)互聯(lián)網(wǎng)巨頭不斷加大使用 HBase的規(guī)模,相信在國(guó)內(nèi)會(huì)有越來(lái)越多的成功案例。
【編輯推薦】
- 主流NoSQL數(shù)據(jù)庫(kù)全方位評(píng)測(cè)之MongoDB
- 主流NoSQL數(shù)據(jù)庫(kù)評(píng)測(cè)之Tokyo Cabinet
- 主流NoSQL數(shù)據(jù)庫(kù)評(píng)測(cè)之HandlerSocket