【hbase】hbase理論學習

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),是將數據組織爲相關的行和列的系統,而管理關係數據庫的計算機軟件就是關係數據庫管理系統,經常使用的數據庫軟件有OracleSQL 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。

相關文章
相關標籤/搜索