本篇要評測的NoSQL產品是HBase,和其餘簡單的Key-Value結構不一樣,HBase主要面向處理海量數據的應用,能夠認爲是 Google BigTable的一個開源版本。因爲Facebook使用HBase來存儲消息內容和大數據量的實時分析而使得這一產品備受關注。php
1、HBase簡介html
HBase是用Java開發的,是一個開源的、分佈式的、面向列的數據庫,其存儲的每一個值都有一個時間戳,能夠根據定義好的規則保存多個版本(默認是3個),這樣就能夠記錄數據的變更狀況。java
HBase和Hadoop無縫集成,能夠利用HDFS實現數據的底層分佈式存儲,保證冗餘和可靠性,經過ZooKeeper來實現一致性和高可用性。python
HBase有兩種部署方式:一種是比較簡單的單實例方式,它已經內置了0.20版本的Hadoop包和一個本地ZooKeeper,它們運行在同一個 JVM之下,能夠用本地文件系統而不用HDFS。另一種比較複雜的分佈式部署,須要在每個節點替換自帶的Hadoop包以避免有版本問題,並且必須有一 個HDFS實例,同時須要獨立的ZooKeeper集羣,這也是處理海量數據時的推薦的部署方式。本文爲測試方便,使用簡單的單實例部署方式。c++
2、安裝和使用web
首先從鏡像下載最新版的HBase,目前最新的版本是0.90.3:shell
[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
"
解壓並配置數據文件的路徑:apache
[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
>
啓動Hbase進程:緩存
[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
能夠經過自帶的shell命令來進行基本的操做:
[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實例:
[root@localhost hbase-0.90.3]# ./bin/stop-hbase.sh
stopping hbase......
若是使用PHP操做Hbase,可使用Facebook開源出來的thrift,官網是:http://thrift.apache.org/ ,它是一個相似ice的中間件,用於不一樣系統語言間信息交換。首先下載最新的版本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客戶端須要的包及剛纔生成的接口文件複製出來供php程序調用:
[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
啓動hbase和thrift進程:
[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服務默認監聽的端口是9090。至此測試環境搭建完畢。
3、測試說明
一、測試環境
HBase部署在一臺PC 服務器上,配置以下:
CPU爲Xeon 2.80GHz *4
內存爲4G
硬盤爲一塊400G SATA盤
操做系統爲64位CentOS 5.3版本
二、測試方法
採用PHP客戶端進行測試,在安裝過程當中咱們已經獲取了PHP客戶端訪問HBase須要的包含文件。
爲了避免對測試服務器產生額外的影響,測試客戶端部署在另一臺獨立的服務器上,運行的PHP的版本是5.3.5,web server是Nginx 0.8.54,經過fastcgi的方式調用PHP服務。使用apache ab工具實現多個請求和併發操做。
測試過程首先是進行寫操做,經過500個請求,每一個請求寫入10000條記錄,併發度爲1來共寫入500萬條數據,每一個行(row)定義爲數字1到 5000000,列(column)標記爲id:對應的行id,列value爲100個字節大小的數據,版本默認爲記錄3個。而後是讀操做,發起5000 個請求,每一個請求隨機根據row id值讀出1000條記錄,併發度爲10共讀出500萬條記錄,評測的重點是寫入和讀出數據的時間,以及在此過程當中服務器的資源使用狀況。
4、測試結果
一、寫操做
成功寫入500萬條記錄,共耗時5418秒,平均每秒寫入數據923筆。磁盤上的數據文件大小620M。寫入過程當中,服務器內存、CPU和磁盤等資源使用狀況以下圖所示:
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
可見,內存使用平穩上升,最後佔用1G左右,主要用來緩存數據,中間有偶爾的內存使用高峯,猜想是JAVA 的垃圾回收後會釋放內存。CPU使用很是平穩,idle穩定在79左右,幾乎沒有wait發生。磁盤IO很是低,可是寫入速度較慢。整體來講佔用資源很 少,表現也很平穩。
二、讀操做
成功讀出500萬條記錄,共耗時8521秒,平均每秒讀出數據587筆。
讀數據過程當中磁盤IO很低,幾乎沒有波動。CPU消耗較多,Idle值穩定在13左右,等待CPU資源的進程一直有3到14個。內存表現平穩沒有波動。
![](http://static.javashuo.com/static/loading.gif)
4、總結
經過以上測試結果能夠看出,HBase讀寫效率並不高,由於它是針對海量數據處理來設計的,側重的是海量存儲下的性能而非Key-Value存儲的效 率,所以這也是正常的,另外因爲寫入速度慢,所以磁盤IO佔用很是低,這和其餘幾款NoSQL有明顯的區別。隨着淘寶等國內互聯網巨頭不斷加大使用 HBase的規模,相信在國內會有愈來愈多的成功案例。