HBase能提供實時計算服務(wù)主要原因是由其架構(gòu)和底層的數(shù)據(jù)結(jié)構(gòu)決定的,即由LSM-Tree(Log-Structured Merge-Tree) + HTable(region分區(qū)) + Cache決定——客戶端可以直接定位到要查數(shù)據(jù)所在的HRegion server服務(wù)器,然后直接在服務(wù)器的一個region上查找要匹配的數(shù)據(jù),并且這些數(shù)據(jù)部分是經(jīng)過cache緩存的。
前面說過HBase會將數(shù)據(jù)保存到內(nèi)存中,在內(nèi)存中的數(shù)據(jù)是有序的,如果內(nèi)存空間滿了,會刷寫到HFile中,而在HFile中保存的內(nèi)容也是有序的。當(dāng)數(shù)據(jù)寫入HFile后,內(nèi)存中的數(shù)據(jù)會被丟棄。
HFile文件為磁盤順序讀取做了優(yōu)化,按頁存儲。下圖展示了在內(nèi)存中多個塊存儲并歸并到磁盤的過程,合并寫入會產(chǎn)生新的結(jié)果塊,最終多個塊被合并為更大塊。

多次刷寫后會產(chǎn)生很多小文件,后臺線程會合并小文件組成大文件,這樣磁盤查找會限制在少數(shù)幾個數(shù)據(jù)存儲文件中。HBase的寫入速度快是因為它其實并不是真的立即寫入文件中,而是先寫入內(nèi)存,隨后異步刷入HFile。所以在客戶端看來,寫入速度很快。另外,寫入時候?qū)㈦S機(jī)寫入轉(zhuǎn)換成順序?qū)?,?shù)據(jù)寫入速度也很穩(wěn)定。
而讀取速度快是因為它使用了LSM樹型結(jié)構(gòu),而不是B或B+樹。磁盤的順序讀取速度很快,但是相比而言,尋找磁道的速度就要慢很多。HBase的存儲結(jié)構(gòu)導(dǎo)致它需要磁盤尋道時間在可預(yù)測范圍內(nèi),并且讀取與所要查詢的rowkey連續(xù)的任意數(shù)量的記錄都不會引發(fā)額外的尋道開銷。比如有5個存儲文件,那么最多需要5次磁盤尋道就可以。而關(guān)系型數(shù)據(jù)庫,即使有索引,也無法確定磁盤尋道次數(shù)。而且,HBase讀取首先會在緩存(BlockCache)中查找,它采用了LRU(最近最少使用算法),如果緩存中沒找到,會從內(nèi)存中的MemStore中查找,只有這兩個地方都找不到時,才會加載HFile中的內(nèi)容,而上文也提到了讀取HFile速度也會很快,因為節(jié)省了尋道開銷。
舉例:
A:如果快速查詢(從磁盤讀數(shù)據(jù)),hbase是根據(jù)rowkey查詢的,只要能快速的定位rowkey,??就能實現(xiàn)快速的查詢,主要是以下因素:
?????1、hbase是可劃分成多個region,你可以簡單的理解為關(guān)系型數(shù)據(jù)庫的多個分區(qū)。
??????2、鍵是排好序了的
??????3、按列存儲的
首先,能快速找到行所在的region(分區(qū)),假設(shè)表有10億條記錄,占空間1TB,???分列成了500個region,??1個region占2個G.?最多讀取2G的記錄,就能找到對應(yīng)記錄;?
其次,是按列存儲的,其實是列族,假設(shè)分為3個列族,每個列族就是666M,?如果要查詢的東西在其中1個列族上,1個列族包含1個或者多個HStoreFile,假設(shè)一個HStoreFile是128M,?該列族包含5個HStoreFile在磁盤上.?剩下的在內(nèi)存中。
再次,是排好序了的,你要的記錄有可能在最前面,也有可能在最后面,假設(shè)在中間,我們只需遍歷2.5個HStoreFile共300M
最后,每個HStoreFile(HFile的封裝),是以鍵值對(key-value)方式存儲,只要遍歷一個個數(shù)據(jù)塊中的key的位置,并判斷符合條件可以了。?一般key是有限的長度,假設(shè)跟value是1:19(忽略HFile上其它塊),最終只需要15M就可獲取的對應(yīng)的記錄,按照磁盤的訪問100M/S,只需0.15秒。?加上塊緩存機(jī)制(LRU原則),會取得更高的效率。
B:實時查詢
實時查詢,可以認(rèn)為是從內(nèi)存中查詢,一般響應(yīng)時間在1秒內(nèi)。HBase的機(jī)制是數(shù)據(jù)先寫入到內(nèi)存中,當(dāng)數(shù)據(jù)量達(dá)到一定的量(如128M),再寫入磁盤中,?在內(nèi)存中,是不進(jìn)行數(shù)據(jù)的更新或合并操作的,只增加數(shù)據(jù),這使得用戶的寫操作只要進(jìn)入內(nèi)存中就可以立即返回,保證了HBase?I/O的高性能。
實時查詢,即反應(yīng)根據(jù)當(dāng)前時間的數(shù)據(jù),可以認(rèn)為這些數(shù)據(jù)始終是在內(nèi)存的,保證了數(shù)據(jù)的實時響應(yīng)。