一、HBase概況介紹
HBase是一個(gè)高可靠性、高性能、面向列、可伸縮的分布式存儲(chǔ)系統(tǒng),利用HBase技術(shù)可在廉價(jià)PC Server上搭建大規(guī)模結(jié)構(gòu)化的存儲(chǔ)集群。HBase的目標(biāo)是存儲(chǔ)并處理大型數(shù)據(jù),具體來說是僅需使用普通的硬件配置,就能夠處理由成千上萬的行和列所組成的大型數(shù)據(jù)。
與MapReduce的離線批處理計(jì)算框架不同,HBase是一個(gè)可以隨機(jī)訪問的存儲(chǔ)和檢索數(shù)據(jù)平臺(tái),彌補(bǔ)了HDFS不能隨機(jī)訪問數(shù)據(jù)的缺陷,適合實(shí)時(shí)性要求不是非常高的業(yè)務(wù)場(chǎng)景。HBase存儲(chǔ)的都是Byte數(shù)組,它不介意數(shù)據(jù)類型,允許動(dòng)態(tài)、靈活的數(shù)據(jù)模型。
HBase的特點(diǎn)
· 大:一個(gè)表可以有上億行,上百萬列。
· 面向列:面向列表(簇)的存儲(chǔ)和權(quán)限控制,列(簇)獨(dú)立檢索。
· 稀疏:對(duì)于為空(NULL)的列,并不占用存儲(chǔ)空間,因此,表可以設(shè)計(jì)的非常稀疏。
· 無模式:每一行都有一個(gè)可以排序的主鍵和任意多的列,列可以根據(jù)需要?jiǎng)討B(tài)增加,同一張表中不同的行可以有截然不同的列。
· 數(shù)據(jù)多版本:每個(gè)單元中的數(shù)據(jù)可以有多個(gè)版本,默認(rèn)情況下,版本號(hào)自動(dòng)分配,版本號(hào)就是單元格插入時(shí)的時(shí)間戳。
· 數(shù)據(jù)類型單一:HBase中的數(shù)據(jù)都是字符串,沒有類型。
HBase 的應(yīng)用場(chǎng)景
HBase 不適合所有場(chǎng)景。
首先,確信有足夠多數(shù)據(jù),如果有上億或上千億行數(shù)據(jù),HBase 是很好的備選。如果只有上千或上百萬行,則用傳統(tǒng)的R DBMS 可能是更好的選擇。因?yàn)樗袛?shù)據(jù)可以在一兩個(gè)節(jié)點(diǎn)保存,集群其他節(jié)點(diǎn)可能閑置。
其次,確信可以不依賴所有 RDBMS 的額外特性(例如,列數(shù)據(jù)類型、 第二索引、事務(wù)、高級(jí)查詢語言等)。
第三,確信你有足夠的硬件。因?yàn)?HDFS 在小于5個(gè)數(shù)據(jù)節(jié)點(diǎn)時(shí),基本上體現(xiàn)不出它的優(yōu)勢(shì)。
雖然,HBase 能在單獨(dú)的筆記本上運(yùn)行良好,但這應(yīng)僅當(dāng)成是開發(fā)階段的配置。
二、HBase體系結(jié)構(gòu)
2.1 設(shè)計(jì)思路
HBase是一個(gè)分布式的數(shù)據(jù)庫,使用Zookeeper管理集群,使用HDFS作為底層存儲(chǔ)。在架構(gòu)層面上由HMaster(Zookeeper選舉產(chǎn)生的Leader)和多個(gè)HRegionServer組成,基本架構(gòu)如下圖所示:
在HBase的概念中,HRegionServer對(duì)應(yīng)集群中的一個(gè)節(jié)點(diǎn),一個(gè)HRegionServer負(fù)責(zé)管理多個(gè)HRegion,而一個(gè)HRegion代表一張表的一部分?jǐn)?shù)據(jù)。在HBase中,一張表可能會(huì)需要很多個(gè)HRegion來存儲(chǔ)數(shù)據(jù),每個(gè)HRegion中的數(shù)據(jù)并不是雜亂無章的。HBase在管理HRegion的時(shí)候會(huì)給每個(gè)HRegion定義一個(gè)Rowkey的范圍,落在特定范圍內(nèi)的數(shù)據(jù)將交給特定的Region,從而將負(fù)載分?jǐn)偟蕉鄠€(gè)節(jié)點(diǎn),這樣就充分利用了分布式的優(yōu)點(diǎn)和特性。另外,HBase會(huì)自動(dòng)調(diào)節(jié)Region所處的位置,如果一個(gè)HRegionServer過熱,即大量的請(qǐng)求落在這個(gè)HRegionServer管理的HRegion上,HBase就會(huì)把HRegion移動(dòng)到相對(duì)空閑的其它節(jié)點(diǎn),依次保證集群環(huán)境被充分利用。
2.2基本架構(gòu)
HBase由HMaster和HRegionServer組成,同樣遵從主從服務(wù)器架構(gòu)。HBase將邏輯上的表劃分成多個(gè)數(shù)據(jù)塊即HRegion,存儲(chǔ)在HRegionServer中。HMaster負(fù)責(zé)管理所有的HRegionServer,它本身并不存儲(chǔ)任何數(shù)據(jù),而只是存儲(chǔ)數(shù)據(jù)到HRegionServer的映射關(guān)系(元數(shù)據(jù))。集群中的所有節(jié)點(diǎn)通過Zookeeper進(jìn)行協(xié)調(diào),并處理HBase運(yùn)行期間可能遇到的各種問題。?
三、 HBase數(shù)據(jù)模型
HBase是一個(gè)類似于BigTable的分布式數(shù)據(jù)庫,它是一個(gè)稀疏的長期存儲(chǔ)的(存在HDFS上)、多維度的、排序的映射表。這張表的索引是行關(guān)鍵字、列關(guān)鍵字和時(shí)間戳。HBase的數(shù)據(jù)都是字符串,沒有類型。?
? ? ?可以將一個(gè)表想象成一個(gè)大的映射關(guān)系,通過行鍵、行鍵+時(shí)間戳或行鍵+列(列族:列修飾符),就可以定位特定數(shù)據(jù)。由于HBase是稀疏存儲(chǔ)數(shù)據(jù)的,所以某些列可以是空白的。上表給出了com.cnn.www網(wǎng)站的數(shù)據(jù)存放邏輯視圖,表中僅有一行數(shù)據(jù),行的唯一標(biāo)識(shí)為“com.cnn.www”,對(duì)這行數(shù)據(jù)的每一次邏輯修改都有一個(gè)時(shí)間戳關(guān)聯(lián)對(duì)應(yīng)。表中共有四列:contents:html、anchor:cnnsi.com、anchor:my.look.ca、mime:type,每一列以前綴的方式給出其所屬的列族。
行鍵(RowKey)是數(shù)據(jù)行在表中的唯一標(biāo)識(shí),并作為檢索記錄的主鍵。在HBase中訪問表中的行只有三種方式:通過某個(gè)行鍵訪問、給定行鍵的范圍訪問、全表掃描。行鍵可以是任意字符串(最大長度64KB)并按照字典序進(jìn)行存儲(chǔ)。對(duì)于那些經(jīng)常一起讀取的行,需要對(duì)鍵值精心設(shè)計(jì),以便它們能放在一起存儲(chǔ)。
四、 HBase讀寫流程
下圖是HRegionServer數(shù)據(jù)存儲(chǔ)關(guān)系圖。上文提到,HBase使用MemStore和StoreFile存儲(chǔ)對(duì)表的更新。數(shù)據(jù)在更新時(shí)首先寫入HLog和MemStore。MemStore中的數(shù)據(jù)是排序的,當(dāng)MemStore累計(jì)到一定閾值時(shí),就會(huì)創(chuàng)建一個(gè)新的MemStore,并且將老的MemStore添加到Flush隊(duì)列,由單獨(dú)的線程Flush到磁盤上,成為一個(gè)StoreFile。與此同時(shí),系統(tǒng)會(huì)在Zookeeper中記錄一個(gè)CheckPoint,表示這個(gè)時(shí)刻之前的數(shù)據(jù)變更已經(jīng)持久化了。當(dāng)系統(tǒng)出現(xiàn)意外時(shí),可能導(dǎo)致MemStore中的數(shù)據(jù)丟失,此時(shí)使用HLog來恢復(fù)CheckPoint之后的數(shù)據(jù)。
StoreFile是只讀的,一旦創(chuàng)建后就不可以再修改。因此Hbase的更新其實(shí)是不斷追加的操作。當(dāng)一個(gè)Store中的StoreFile達(dá)到一定閾值后,就會(huì)進(jìn)行一次合并操作,將對(duì)同一個(gè)key的修改合并到一起,形成一個(gè)大的StoreFile。當(dāng)StoreFile的大小達(dá)到一定閾值后,又會(huì)對(duì) StoreFile進(jìn)行切分操作,等分為兩個(gè)StoreFile。
寫操作流程
步驟1:Client通過Zookeeper的調(diào)度,向HRegionServer發(fā)出寫數(shù)據(jù)請(qǐng)求,在HRegion中寫數(shù)據(jù)。
步驟2:數(shù)據(jù)被寫入HRegion的MemStore,直到MemStore達(dá)到預(yù)設(shè)閾值。
步驟3:MemStore中的數(shù)據(jù)被Flush成一個(gè)StoreFile。
步驟4:隨著StoreFile文件的不斷增多,當(dāng)其數(shù)量增長到一定閾值后,觸發(fā)Compact合并操作,將多個(gè)StoreFile合并成一個(gè)StoreFile,同時(shí)進(jìn)行版本合并和數(shù)據(jù)刪除。
步驟5:StoreFiles通過不斷的Compact合并操作,逐步形成越來越大的StoreFile。
步驟6:單個(gè)StoreFile大小超過一定閾值后,觸發(fā)Split操作,把當(dāng)前HRegion Split成2個(gè)新的HRegion。父HRegion會(huì)下線,新Split出的2個(gè)子HRegion會(huì)被HMaster分配到相應(yīng)的HRegionServer 上,使得原先1個(gè)HRegion的壓力得以分流到2個(gè)HRegion上。
讀操作流程
步驟1:client訪問Zookeeper,查找-ROOT-表,獲取.META.表信息。
步驟2:從.META.表查找,獲取存放目標(biāo)數(shù)據(jù)的HRegion信息,從而找到對(duì)應(yīng)的HRegionServer。
步驟3:通過HRegionServer獲取需要查找的數(shù)據(jù)。
步驟4:HRegionserver的內(nèi)存分為MemStore和BlockCache兩部分,MemStore主要用于寫數(shù)據(jù),BlockCache主要用于讀數(shù)據(jù)。讀請(qǐng)求先到MemStore中查數(shù)據(jù),查不到就到BlockCache中查,再查不到就會(huì)到StoreFile上讀,并把讀的結(jié)果放入BlockCache。
hbase工作原理
Client
首先當(dāng)一個(gè)請(qǐng)求產(chǎn)生時(shí),HBase Client使用RPC(遠(yuǎn)程過程調(diào)用)機(jī)制與HMaster和HRegionServer進(jìn)行通信,對(duì)于管理類操作,Client與HMaster進(jìn)行RPC;對(duì)于數(shù)據(jù)讀寫操作,Client與HRegionServer進(jìn)行RPC。
Zookeeper
HBase Client使用RPC(遠(yuǎn)程過程調(diào)用)機(jī)制與HMaster和HRegionServer進(jìn)行通信,但如何尋址呢?由于Zookeeper中存儲(chǔ)了-ROOT-表的地址和HMaster的地址,所以需要先到Zookeeper上進(jìn)行尋址。
HRegionServer也會(huì)把自己以Ephemeral方式注冊(cè)到Zookeeper中,使HMaster可以隨時(shí)感知到各個(gè)HRegionServer的健康狀態(tài)。此外,Zookeeper也避免了HMaster的單點(diǎn)故障。
HMaster
當(dāng)用戶需要進(jìn)行Table和Region的管理工作時(shí),就需要和HMaster進(jìn)行通信。HBase中可以啟動(dòng)多個(gè)HMaster,通過Zookeeper的Master Eletion機(jī)制保證總有一個(gè)Master運(yùn)行。
· 管理用戶對(duì)Table的增刪改查操作
· 管理HRegionServer的負(fù)載均衡,調(diào)整Region的分布
· 在Region Split后,負(fù)責(zé)新Region的分配
· 在HRegionServer停機(jī)后,負(fù)責(zé)失效HRegionServer上的Regions遷移
HRegionServer
當(dāng)用戶需要對(duì)數(shù)據(jù)進(jìn)行讀寫操作時(shí),需要訪問HRegionServer。HRegionServer存取一個(gè)子表時(shí),會(huì)創(chuàng)建一個(gè)HRegion對(duì)象,然后對(duì)表的每個(gè)列族創(chuàng)建一個(gè)Store實(shí)例,每個(gè)Store都會(huì)有一個(gè) MemStore和0個(gè)或多個(gè)StoreFile與之對(duì)應(yīng),每個(gè)StoreFile都會(huì)對(duì)應(yīng)一個(gè)HFile, HFile就是實(shí)際的存儲(chǔ)文件。因此,一個(gè)HRegion有多少個(gè)列族就有多少個(gè)Store。 一個(gè)HRegionServer會(huì)有多個(gè)HRegion和一個(gè)HLog。
當(dāng)HStore存儲(chǔ)是HBase的核心了,其中由兩部分組成:MemStore和StoreFiles。 MemStore是Sorted Memory Buffer,用戶
寫入數(shù)據(jù)首先 會(huì)放在MemStore,當(dāng)MemStore滿了以后會(huì)Flush成一個(gè) StoreFile(實(shí)際存儲(chǔ)在HDHS上的是HFile),當(dāng)StoreFile文件數(shù)量增長到一定閥值,就會(huì)觸發(fā)Compact合并操作,并將多個(gè)StoreFile合并成一個(gè)StoreFile,合并過程中會(huì)進(jìn)行版本合并和數(shù)據(jù)刪除,因此可以看出HBase其實(shí)只有增加數(shù)據(jù),所有的更新和刪除操作都是在后續(xù)的compact過程中進(jìn)行的,這使得用戶的 讀寫操作只要進(jìn)入內(nèi)存中就可以立即返回,保證了HBase I/O的高性能。
下面以一個(gè)具體數(shù)據(jù)Put的流程,讓我們加深對(duì)HBase工作流程的認(rèn)識(shí)。
HBase Put流程
下面是put流程的時(shí)序圖:
客戶端:
· 客戶端發(fā)起Put寫請(qǐng)求,講put寫入writeBuffer,如果是批量提交,寫滿緩存后自動(dòng)提交
· 根據(jù)rowkey將put吩咐給不同regionserver
服務(wù)端:
· RegionServer將put按rowkey分給不同的region
· Region首先把數(shù)據(jù)寫入wal
· wal寫入成功后,把數(shù)據(jù)寫入memstore
· Memstore寫完后,檢查memstore大小是否達(dá)到flush閥值
· 如果達(dá)到flush閥值,將memstore寫入HDFS,生成HFile文件
HBase Compact &&Split
當(dāng)StoreFile文件數(shù)量增長到一定閥值,就會(huì)觸發(fā)Compact合并操作,并將多個(gè)StoreFile合并成一個(gè)StoreFile,當(dāng)這個(gè)StoreFile大小超過一定閥值后,會(huì)觸發(fā)Split操作,同時(shí)把當(dāng)前Region Split成2個(gè)Region,這是舊的Region會(huì)下線,新Split出的2個(gè)Region會(huì)被HMaster分配到相應(yīng)的HregionServer上,使得原先1個(gè)Region的壓力得以分散到2個(gè)Region上。
如下圖四個(gè)Storefile文件(從memstore文件經(jīng)過flush而得到,默認(rèn)64M的storefile文件)經(jīng)過Compact合并成一個(gè)大的256M storefile文件,當(dāng)設(shè)定的Region閥值為128M時(shí),就會(huì)Split為兩個(gè)128M的Storefile文件,然后HMaster再把這兩個(gè)storefile文件分配到不停地Regionserver上。
HFile
HBase中所有的數(shù)據(jù)文件都存儲(chǔ)在Hadoop HDFS上,主要包括兩種文件類型:
· Hfile:HBase中KeyValue數(shù)據(jù)的存儲(chǔ)格式,HFile是Hadoop的 二進(jìn)制格式文件,實(shí)際上StoreFile就是對(duì)Hfile做了輕量級(jí)包裝,即StoreFile底層就是HFile
· HLog File:HBase中WAL(write ahead log)的存儲(chǔ)格式,物理上是Hadoop的Sequence File
HFile的存儲(chǔ)格式如下:
?
HFile文件是不定長的,長度固定的只有其中的兩塊:Trailer和FileInfo。
Trailer中有指針指向其他數(shù)據(jù)塊的起始點(diǎn),F(xiàn)ileInfo記錄了文件的一些meta信息。 Data Block是hbase io的基本單元,為了提高效率,HRegionServer中有基于LRU的block cache機(jī)制。
每個(gè)Data塊的大小可以在創(chuàng)建一個(gè)Table的時(shí)候通過參數(shù)指定(默認(rèn)塊大小64KB),大號(hào)的Block有利于順序Scan,小號(hào)的 Block利于隨機(jī)查詢。
每個(gè)Data塊除了開頭的Magic以外就是一個(gè)個(gè)KeyValue對(duì)拼接而成,Magic內(nèi)容就是一些隨機(jī)數(shù)字,目的是防止數(shù) 據(jù)損壞,結(jié)構(gòu)如下。
?
上圖可知,開始是兩個(gè)固定長度的數(shù)值,分別表示key的長度和alue的長度。緊接著是Key,開始是固定長度的數(shù)值,表示RowKey的長度,緊接著是RowKey,然后是固定長度的數(shù)值,表示Family的長度,然后是Family,接著是Qualifier,然后是兩個(gè)固定長度的數(shù)值,表示Time Stamp和Key Type(Put/Delete)。Value部分沒有那么復(fù)雜的結(jié)構(gòu),就是純粹的二進(jìn)制數(shù)據(jù)。
HBase的三維有序(即字典順序)存儲(chǔ)
Hfile是HBase中KeyValue數(shù)據(jù)的存儲(chǔ)格式。從上面的 HBase物理數(shù)據(jù)模型中可以看出,HBase是面向列表(簇)的存儲(chǔ)。每個(gè)Cell由 {row key,column(=《 family》 + 《 label》),version} 唯一確定的單元,他們組合在一起就是一個(gè)KeyValue。根據(jù)上述描述,這個(gè)KeyValue中的key就是{row key,column(=《 family》 + 《 label》),version} ,而value就是cell中的值。
HBase的三維有序存儲(chǔ)中的三維是指:rowkey(行主鍵),column key(columnFamily+《 label》),timestamp(時(shí)間戳或者版本號(hào))三部分組成的三維有序存儲(chǔ)。
· rowkey
rowkey是行的主鍵,它是以字典順序排序的。所以 rowkey的設(shè)計(jì)是至關(guān)重要的,關(guān)系到你應(yīng)用層的查詢效率。我們?cè)诟鶕?jù)rowkey范圍查詢的時(shí)候,我們一般是知道startRowkey,如果我們通過scan只傳startRowKey : d開頭的,那么查詢的是所有比d大的都查了,而我們只需要d開頭的數(shù)據(jù),那就要通過endRowKey來限制。我們可以通過設(shè)定endRowKey為:d 開頭,后面的根據(jù)你的rowkey組合來設(shè)定,一般是加比startKey大一位。
· column key
column key是第二維,數(shù)據(jù)按rowkey字典排序后,如果rowkey相同,則是根據(jù)column key來排序的,也是按字典排序。
我們?cè)谠O(shè)計(jì)table的時(shí)候要學(xué)會(huì)利用這一點(diǎn)。比如我們的收件箱。我們有時(shí)候需要按主題排序,那我們就可以把主題這設(shè)置為我們的column key,即設(shè)計(jì)為columnFamily+主題。,這樣的設(shè)計(jì)。
· timestamp
timestamp 時(shí)間戳,是第三維,這是個(gè)按降序排序的,即最新的數(shù)據(jù)排在最前面。這個(gè)就沒有什么說的了。網(wǎng)上其他的博客也提到比較多。
HLog Replay
根據(jù)以上的敘述,我們已經(jīng)了解了關(guān)于HStore的基本原理,但我們還必須要了解一下HLog的功能,因?yàn)樯鲜龅腍Store在系統(tǒng)正常工作的前提下是沒問題的,但是在分布式 系統(tǒng)環(huán)境中,無法避免系統(tǒng)出錯(cuò)或者宕機(jī),因?yàn)橐坏〩RegionServer意外退出,MemStore中的內(nèi)存數(shù)據(jù)將會(huì)丟失,這就需要引入HLog。每個(gè)HRegionServer中都有一個(gè)HLog對(duì)象,HLog是一個(gè)實(shí)現(xiàn)Write Ahead Log的類,在每一次用戶操作寫入MemStore的同時(shí),也會(huì)寫一份數(shù)據(jù)到HLog文件中,HLog文件定期(當(dāng)文件已持久化到StoreFile中的數(shù)據(jù))會(huì)滾出新的,并且刪除舊的文件。當(dāng)HRegionServer意外終止 后,HMaster會(huì)通過Zookeeper感知到,HMaster首先會(huì)處理遺留的Hlog文件,將其中不同Region的Log數(shù)據(jù)進(jìn)行拆分,分別放到相應(yīng)Region的目錄下,然后再將失效的Region重新分配,領(lǐng)取到這些Region的Regionserver在Load Region的過程中,會(huì)發(fā)現(xiàn)歷史HLog需要處理,因此Replay HLog中的數(shù)據(jù)到MemStore中,然后flush到StoreFiles,完成數(shù)據(jù)恢復(fù)。
HLog存儲(chǔ)格式
WAL(Write Ahead Log):RegionServer在處理插入和刪除過程中,用來記錄操作內(nèi)容的日志,只有日志寫入成功,才會(huì)通知客戶端操作成功。
上圖中是HLog文件的結(jié)構(gòu),其實(shí)HLog文件就是一個(gè)普通的Hadoop Sequence File,Sequence File的Key是HLogKey對(duì)象,HLogKey中記錄了寫入數(shù)據(jù)的歸屬信息,除了table和Region名字外,同時(shí)還包括sequence number和timestamp,timestamp是”寫入時(shí)間”,sequence number 的起始值為0,或者是最近一次存入文件系統(tǒng)中的sequence number。
HLog Sequence File 的Value是HBase的KeyValue對(duì)象昂,即對(duì)應(yīng)HFile中的KeyValue。
HBase性能和優(yōu)化影響HBase性能的因素
?
評(píng)論
查看更多