一留储、HBase簡(jiǎn)介
Hbase是什么
HBase是一種構(gòu)建在HDFS之上的分布式翼抠、面向列、多版本欲鹏、非關(guān)系型的數(shù)據(jù)庫(kù)机久。在需要實(shí)時(shí)讀寫、隨機(jī)訪問(wèn)超大規(guī)模數(shù)據(jù)集時(shí)赔嚎,可以使用HBase膘盖。HBase 是Google Bigtable 的開(kāi)源實(shí)現(xiàn)。
HBase的特點(diǎn)
大:一個(gè)表可以有上億行尤误,上百萬(wàn)列侠畔。
面向列:面向列(組)的存儲(chǔ)和權(quán)限控制,列(組)獨(dú)立檢索损晤。
稀疏:對(duì)于為空(NULL)的列软棺,并不占用存儲(chǔ)空間,因此尤勋,表可以設(shè)計(jì)的非常稀疏喘落。
無(wú)模式:每一行都有一個(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ù)都是字符串,沒(méi)有類型沛慢,存儲(chǔ)在hbase上的都是字節(jié)數(shù)組赡若。
二、HBase數(shù)據(jù)模型
HBase 以表的形式存儲(chǔ)數(shù)據(jù)团甲。表由行和列組成逾冬。列劃分為若干個(gè)列族(row family),如下圖所示伐庭。
1) HBase的邏輯數(shù)據(jù)模型
2) HBase的物理數(shù)據(jù)模型
邏輯數(shù)據(jù)模型中空白cell在物理上是不存儲(chǔ)的粉渠,因此若一個(gè)請(qǐng)求為要獲取t8時(shí)間的contents:html分冈,他的結(jié)果就是空圾另。相似的,若請(qǐng)求為獲取t9時(shí)間的anchor:my.look.ca雕沉,結(jié)果也是空集乔。但是,如果不指明時(shí)間坡椒,將會(huì)返回最新時(shí)間的行扰路,每個(gè)最新的都會(huì)返回
- Row Key
與 NoSQL 數(shù)據(jù)庫(kù)一樣,Row Key 是用來(lái)檢索記錄的主鍵倔叼。幾種訪問(wèn) HBase table 中的行方式:
1)通過(guò)單個(gè) Row Key 訪問(wèn)汗唱。
2)通過(guò) Row Key 的 range 全表掃描。
3)Row Key 可以使任意字符串(最大長(zhǎng)度是64KB丈攒,實(shí)際應(yīng)用中長(zhǎng)度一般為 10 ~ 100bytes)哩罪,在HBase 內(nèi)部,Row Key 保存為字節(jié)數(shù)組巡验。
- 列族
HBase 表中的每個(gè)列都?xì)w屬于某個(gè)列族际插。列族是表的 Schema 的一部分(而列不是),必須在使用表之前定義显设。列名都以列族作為前綴框弛,例如 courses:history、courses:math 都屬于 courses 這個(gè)列族捕捂。
訪問(wèn)控制瑟枫、磁盤和內(nèi)存的使用統(tǒng)計(jì)都是在列族層面進(jìn)行的。在實(shí)際應(yīng)用中指攒,列族上的控制權(quán)限能幫助我們管理不同類型的應(yīng)用慷妙, 例如,允許一些應(yīng)用可以添加新的基本數(shù)據(jù)幽七、一些應(yīng)用可以讀取基本數(shù)據(jù)并創(chuàng)建繼承的列族景殷、 一些應(yīng)用則只允許瀏覽數(shù)據(jù)(甚至可能因?yàn)殡[私的原因不能瀏覽所有數(shù)據(jù))。
- Cell
時(shí)間戳HBase 中通過(guò) Row 和 Columns 確定的一個(gè)存儲(chǔ)單元稱為 Cell。每個(gè) Cell 都保存著同一份數(shù)據(jù)的多個(gè)版本猿挚。 版本通過(guò)時(shí)間戳來(lái)索引咐旧,時(shí)間戳的類型是 64 位整型。時(shí)間戳可以由HBase(在數(shù)據(jù)寫入時(shí)自動(dòng))賦值绩蜻, 此時(shí)時(shí)間戳是精確到毫秒的當(dāng)前系統(tǒng)時(shí)間铣墨。時(shí)間戳也 可以由客戶顯示賦值。如果應(yīng)用程序要避免數(shù)據(jù)版本沖突办绝,就必須自己生成具有唯一性的時(shí)間戳伊约。每個(gè) Cell 中,不同版本的數(shù)據(jù)按照時(shí)間倒序排序孕蝉,即最新的數(shù)據(jù)排在最前面屡律。
為了避免數(shù)據(jù)存在過(guò)多版本造成的管理(包括存儲(chǔ)和索引)負(fù)擔(dān),HBase 提供了兩種數(shù)據(jù)版本回收方式降淮。 一是保存數(shù)據(jù)的最后 n 個(gè)版本超埋,二是保存最近一段時(shí)間內(nèi)的版本(比如最近七天)。用戶可以針對(duì)每個(gè)列族進(jìn)行設(shè)置佳鳖。
3) HBase物理存儲(chǔ)
Table 在行的方向上分割為多個(gè)HRegion霍殴,每個(gè)HRegion分散在不同的RegionServer中。
每個(gè)HRegion由多個(gè)Store構(gòu)成系吩,每個(gè)Store由一個(gè)memStore和0或多個(gè)StoreFile組成来庭,每個(gè)Store保存一個(gè)Columns Family
三、HBase系統(tǒng)架構(gòu)
1) HBase架構(gòu)圖
從HBase的架構(gòu)圖上可以看出穿挨,HBase中的組件包括Client月弛、Zookeeper、HMaster絮蒿、HRegionServer尊搬、HRegion、Store土涝、MemStore佛寿、StoreFile、HFile但壮、HLog等冀泻,接下來(lái)介紹他們的作用。
HBase中的每張表都通過(guò)行鍵按照一定的范圍被分割成多個(gè)子表(HRegion)蜡饵,默認(rèn)一個(gè)HRegion超過(guò)256M就要被分割成兩個(gè)弹渔,這個(gè)過(guò)程由HRegionServer管理,而HRegion的分配由HMaster管理溯祸。
- Client
包含訪問(wèn)HBase的接口肢专,并維護(hù)cache來(lái)加快對(duì)HBase的訪問(wèn)舞肆。
- Zookeeper
HBase依賴Zookeeper,默認(rèn)情況下HBase管理Zookeeper實(shí)例(啟動(dòng)或關(guān)閉Zookeeper),Master與RegionServers啟動(dòng)時(shí)會(huì)向Zookeeper注冊(cè)博杖。
保證任何時(shí)候椿胯,集群中只有一個(gè)master
實(shí)時(shí)監(jiān)控Region server的上線和下線信息。并實(shí)時(shí)通知給master
存儲(chǔ)HBase的schema和table元數(shù)據(jù)
- HMaster
為Region server分配region
負(fù)責(zé)Region server的負(fù)載均衡
發(fā)現(xiàn)失效的Region server并重新分配其上的region剃根。
處理schema更新請(qǐng)求哩盲。
- HRegionServer
維護(hù)master分配給他的region,處理對(duì)這些region的io請(qǐng)求狈醉。
負(fù)責(zé)切分正在運(yùn)行過(guò)程中變的過(guò)大的region廉油。
注意:client訪問(wèn)hbase上的數(shù)據(jù)時(shí)不需要master的參與,因?yàn)閿?shù)據(jù)尋址訪問(wèn)zookeeper和region server苗傅,而數(shù)據(jù)讀寫訪問(wèn)region server抒线。master僅僅維護(hù)table和region的元數(shù)據(jù)信息,而table的元數(shù)據(jù)信息保存在zookeeper上金吗,因此master負(fù)載很低十兢。
- HRegion
table在行的方向上分隔為多個(gè)Region趣竣。Region是HBase中分布式存儲(chǔ)和負(fù)載均衡的最小單元摇庙,即不同的region可以分別在不同的Region Server上,但同一個(gè)Region是不會(huì)拆分到多個(gè)server上遥缕。
Region按大小分隔卫袒,每個(gè)表一般是只有一個(gè)region。隨著數(shù)據(jù)不斷插入表单匣,region不斷增大夕凝,當(dāng)region的某個(gè)列族達(dá)到一個(gè)閾值時(shí)就會(huì)分成兩個(gè)新的region。
每個(gè)region由以下信息標(biāo)識(shí):< 表名,startRowkey,創(chuàng)建時(shí)間>
由目錄表(-ROOT-和.META.)記錄該region的endRowkey
- Store
每一個(gè)region由一個(gè)或多個(gè)store組成户秤,至少是一個(gè)store码秉,hbase會(huì)把一起訪問(wèn)的數(shù)據(jù)放在一個(gè)store里面,即為每個(gè) ColumnFamily建一個(gè)store鸡号,如果有幾個(gè)ColumnFamily转砖,也就有幾個(gè)Store。一個(gè)Store由一個(gè)memStore和0或者 多個(gè)StoreFile組成鲸伴。 HBase以store的大小來(lái)判斷是否需要切分region
- MemStore
memStore 是放在內(nèi)存里的府蔗。保存修改的數(shù)據(jù)即keyValues。當(dāng)memStore的大小達(dá)到一個(gè)閥值(默認(rèn)128MB)時(shí)汞窗,memStore會(huì)被flush到文 件姓赤,即生成一個(gè)快照。目前hbase 會(huì)有一個(gè)線程來(lái)負(fù)責(zé)memStore的flush操作仲吏。
- StoreFile
memStore內(nèi)存中的數(shù)據(jù)寫到文件后就是StoreFile不铆,StoreFile底層是以HFile的格式保存蝌焚。
- HFile
HBase中KeyValue數(shù)據(jù)的存儲(chǔ)格式,HFile是Hadoop的 二進(jìn)制格式文件誓斥,實(shí)際上StoreFile就是對(duì)Hfile做了輕量級(jí)包裝综看,即StoreFile底層就是HFile
HFile的存儲(chǔ)格式如下:
HFile由多個(gè)Data Block、Meta Block岖食、FileInfo红碑、Data Index、Meta Index泡垃、Trailer組成析珊,其中Data Block是HBase的最小存儲(chǔ)單元,在前文中提到的BlockCache就是基于Data Block的緩存的蔑穴。一個(gè)Data Block由一個(gè)魔數(shù)和一系列的KeyValue(Cell)組成忠寻,魔數(shù)是一個(gè)隨機(jī)的數(shù)字,用于表示這是一個(gè)Data Block類型存和,以快速監(jiān)測(cè)這個(gè)Data Block的格式奕剃,防止數(shù)據(jù)的破壞。Data Block的大小可以在創(chuàng)建Column Family時(shí)設(shè)置(HColumnDescriptor.setBlockSize())捐腿,默認(rèn)值是64KB纵朋,大號(hào)的Block有利于順序Scan,小號(hào)Block利于隨機(jī)查詢茄袖,因而需要權(quán)衡操软。Meta塊是可選的,F(xiàn)ileInfo是固定長(zhǎng)度的塊宪祥,它紀(jì)錄了文件的一些Meta信息聂薪,例如:AVG_KEY_LEN, AVG_VALUE_LEN, LAST_KEY, COMPARATOR, MAX_SEQ_ID_KEY等。Data Index和Meta Index紀(jì)錄了每個(gè)Data塊和Meta塊的其實(shí)點(diǎn)蝗羊、未壓縮時(shí)大小藏澳、Key(起始RowKey?)等耀找。Trailer紀(jì)錄了FileInfo翔悠、Data Index、Meta Index塊的起始位置涯呻,Data Index和Meta Index索引的數(shù)量等凉驻。其中FileInfo和Trailer是固定長(zhǎng)度的。
HFile里面的每個(gè)KeyValue對(duì)就是一個(gè)簡(jiǎn)單的byte數(shù)組复罐。但是這個(gè)byte數(shù)組里面包含了很多項(xiàng)涝登,并且有固定的結(jié)構(gòu)。我們來(lái)看看里面的具體結(jié)構(gòu):
上圖可知效诅,開(kāi)始是兩個(gè)固定長(zhǎng)度的數(shù)值胀滚,分別表示key的長(zhǎng)度和alue的長(zhǎng)度趟济。緊接著是Key,開(kāi)始是固定長(zhǎng)度的數(shù)值,表示RowKey的長(zhǎng)度咽笼,緊接著是RowKey顷编,然后是固定長(zhǎng)度的數(shù)值,表示Family的長(zhǎng)度剑刑,然后是Family,接著是Qualifier媳纬,然后是兩個(gè)固定長(zhǎng)度的數(shù)值,表示Time Stamp和Key Type(Put/Delete)施掏。Value部分沒(méi)有那么復(fù)雜的結(jié)構(gòu)钮惠,就是純粹的二進(jìn)制數(shù)據(jù)。
- HLog
HLog(WAL log):WAL意為write ahead log七芭,用來(lái)做災(zāi)難恢復(fù)使用素挽,HLog記錄數(shù)據(jù)的所有變更,一旦region server 宕機(jī)狸驳,就可以從log中進(jìn)行恢復(fù)预明。
HLog文件就是一個(gè)普通的Hadoop Sequence File, Sequence File的value是key時(shí)HLogKey對(duì)象耙箍,其中記錄了寫入數(shù)據(jù)的歸屬信息撰糠,除了table和region名字外,還同時(shí)包括sequence number和timestamp究西,timestamp是寫入時(shí)間窗慎,sequence number的起始值為0,或者是最近一次存入文件系統(tǒng)中的sequence number卤材。 Sequence File的value是HBase的KeyValue對(duì)象,即對(duì)應(yīng)HFile中的KeyValue峦失。
上圖中是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襟企。
2) HRegion定位
通過(guò)zk里的文件/hbase/rs得到-ROOT-表的位置。-ROOT-表只有一個(gè)region狮含。
通過(guò)-ROOT-表查找.META.表的第一個(gè)表中相應(yīng)的region的位置顽悼。其實(shí)-ROOT-表是.META.表的第一個(gè)region曼振;.META.表中的每一個(gè)region 在-ROOT-表中都是一行記錄。
通過(guò).META.表找到所要的用戶表region的位置蔚龙。用戶表中的每個(gè)region在.META.表中都是一行記錄冰评。
-ROOT-表永遠(yuǎn)不會(huì)被分隔為多個(gè)region堕战,保證了最多需要三次跳轉(zhuǎn)攀芯,就能定位到任意的region。client會(huì)將查詢的位置 信息保存緩存起來(lái)萎馅,緩存不會(huì)主動(dòng)失效坑填,因此如果client上的緩存全部失效务荆,則需要進(jìn)行6次網(wǎng)絡(luò)來(lái)回,才能定位到正確的region穷遂,其中三次用來(lái)發(fā)現(xiàn) 緩存失效函匕,另外三次用來(lái)獲取位置信息。
提示:
-ROOT-表:表包含.META.表所在的region列表蚪黑,該表只有一個(gè)Region;Zookeeper中記錄了-ROOT-表的location
.META.表:表包含所有的用戶空間region列表盅惜,以及Region Server的服務(wù)器地址
hbase:meta表:高版本中已經(jīng)舍棄了ROOT和META表了,采用了這個(gè)表
四忌穿、HBase工作流程
HBase的流程圖
- Client
首先當(dāng)一個(gè)請(qǐng)求產(chǎn)生時(shí)抒寂,HBase Client使用RPC(遠(yuǎn)程過(guò)程調(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)程過(guò)程調(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,通過(guò)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í),需要訪問(wèn)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。
- 注意:HStore存儲(chǔ)由兩部分組成: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ù)量增長(zhǎng)到一定閥值,就會(huì)觸發(fā)Compact合并操作炕横,并將多個(gè)StoreFile合并成一個(gè)StoreFile源内,合并過(guò)程中會(huì)進(jìn)行版本合并和數(shù)據(jù)刪除,因此可以看出HBase其實(shí)只有增加數(shù)據(jù)份殿,所有的更新和刪除操作都是在后續(xù)的compact過(guò)程中進(jìn)行的膜钓,這使得用戶的 讀寫操作*只要進(jìn)入內(nèi)存中就可以立即返回,保證了HBase I/O的高性能卿嘲。
五颂斜、HBase的高可用
HDFS機(jī)架識(shí)別策略:當(dāng)數(shù)據(jù)文件損壞時(shí),會(huì)找相同機(jī)架上備份的數(shù)據(jù)文件拾枣,如果相同機(jī)架上的數(shù)據(jù)文件也損壞會(huì)找不同機(jī)架備份數(shù)據(jù)文件沃疮。
HBase的Region快速恢復(fù):當(dāng)regionserver損壞時(shí),master會(huì)對(duì)該regionserver上的region進(jìn)行重新分配梅肤,遷移到其他可用的regionserver上并恢復(fù)region司蔬。
Master節(jié)點(diǎn)的HA機(jī)制:Master為一主多備。當(dāng)Master主節(jié)點(diǎn)宕機(jī)后凭语,剩下的備節(jié)點(diǎn)通過(guò)選舉葱她,產(chǎn)生主節(jié)點(diǎn)。
六似扔、HBase運(yùn)維
時(shí)鐘同步
手動(dòng)majorcompact
region hole修復(fù)
region overlap修復(fù)
讀寫集群配置要區(qū)分
memstore flush時(shí)機(jī)