HBase(Hadoop Database)是一個開源的非關係型分佈式數據庫(NoSQL),它參考了谷歌的BigTable建模,實現的編程語言為 Java。它是Apache軟件基金會的Hadoop項目的一部分,運行於HDFS文件系統之上,它可以容錯地存儲海量稀疏的數據。
HBase在列上實現了BigTable論文提到的壓縮算法、內存操作和布隆過濾器。HBase的表能夠作為MapReduce任務的輸入和輸出,可以通過Java API來訪問數據,也可以通過REST、Avro或者Thrift的API來訪問。
在 CAP理論中,HBase屬於CP類型的系統。
安裝單機環境
去apache官方網站,下載 HBase 。點擊 stable目錄,然後下載hbase-1.2.6-bin.tar.gz。解壓即可
tar xzvf hbase-1.2.6-bin.tar.gz
cd hbase-1.2.6/
先安裝java環境。設置環境變量JAVA_HOME
編輯 conf/hbase-site.xml 配置hbase.rootdir,來選擇HBase將數據寫到哪個目錄。將 DIRECTORY 替換成你期望寫文件的目錄。默認hbase.rootdir 是指向 /tmp/hbase-${user.name}
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:/home/users/xxxxxx/hbase_data/</value>
</property>
</configuration>
啟動HBase
./bin/start-hbase.sh
現在運行的是單機模式的Hbaes,所有的服務都運行在一個JVM上。通過jps命令查看HMaster進程。HBase的日誌放在logs目錄,當你啟動出問題的時候,可以檢查這些日誌。
關閉HBase
./bin/stop-hbase.sh
stopping hbase....................
數據模型
在HBase中,數據存儲在具有行和列的表中。這是與關係數據庫(RDBMS)的術語重疊,但並不相同。相反,HBase表應該被視為多維映射。
表(Table)
HBase表由多行組成。
行(Row)
HBase中的一行由行鍵(row key)和一個或多個列組成。行鍵按字母順序排序,因此,行鍵的設計是非常重要的。目標是相關相近的行存儲在一起。如果你的行鍵是網站域名,你應該可以將它們反向存儲(org.apache.www,org.apache.mail,org.apache.jira)。這樣,所有的apache域名都在表中臨近存儲,而不是由於二級域名而分散。
列(Column)
HBase中的列由列族和列限定符組成,它們由一個:(冒號)字符分隔。
列族(Column Family)
列族經常出於性能考慮,共同定位一組列及其值。每列族都具有一組存儲屬性,例如它的值是否應該緩存在內存中,它的數據如何被壓縮或者它的行鍵如何被編碼等等。表中的每一行都具有相同的列族,儘管某些行可能不會在給定列族中存儲任何內容。
列限定符(Column Qualifier)
列限定符被添加到列族中以提供給定數據片段的索引。 比如列族content,列限定符可能是content:html,另一個可能是content:pdf。 儘管列族在表創建時已經確定,但列限定符是可變的,並且可能不同行的之間有很大不同。
單元(cell)
一個{row, column, version} 元組確定一個HBase中的一個 cell。包含值和時間戳。
時間戳(Timestamp)
時間戳與每個值一起寫入,並且是值的給定版本的標識符。默認情況下,時間戳記表示server端寫入數據的時間,但可以在數據寫入時指定時間戳值。
shell命令
連接到HBase
$ ./bin/hbase shell
hbase(main):001:0>
創建一個名為 t1 的表,這個表只有一個 列族 為 cf
hbase(main):003:0> create 't1','cf'
0 row(s) in 1.2360 seconds
=> Hbase::Table - t1
查看數據表
hbase(main):004:0> list 't1'
TABLE
t1
1 row(s) in 0.0050 seconds
=> ["t1"]
hbase(main):005:0> describe 't1'
Table t1 is ENABLED
t1
COLUMN FAMILIES DESCRIPTION
{NAME => 'cf', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCO
DING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536',
REPLICATION_SCOPE => '0'}
1 row(s) in 0.0940 seconds
插入數據
put 't1', 'row1', 'cf:a', 'value1'
put 't1', 'row2', 'cf:b', 'value2'
put 't1', 'row3', 'cf:c', 'value3'
HBase中的列是由 列族前綴和列的名字組成的,以冒號間隔
掃描全表
hbase(main):011:0> scan 't1'
ROW COLUMN+CELL
row1 column=cf:a, timestamp=1497426156495, value=value1
row2 column=cf:b, timestamp=1497426156519, value=value2
row3 column=cf:c, timestamp=1497426157158, value=value3
3 row(s) in 0.0090 seconds
按範圍查找rowkey
hbase(main):015:0> scan 't1' , {STARTROW=>'row1',STOPROW=>'row2'}
ROW COLUMN+CELL
row1 column=cf:a, timestamp=1497426156495, value=value1
1 row(s) in 0.0100 seconds
查找一行記錄
hbase(main):016:0> get 't1','row1'
COLUMN CELL
cf:a timestamp=1497426156495, value=value1
1 row(s) in 0.0190 seconds
REST接口
HBase附帶的REST服務器,可以作為一個守護進程運行。 使用以下命令之一在前臺或後臺啟動REST服務器。 端口是可選的,默認為8080。
# Foreground
$ bin/hbase rest start -p <port>
# Background, logging to a file in $HBASE_LOGS_DIR
$ bin/hbase-daemon.sh start rest -p <port>
以下命令都可以使用curl或wget命令運行。可以輸入純文本。也可以在HEADER中添加“Accept:text / xml”標頭,接收xml;“application / json”表示json
一般情況下,使用GET請求進行查詢,PUT或POST請求進行創建或更新,刪除使用DELETE。
查看系統版本號
curl -vi -X GET -H "Accept: text/xml" "http://localhost:8081/version/cluster"
也可以直接在瀏覽器中輸入url
查看集群狀態
curl -vi -X GET -H "Accept: text/xml" "http://localhost:8081/status/cluster"
列出非系統數據表
curl -vi -X GET -H "Accept: text/xml" "http://localhost:8081/"
查看某張表的schema
curl -vi -X GET -H "Accept: text/xml" "http://localhost:8081/t1/schema"