HBase用途:node
基於Hadoop Distributed File System,是一個開源的,基於列存儲模型的分佈式數據庫。
HBase簡介:sql
HBase是一個分佈式的、多版本的、面向列的開源數據庫
1)利用Hadoop HDFS做爲其文件存儲系統,提供高可靠性、高性能、列存儲、可伸縮、實時讀寫的數據庫系統。
2)利用Hadoop MapReduce來處理HBase中的海量數據
3)利用Zookeeper做爲協同服務。
HBase中表的特色:
1)大:一個表能夠有上億行,上百萬列(列多時,插入變慢)
2)面向列:面向列(族)的存儲和權限控制,列(族)獨立檢索。
3)稀疏:對於爲空(null)的列,並不佔用存儲空間,所以,表能夠設計的很是稀疏。
4)每一個cell中的數據能夠有多個版本,默認狀況下版本號自動分配,是單元格插入時的時間戳;
5)HBase中的數據都是字符串,沒有類型;
HBase 特色:
1)強一致性:同一行數據的讀寫只在同一臺Region Server上進行
2)水平伸縮:Region的自動分裂以及Master的balance;
只用增長Datanode機器便可增長容量;
只用增長Region Server機器便可增長讀寫吞吐量
3)支持有限查詢方式和一級索引:
僅支持單行事務
僅支持三種查詢方式(single row key、range row key、scan all rows of table)【可經過hive等實現多表關聯查詢】
僅基於row key的索引
4)高性能隨機寫:WAL (Write Ahead Log)
HBase與RDBMS對比:shell
注:DBMS即關係數據庫管理系統(Relational Database Management System),是將數據組織爲相關的行和列的系統,而管理關係數據庫的計算機軟件就是關係數據庫管理系統,經常使用的數據庫軟件有Oracle、SQL Server等。數據庫
Hbase基本用法:
(1)創建一個表scores,有兩個列族grad和courese
代碼以下:apache
hbase(main):001:0> create ‘scores','grade', ‘course'
可使用list命令來查看當前HBase裏有哪些表。使用describe命令來查看錶結構。
(記得全部的代表、列名都須要加上引號)
(2)按設計的表結構插入值: 數組
代碼以下: put ‘scores','Tom','grade:','5′ put ‘scores','Tom','course:math','97′ put ‘scores','Tom','course:art','87′ put ‘scores','Jim','grade:','4′ put ‘scores','Jim','course:english','89′ put ‘scores','Jim','course:art','80′
這樣表結構就起來了,其實比較自由,列族裏邊能夠自由添加子列很方便。若是列族下沒有子列,加不加冒號都是能夠的。
put命令比較簡單,只有這一種用法: 緩存
hbase> put ‘tablename′, ‘rowname′, ‘colname′, ‘value', timestamp
注:tablename指表名,rowname指行鍵名,colname指列名,value指單元格值。timestamp指時間戳,通常都省略掉了
(3)根據鍵值查詢數據
get ‘scores’,‘Jim’
get ‘scores’,‘Jim’,‘grade’
可能會發現規律了,HBase的shell操做,一個大概順序就是操做關鍵詞後跟表名,行名,列名這樣的一個順序,若是有其餘條件再用花括號加上。
get有用法以下:安全
hbase> get ‘t1′, ‘r1′ hbase> get ‘t1′, ‘r1′, {TIMERANGE => [ts1, ts2]} hbase> get ‘t1′, ‘r1′, {COLUMN => ‘c1′} hbase> get ‘t1′, ‘r1′, {COLUMN => ['c1', 'c2', 'c3']} hbase> get ‘t1′, ‘r1′, {COLUMN => ‘c1′, TIMESTAMP => ts1} hbase> get ‘t1′, ‘r1′, {COLUMN => ‘c1′, TIMERANGE => [ts1, ts2], VERSIONS => 4} hbase> get ‘t1′, ‘r1′, {COLUMN => ‘c1′, TIMESTAMP => ts1, VERSIONS => 4} hbase> get ‘t1′, ‘r1′, ‘c1′ hbase> get ‘t1′, ‘r1′, ‘c1′, ‘c2′ hbase> get ‘t1′, ‘r1′, ['c1', 'c2']
(4)掃描全部數據 scan ‘scores'
也能夠指定一些修飾詞:TIMERANGE, FILTER, LIMIT, STARTROW, STOPROW, TIMESTAMP, MAXLENGTH,or COLUMNS。沒任何修飾詞,就是上邊例句,就會顯示全部數據行。
例句以下: 網絡
hbase> scan ‘.META.'
hbase> scan ‘.META.', {COLUMNS => ‘info:regioninfo'}
hbase> scan ‘t1′, {COLUMNS => ['c1', 'c2'], LIMIT => 10, STARTROW => ‘xyz'}
hbase> scan ‘t1′, {COLUMNS => ‘c1′, TIMERANGE => [1303668804, 1303668904]}
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)}
過濾器filter有兩種方法指出:
a. Using a filterString – more information on this is available in the Filter Language document attached to the HBASE-4176 JIRA
b. Using the entire package name of the filter.
還有一個CACHE_BLOCKS修飾詞,開關scan的緩存的,默認是開啓的(CACHE_BLOCKS=>true),能夠選擇關閉(CACHE_BLOCKS=>false)。
(5)刪除指定數據
代碼以下:
delete ‘scores','Jim','grade' delete ‘scores','Jim'
刪除數據命令也沒太多變化,只有一個:負載均衡
hbase> delete ‘t1′, ‘r1′, ‘c1′, ts1
另外有一個deleteall命令,能夠進行整行的範圍的刪除操做,慎用!
若是須要進行全表刪除操做,就使用truncate命令,其實沒有直接的全表刪除命令,這個命令也是disable,drop,create三個命令組合出來的。
(6)統計行數:
代碼以下:
hbase> count ‘t1′ hbase> count ‘t1′, INTERVAL => 100000 hbase> count ‘t1′, CACHE => 1000 hbase> count ‘t1′, INTERVAL => 10, CACHE => 1000
count通常會比較耗時,使用mapreduce進行統計,統計結果會緩存,默認是10行。統計間隔默認的是1000行(INTERVAL)。
(7)修改表結構
代碼以下:
disable ‘scores'
alter ‘scores',NAME=>'info'
enable ‘scores'
alter命令使用以下(若是沒法成功的版本,須要先通用表disable):
a、改變或添加一個列族:
hbase> alter ‘t1′, NAME => ‘f1′, VERSIONS => 5
b、刪除一個列族:
hbase> alter ‘t1′, NAME => ‘f1′, METHOD => ‘delete' hbase> alter ‘t1′, ‘delete' => ‘f1′
c、也能夠修改表屬性如MAX_FILESIZE MEMSTORE_FLUSHSIZE, READONLY,和 DEFERRED_LOG_FLUSH:
hbase> alter ‘t1′, METHOD => ‘table_att', MAX_FILESIZE => '134217728′
d、能夠一次執行多個alter命令:
hbase> alter ‘t1′, {NAME => ‘f1′}, {NAME => ‘f2′, METHOD => ‘delete'}
HBase的體系結構:
Client
* 包含訪問HBase的接口並維護cache來加快對HBase的訪問
Zookeeper
* 保證任什麼時候候,集羣中只有一個master
* 存貯全部Region的尋址入口。
* 實時監控Region server的上線和下線信息。並實時通知給Master
* 存儲HBase的schema和table元數據
Master
* 爲Region server分配region
* 負責Region server的負載均衡
* 發現失效的Region server並從新分配其上的region
* 管理用戶對table的增刪改查操做
Region Server
* Region server維護region,處理對這些region的IO請求
* Region server負責切分在運行過程當中變得過大的region
HBase數據表的一些關鍵概念:
Row key鍵:
a.表中行的鍵是字節數組(最大長度是 64KB )
b.任何字符串均可以做爲鍵;
c.表中的行根據行的鍵值進行排序,數據按照Row key的字節序(byte order)排序存儲;
d.字典序對int排序的結果是1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。要保持整形的天然序,行鍵必須用0做左填充
e.全部對錶的訪問都要經過鍵
f.經過單個row key訪問
g.經過row key的range
h.全表掃描
Column Family列族:
a.HBase表中的每一個列都歸屬於某個列族,列族必須做爲表模式(schema)定義的一部分預先給出。如 create ‘test’, ‘course’;
b.列名以列族做爲前綴,每一個「列族」均可以有多個列成員(column);如course:math, course:english,
c.新的列族成員能夠隨後按需、動態加入;
d.權限控制、存儲以及調優都是在列族層面進行的;
e.同一列族成員最好有相同的訪問模式和大小特徵;
f.HBase把同一列族裏面的數據存儲在同一目錄下,由幾個文件保存。
Cell qualifier列族修飾符(列):
a.經過列族:單元格修飾符,能夠具體到某個列;
b.能夠把單元格修飾符認爲是實際的列名;
c.在列族存在,客戶端隨時能夠把列添加到列族;
Timestamp時間戳:
a.在HBase每一個cell存儲單元對同一份數據有多個版本,根據惟一的時間戳來區分每一個版本之間的差別,不一樣版本的數據按照時間倒序排序,最新的數據版本排在最前面。
b.時間戳的類型是 64位整型。
c.時間戳能夠由HBase(在數據寫入時自動)賦值,此時時間戳是精確到毫秒的當前系統時間。
d.時間戳也能夠由客戶顯式賦值,若是應用程序要避免數據版本衝突,就必須本身生成具備惟一性的時間戳。
Region區域:
a.HBase自動把表水平劃分紅多個區域(region),每一個region會保存一個表裏面某段連續的數據;
b.每一個表一開始只有一個region,隨着數據不斷插入表,region不斷增大,當增大到一個閥值的時候,region就會等分會兩個新的region;
c.當table中的行不斷增多,就會有愈來愈多的region。這樣一張完整的表被保存在多個Region 上。
HBase物理存儲
一、Table中的全部行都按照row key的字典序排列。
二、Table 在行的方向上分割爲多個HRegion。
三、Region按大小分割的,每一個表一開始只有一個region,隨着數據不斷插入表,region不斷增大,當增大到一個閥值的時候,HRegion就會等分會兩個新的HRegion。當table中的行不斷增多,就會有愈來愈多的HRegion。
4 、HRegion是HBase中分佈式存儲和負載均衡的最小單元。最小單元就表示不一樣的HRegion能夠分佈在不一樣的HRegion server上。但一個HRegion是不會拆分到多個server上的。
5 、HRegion雖然是分佈式存儲的最小單元,但並非存儲的最小單元。事實上,HRegion由一個或者多個Store組成,每一個store保存一個columns family。每一個Strore又由一個memStore和0至多個StoreFile組成。
如圖:StoreFile以HFile格式保存在HDFS上。
HFile分爲六個部分:
Data Block 段:保存表中的數據,這部分能夠被壓縮
Meta Block段 (可選的):保存用戶自定義的kv對,能夠被壓縮。
File Info 段:HFile的元信息,不被壓縮,用戶也能夠在這一部分添加本身的元信息。
Data Block Index 段:Data Block的索引。每條索引的key是被索引的 block的第一條記錄的key。
Meta Block Index段 (可選的):Meta Block的索引。
Trailer段:這一段是定長的。保存了每一段的偏移量,讀取一個HFile時,會 首先讀取Trailer,Trailer保存了每一個段的起始位置(段的Magic Number用來 作安全check),而後,DataBlock Index會被讀取到內存中,這樣,當檢索 某個key時,不須要掃描整個HFile,而只需從內存中找到key所在的block,經過一次磁盤io將整個 block讀取到內存中,再找到須要的key
➜ Data Block Index採用LRU機制淘汰。
➜ HFile的Data Block,Meta Block一般採用壓縮方式存儲,壓縮以後能夠大大減小網絡IO和磁盤IO,隨之而來的開銷固然是須要花費cpu進行壓縮和解壓縮。
➜ 目標Hfile的壓縮支持兩種方式:Gzip,Lzo。