Hbase是什么
HBase是一種構(gòu)建在HDFS之上的分布式、面向列的存儲系統(tǒng)。在需要實時讀寫、隨機訪問超大規(guī)模數(shù)據(jù)集時,可以使用HBase。
盡管已經(jīng)有許多數(shù)據(jù)存儲和訪問的策略和實現(xiàn)方法,但事實上大多數(shù)解決方案,特別是一些關(guān)系類型的,在構(gòu)建時并沒有考慮超大規(guī)模和分布式的特點。許多商家通過復(fù)制和分區(qū)的方法來擴充數(shù)據(jù)庫使其突破單個節(jié)點的界限,但這些功能通常都是事后增加的,安裝和維護都和復(fù)雜。同時,也會影響RDBMS的特定功能,例如聯(lián)接、復(fù)雜的查詢、觸發(fā)器、視圖和外鍵約束這些操作在大型的RDBMS上的代價相當高,甚至根本無法實現(xiàn)。
HBase從另一個角度處理伸縮性問題。它通過線性方式從下到上增加節(jié)點來進行擴展。HBase不是關(guān)系型數(shù)據(jù)庫,也不支持SQL,但是它有自己的特長,這是RDBMS不能處理的,HBase巧妙地將大而稀疏的表放在商用的服務(wù)器集群上。
HBase 是Google Bigtable 的開源實現(xiàn),與Google Bigtable 利用GFS作為其文件存儲系統(tǒng)類似, HBase 利用Hadoop HDFS 作為其文件存儲系統(tǒng);Google 運行MapReduce 來處理Bigtable中的海量數(shù)據(jù), HBase 同樣利用Hadoop MapReduce來處理HBase中的海量數(shù)據(jù);Google Bigtable 利用Chubby作為協(xié)同服務(wù), HBase 利用Zookeeper作為對應(yīng)。
HBase的特點
- 大:一個表可以有上億行,上百萬列。
- 面向列:面向列表(簇)的存儲和權(quán)限控制,列(簇)獨立檢索。
- 稀疏:對于為空(NULL)的列,并不占用存儲空間,因此,表可以設(shè)計的非常稀疏。
- 無模式:每一行都有一個可以排序的主鍵和任意多的列,列可以根據(jù)需要動態(tài)增加,同一張表中不同的行可以有截然不同的列。
- 數(shù)據(jù)多版本:每個單元中的數(shù)據(jù)可以有多個版本,默認情況下,版本號自動分配,版本號就是單元格插入時的時間戳。
- 數(shù)據(jù)類型單一:HBase中的數(shù)據(jù)都是字符串,沒有類型。
HBase的高并發(fā)和實時處理數(shù)據(jù)
Hadoop是一個高容錯、高延時的分布式文件系統(tǒng)和高并發(fā)的批處理系統(tǒng),不適用于提供實時計算;HBase是可以提供實時計算的分布式數(shù)據(jù)庫,數(shù)據(jù)被保存在HDFS分布式文件系統(tǒng)上,由HDFS保證期高容錯性,但是再生產(chǎn)環(huán)境中,HBase是如何基于hadoop提供實時性呢? HBase上的數(shù)據(jù)是以StoreFile(HFile)二進制流的形式存儲在HDFS上block塊兒中;但是HDFS并不知道的hbase存的是什么,它只把存儲文件是為二進制文件,也就是說,hbase的存儲數(shù)據(jù)對于HDFS文件系統(tǒng)是透明的。下面是HBase文件在HDFS上的存儲示意圖。
HBase HRegion servers集群中的所有的region的數(shù)據(jù)在服務(wù)器啟動時都是被打開的,并且在內(nèi)沖初始化一些memstore,相應(yīng)的這就在一定程度上加快系統(tǒng)響 應(yīng);而Hadoop中的block中的數(shù)據(jù)文件默認是關(guān)閉的,只有在需要的時候才打開,處理完數(shù)據(jù)后就關(guān)閉,這在一定程度上就增加了響應(yīng)時間。
從根本上說,HBase能提供實時計算服務(wù)主要原因是由其架構(gòu)和底層的數(shù)據(jù)結(jié)構(gòu)決定的,即由LSM-Tree + HTable(region分區(qū)) + Cache決定——客戶端可以直接定位到要查數(shù)據(jù)所在的HRegion server服務(wù)器,然后直接在服務(wù)器的一個region上查找要匹配的數(shù)據(jù),并且這些數(shù)據(jù)部分是經(jīng)過cache緩存的。具體查詢流程如下圖所示:
具體數(shù)據(jù)訪問流程如下:
- Client會通過內(nèi)部緩存的相關(guān)的-ROOT-中的信息和.META.中的信息直接連接與請求數(shù)據(jù)匹配的HRegion server;
- 然后直接定位到該服務(wù)器上與客戶請求對應(yīng)的Region,客戶請求首先會查詢該Region在內(nèi)存中的緩存——Memstore(Memstore是一個按key排序的樹形結(jié)構(gòu)的緩沖區(qū));
- 如果在Memstore中查到結(jié)果則直接將結(jié)果返回給Client;
- 在Memstore中沒有查到匹配的數(shù)據(jù),接下來會讀已持久化的StoreFile文件中的數(shù)據(jù)。前面的章節(jié)已經(jīng)講過,StoreFile也是按 key排序的樹形結(jié)構(gòu)的文件——并且是特別為范圍查詢或block查詢優(yōu)化過的,;另外HBase讀取磁盤文件是按其基本I/O單元(即 HBase Block)讀數(shù)據(jù)的。
具體就是過程就是:
如果在BlockCache中能查到要造的數(shù)據(jù)則這屆返回結(jié)果,否則就讀去相應(yīng)的StoreFile文件中讀取一block的數(shù)據(jù),如果還沒有讀到要查的 數(shù)據(jù),就將該數(shù)據(jù)block放到HRegion Server的blockcache中,然后接著讀下一block塊兒的數(shù)據(jù),一直到這樣循環(huán)的block數(shù)據(jù)直到找到要請求的數(shù)據(jù)并返回結(jié)果;如果將該 Region中的數(shù)據(jù)都沒有查到要找的數(shù)據(jù),最后接直接返回null,表示沒有找的匹配的數(shù)據(jù)。當然blockcache會在其大小大于一的閥值(heapsize * hfile.block.cache.size
* 0.85)后啟動基于LRU算法的淘汰機制,將最老最不常用的block刪除。
|