HBase是基於hadoop的數據庫工具。linux
HBase來源於google的一篇論文BigTable,後來由Apache作了開源實現就是HBase。是一種NoSQL、非關係型的數據庫、不符合關係型數據庫的範式。 web
適合存儲半結構化、非結構化的數據;適合存儲稀疏的數據,稀疏的數據中空的數據不佔用空間。shell
面向列(族)進行存儲,提供實時增刪改查的能力,是一種真正的數據庫。數據庫
能夠存儲海量數據、性能也很強大,能夠實現上億條記錄的毫秒級別的查詢,可是不能提供嚴格的事務控制,只能在行級別保證事務。apache
HBase是一個高可靠性、高性能、面向列、可伸縮的分佈式存儲系統,利用hbase技術能夠在廉價的PC上搭建起大規模結構化存儲集羣。數組
HBase利用Hadoop HDFS做爲其文件存儲系統,利用Hadoop的MapReduce來處理HBase中的海量數據,利用Zookeeper做爲協調工具。bash
HBase經過表來存儲數據,可是表的結構和關係型數據庫很是的不同。服務器
RowKey:即HBase的主鍵,HBase表中全部記錄都必須有行鍵,且不可重複。併發
訪問HBase中的數據有三種方式:分佈式
經過單一行鍵訪問、經過一組行鍵訪問、全表掃描。
由於存儲的數據內容爲半結構化和非結構化的緣由,只能使用這幾種方式查詢。
Row key行鍵能夠是任意字符串,最大長度是64KB,實際應用中長度通常爲10-100bytes,在hbase內部,row key保存爲字節數組。
存儲時,數據按照Row key的字典序(byte order)排序存儲。設計key時,要充分利用排序存儲這個特性,將常常一塊兒讀取的行存儲放到一塊兒。
注意:
字典序對int排序的結果是1,10,100,11,2,20,21,…,9,91,96,97,98,99。要保持整形的天然序,行鍵必須用0做左填充。
行的一次讀寫是原子操做(不論一次讀寫多少列)。這個設計決策可以使用戶很容易的理解程序在對同一個行進行併發更新操做時的行爲。
Column Family:是表的元數據的一部分,須要在建表時聲明,不能後期增長,若是須要增長只能alter表,一個列族能夠包含一個或多個列。
Column:能夠動態增長列,不須要提早聲明,在使用的時候隨時能夠增長,不是表的元數據一部分,歸屬於一個列族。
cell timestamp:經過row和columns肯定的一個存儲單元。每一個存儲單元中都保存着一個數據的多個版本,版本經過時間戳來區別,而由row column和timestamp肯定出來的惟一的存儲數據的單元,稱之爲一個cell單元格。
數據都以二進制形式存儲,沒有數據類型的區別。全部空數據都不佔用空間。
由{row key, column( =<family> + <label>), version}惟一肯定的單元。cell中的數據是沒有類型的,所有是字節碼形式存貯。
HBase版本對Hadoop版本有嚴格的要求,搭配以下:
|
HBase-0.92.x |
HBase-0.94.x |
HBase-0.96 |
Hadoop-0.20.205 |
S |
X |
X |
Hadoop-0.22.x |
S |
X |
X |
Hadoop-1.0.x |
S |
S |
S |
Hadoop-1.1.x |
NT |
S |
S |
Hadoop-0.23.x |
X |
S |
NT |
Hadoop-2.x |
X |
S |
S |
X:表示不兼容,S:表示兼容,NT:表示未知
前提條件:
安裝jdk、Zookeeper和Hadoop,並配置環境變量。
這次演示版本選擇以下:
jdk:1.8
Zookeeper:3.4.7
Hadoop:2.7.1
Hbase:0.98.17
Zookeeper安裝參見:Zookeeper集羣的搭建
Hadoop安裝能夠參見:Hadoop僞分佈式模式搭建、Hadoop徹底分佈式集羣搭建
直接解壓安裝包。
tar -zxvf xxxxx.tar.gz
修改conf/hbase-site.xml。
配置hbase使用的數據文件的位置,默認在/tmp/hbase-[username],此目錄是linux的臨時目錄,可能會被系統清空,因此最好修改一下。
<property> <name>hbase.rootdir</name> <value>file:///<path>/hbase</value> </property>
修改conf/hbase-env.sh,將JAVA_HOME的值改成和環境變量中同樣的。
export JAVA_HOME=xxxx
修改hbase-site.xml,配置要使用的hdfs信息。
<!--設置hdfs的地址--> <property> <name>hbase.rootdir</name> <value>hdfs://hadoop01:9000/hbase</value> </property> <!--設置副本個數--> <property> <name>dfs.replication</name> <value>1</value> </property>
啓動hbase。
①hbase-env.sh
hbase-env.sh配置HBase啓動時須要的相關環境變量。
修改conf/hbase-env.sh,將JAVA_HOME的值改成和環境變量中同樣的。
export JAVA_HOME=xxxx
HBASE_MANAGES_ZK默認是註銷的,默認是開啓的,須要禁用對zookeeper的自動管理,將值改成false。若是不修改,那麼Zookeeper將會隨着HBase啓動和關閉,這樣會致使其餘使用Zookeeper的服務,沒法使用。
export HBASE_MANAGES_ZK=false
②hbase-site.xml
hbase-site.xml配置HBase基本配置信息。HBASE啓動時默認使用hbase-default.xml中的配置,若是須要能夠修改hbase-site.xml文件,此文件中的配置將會覆蓋hbase-default.xml中的配置。修改配置後要重啓hbase纔會起做用。
修改hbase-site.xml,配置開啓徹底分佈式模式。
配置hbase.cluster.distributed爲true。
配置hbase.rootdir設置爲HDFS訪問地址。
<!--配置hdfs鏈接地址這裏使用的是hadoop僞分佈式,因此只配置了一個地址--> <property> <name>hbase.rootdir</name> <value>hdfs://hadoop01:9000/hbase</value> </property> <!--配置副本個數--> <property> <name>dfs.replication</name> <value>1</value> </property> <!--配置啓動HBase集羣模式--> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <!--配置Zookeeper的鏈接地址--> <property> <name>hbase.zookeeper.quorum</name> <value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value> </property>
③regionservers
配置region服務器,修改conf/regionservers文件,其中配置全部hbase主機,每一個主機名獨佔一行,hbase啓動或關閉時會按照該配置順序啓動或關閉主機中的hbase。
啓動順序以下:
啓動zookeeper->啓動hadoop->啓動hbase。
./start-hbase.sh
啓動完成以後,能夠經過http://xxxxx:60010地址來訪問web界面,檢查啓動是否成功。經過web見面管理hbase,也能夠經過hbase shell腳原本訪問bhase。
能夠啓動備用master實現高可用,這裏啓動備用master不須要多餘配置,只須要在對應的服務器中執行以下命令便可:
hbase-daemon.sh start master
HBase使用的master熱備的原理和Hadoop中NameNode的熱備原理相同,都是利用Zookeeper來實現的。
關閉集羣:
stop-hbase.sh
bin/start-hbase.sh bin/hbase shell hbase>status hbase>help hbase>create 'testtable',''colfam1','colfam2' hbase>list hbase>describe 'testtable' hbase>put 'testtable','myrow-1','colfam1:q1','value-1' hbase>put 'testtable','myrow-2','colfam1:q2','value-2' hbase>put 'testtable','myrow-2','colfam1:q3','value-3' hbase>scan 'testtable' hbase>get 'testtable','myrow-1' hbase>delete 'testtable','myrow-2','colfam1:q2' hbase>scan 'testtable' hbase>disable 'testtable' hbase>drop 'testtable'
建表時能夠指定VERSIONS,配置的是當前列族在持久化到文件系統中時,要保留幾個最新的版本數據,這並不影響內存中的歷史數據版本。
hbase>create 'testtable',{NAME=>'colfam1',VERSIONS=>3},{NAME=>'colfam2',VERSIONS=>1} hbase>put 'testtable','myrow-1','colfam1:q1','value-1'
hbase> scan 'hbase:meta' hbase> scan 'hbase:meta', {COLUMNS => 'info:regioninfo'} hbase> scan 'ns1:t1', {COLUMNS => ['c1', 'c2'], LIMIT => 10, STARTROW => 'xyz'} hbase> scan 't1', {COLUMNS => ['c1', 'c2'], LIMIT => 10, STARTROW => 'xyz'} hbase> scan 't1', {COLUMNS => 'c1', TIMERANGE => [1303668804, 1303668904]} hbase> scan 't1', {REVERSED => true} hbase> scan 't1', {FILTER => "(PrefixFilter ('row2') AND (QualifierFilter (>=, 'binary:xyz'))) AND (TimestampsFilter ( 123, 456))"} hbase> scan 't1', {FILTER => org.apache.hadoop.hbase.filter.ColumnPaginationFilter.new(1, 0)} hbase> scan 't1', { COLUMNS => ['c1', 'c2'], ATTRIBUTES => {'mykey' => 'myvalue'}} hbase> scan 't1', { COLUMNS => ['c1', 'c2'], AUTHORIZATIONS => ['PRIVATE','SECRET']} hbase> scan 't1', {COLUMNS => ['c1', 'c2'], CACHE_BLOCKS => false} hbase> scan 't1', {RAW => true, VERSIONS => 10}
直接使用scan而不加RAW=>true只能查詢到最新版本的數據。
hbase>scan 'testtable' hbase>put 'testtable','myrow-1','colfam1:q1','value-2' hbase>scan 'testtable' hbase>put 'testtable','myrow-1','colfam1:q1','value-3' hbase>scan 'testtable'
能夠在查詢時加上RAW=>true來開啓對歷史版本數據的查詢,VERSIONS=>3指定查詢最新的幾個版本的數據。
hbase>scan 'testtable',{RAW=>true,VERSIONS=>3} hbase>put 'testtable','myrow-1','colfam1:q1','value-4' hbase>scan 'testtable' hbase>scan 'testtable',{RAW=>true,VERSIONS=>3} hbase>put 'testtable','myrow-1','colfam2:x1','value-1' hbase>scan 'testtable' hbase>put 'testtable','myrow-1','colfam2:x1','value-2' hbase>scan 'testtable' hbase>scan 'testtable',{RAW=>true,VERSIONS=>3}
重啓hbase
hbase>scan 'testtable',{RAW=>true,VERSIONS=>3} hbase>exit bin/stop-hbase.sh
hbase命令行下不能直接使用刪除刪除字符:
可使用ctrl+刪除鍵來進行刪除。
或
修改xshell配置:
文件->屬性->終端->鍵盤
->delete鍵序列[VT220Del]
->backspace鍵序列[ASCII127]
下一篇:HBase工做原理