HBase能提供實(shí)時(shí)計(jì)算服務(wù)主要原因是由其架構(gòu)和底層的數(shù)據(jù)結(jié)構(gòu)決定的慨仿,即由LSM-Tree(Log-Structured Merge-Tree) + HTable(region分區(qū)) + Cache決定——客戶(hù)端可以直接定位到要查數(shù)據(jù)所在的HRegion server服務(wù)器,然后直接在服務(wù)器的一個(gè)region上查找要匹配的數(shù)據(jù)纳胧,并且這些數(shù)據(jù)部分是經(jīng)過(guò)cache緩存的镰吆。
前面說(shuō)過(guò)HBase會(huì)將數(shù)據(jù)保存到內(nèi)存中,在內(nèi)存中的數(shù)據(jù)是有序的跑慕,如果內(nèi)存空間滿(mǎn)了万皿,會(huì)刷寫(xiě)到HFile中,而在HFile中保存的內(nèi)容也是有序的相赁。當(dāng)數(shù)據(jù)寫(xiě)入HFile后相寇,內(nèi)存中的數(shù)據(jù)會(huì)被丟棄慰于。
HFile文件為磁盤(pán)順序讀取做了優(yōu)化钮科,按頁(yè)存儲(chǔ)。下圖展示了在內(nèi)存中多個(gè)塊存儲(chǔ)并歸并到磁盤(pán)的過(guò)程婆赠,合并寫(xiě)入會(huì)產(chǎn)生新的結(jié)果塊绵脯,最終多個(gè)塊被合并為更大塊佳励。
多次刷寫(xiě)后會(huì)產(chǎn)生很多小文件,后臺(tái)線程會(huì)合并小文件組成大文件蛆挫,這樣磁盤(pán)查找會(huì)限制在少數(shù)幾個(gè)數(shù)據(jù)存儲(chǔ)文件中赃承。HBase的寫(xiě)入速度快是因?yàn)樗鋵?shí)并不是真的立即寫(xiě)入文件中,而是先寫(xiě)入內(nèi)存悴侵,隨后異步刷入HFile瞧剖。所以在客戶(hù)端看來(lái),寫(xiě)入速度很快可免。另外抓于,寫(xiě)入時(shí)候?qū)㈦S機(jī)寫(xiě)入轉(zhuǎn)換成順序?qū)懀瑪?shù)據(jù)寫(xiě)入速度也很穩(wěn)定浇借。
而讀取速度快是因?yàn)樗褂昧薒SM樹(shù)型結(jié)構(gòu)捉撮,而不是B或B+樹(shù)。磁盤(pán)的順序讀取速度很快妇垢,但是相比而言巾遭,尋找磁道的速度就要慢很多。HBase的存儲(chǔ)結(jié)構(gòu)導(dǎo)致它需要磁盤(pán)尋道時(shí)間在可預(yù)測(cè)范圍內(nèi)闯估,并且讀取與所要查詢(xún)的rowkey連續(xù)的任意數(shù)量的記錄都不會(huì)引發(fā)額外的尋道開(kāi)銷(xiāo)灼舍。比如有5個(gè)存儲(chǔ)文件,那么最多需要5次磁盤(pán)尋道就可以涨薪。而關(guān)系型數(shù)據(jù)庫(kù)片仿,即使有索引,也無(wú)法確定磁盤(pán)尋道次數(shù)尤辱。而且砂豌,HBase讀取首先會(huì)在緩存(BlockCache)中查找,它采用了LRU(最近最少使用算法)光督,如果緩存中沒(méi)找到阳距,會(huì)從內(nèi)存中的MemStore中查找,只有這兩個(gè)地方都找不到時(shí)结借,才會(huì)加載HFile中的內(nèi)容筐摘,而上文也提到了讀取HFile速度也會(huì)很快,因?yàn)楣?jié)省了尋道開(kāi)銷(xiāo)船老。
舉例:
A:如果快速查詢(xún)(從磁盤(pán)讀數(shù)據(jù))咖熟,hbase是根據(jù)rowkey查詢(xún)的,只要能快速的定位rowkey,??就能實(shí)現(xiàn)快速的查詢(xún)柳畔,主要是以下因素:
?????1馍管、hbase是可劃分成多個(gè)region,你可以簡(jiǎn)單的理解為關(guān)系型數(shù)據(jù)庫(kù)的多個(gè)分區(qū)薪韩。
??????2确沸、鍵是排好序了的
??????3捌锭、按列存儲(chǔ)的
首先,能快速找到行所在的region(分區(qū))罗捎,假設(shè)表有10億條記錄观谦,占空間1TB,???分列成了500個(gè)region,??1個(gè)region占2個(gè)G.?最多讀取2G的記錄,就能找到對(duì)應(yīng)記錄桨菜;?
其次豁状,是按列存儲(chǔ)的,其實(shí)是列族倒得,假設(shè)分為3個(gè)列族替蔬,每個(gè)列族就是666M,?如果要查詢(xún)的東西在其中1個(gè)列族上屎暇,1個(gè)列族包含1個(gè)或者多個(gè)HStoreFile承桥,假設(shè)一個(gè)HStoreFile是128M,?該列族包含5個(gè)HStoreFile在磁盤(pán)上.?剩下的在內(nèi)存中根悼。
再次凶异,是排好序了的,你要的記錄有可能在最前面挤巡,也有可能在最后面剩彬,假設(shè)在中間,我們只需遍歷2.5個(gè)HStoreFile共300M
最后矿卑,每個(gè)HStoreFile(HFile的封裝)喉恋,是以鍵值對(duì)(key-value)方式存儲(chǔ),只要遍歷一個(gè)個(gè)數(shù)據(jù)塊中的key的位置母廷,并判斷符合條件可以了轻黑。?一般key是有限的長(zhǎng)度,假設(shè)跟value是1:19(忽略HFile上其它塊)琴昆,最終只需要15M就可獲取的對(duì)應(yīng)的記錄氓鄙,按照磁盤(pán)的訪問(wèn)100M/S,只需0.15秒业舍。?加上塊緩存機(jī)制(LRU原則)抖拦,會(huì)取得更高的效率。
B:實(shí)時(shí)查詢(xún)
實(shí)時(shí)查詢(xún)舷暮,可以認(rèn)為是從內(nèi)存中查詢(xún)态罪,一般響應(yīng)時(shí)間在1秒內(nèi)。HBase的機(jī)制是數(shù)據(jù)先寫(xiě)入到內(nèi)存中下面,當(dāng)數(shù)據(jù)量達(dá)到一定的量(如128M)复颈,再寫(xiě)入磁盤(pán)中,?在內(nèi)存中诸狭,是不進(jìn)行數(shù)據(jù)的更新或合并操作的券膀,只增加數(shù)據(jù)君纫,這使得用戶(hù)的寫(xiě)操作只要進(jìn)入內(nèi)存中就可以立即返回驯遇,保證了HBase?I/O的高性能芹彬。
實(shí)時(shí)查詢(xún),即反應(yīng)根據(jù)當(dāng)前時(shí)間的數(shù)據(jù)叉庐,可以認(rèn)為這些數(shù)據(jù)始終是在內(nèi)存的舒帮,保證了數(shù)據(jù)的實(shí)時(shí)響應(yīng)。