1欠橘、基本概念
HBase是一個(gè)開(kāi)源的非關(guān)系型分布式數(shù)據(jù)庫(kù)(NoSQL),參考了谷歌的BIgTable建模现恼,實(shí)現(xiàn)的編程語(yǔ)音為Java肃续。是Apache軟件基金會(huì)的Hadoop項(xiàng)目的一部分黍檩,運(yùn)行于HDFS文件系統(tǒng)上,所以可以容錯(cuò)地存儲(chǔ)海量稀疏的數(shù)據(jù)
- HBase的特性:
- 高可靠
- 高并發(fā)讀寫(xiě)
- 面向列
行存儲(chǔ) VS 列存儲(chǔ)
行存儲(chǔ):優(yōu)點(diǎn)是始锚,寫(xiě)入一次性完成刽酱,保持?jǐn)?shù)據(jù)完整性;缺點(diǎn)是瞧捌,數(shù)據(jù)讀取過(guò)程中產(chǎn)生冗余數(shù)據(jù)棵里,若有少量數(shù)據(jù)可以忽略;
列存儲(chǔ):優(yōu)點(diǎn)是姐呐,讀取過(guò)程不會(huì)產(chǎn)生冗余數(shù)據(jù)殿怜,特別適合對(duì)數(shù)據(jù)完整性要求不高的大數(shù)據(jù)領(lǐng)域; 缺點(diǎn)是曙砂,寫(xiě)入效率差头谜,保證數(shù)據(jù)完整性方面差 - 可伸縮
- 易構(gòu)建
- Hbase優(yōu)勢(shì):
- 海量數(shù)據(jù)存儲(chǔ)
- 快速隨機(jī)訪問(wèn)
- 大量寫(xiě)操作的應(yīng)用
- Hbase應(yīng)用場(chǎng)景:
- 互聯(lián)網(wǎng)搜索引擎數(shù)據(jù)存儲(chǔ)
- 海量數(shù)據(jù)寫(xiě)入
- 消息中心
- 內(nèi)容服務(wù)系統(tǒng)(schema-free)
- 大表負(fù)責(zé)&多維護(hù)索引
- 大批量數(shù)據(jù)讀取
2、Data Modeling
RowKey:是Byte array鸠澈,是表中每條記錄的“主鍵”柱告,方便快速查找,Rowkey的設(shè)計(jì)非常重要款侵;
Column Family:列簇末荐,擁有一個(gè)名稱(chēng)(String),包含一個(gè)或者多個(gè)相關(guān)列
Column : 屬于某一個(gè)Columnfamily新锈,familyName:columnName甲脏,每條記錄可動(dòng)態(tài)添加
Version Number:類(lèi)型為L(zhǎng)ong,默認(rèn)值是系統(tǒng)時(shí)間戳妹笆,可由用戶(hù)自定義块请,每個(gè)rowkey唯一
Value(Cell):Byte array
三維有序 {rowkey => {family => {qualifier => {version => value}}}}
默認(rèn)都是按字典順序,即字母順序排列(如下拳缠,bar在foo前)墩新;
a:cf1:bar:1368394583:7
a:cf1:foo:1368394261:hello
3、體系架構(gòu)
Client :
1窟坐、整個(gè)HBase集群的訪問(wèn)入口海渊;
2、使用HBase RPC機(jī)制與HMaster和HRegionServer進(jìn)行通信哲鸳;
3臣疑、與HMaster通信進(jìn)行管理類(lèi)操作;
4徙菠、與HRegionServer通信進(jìn)行數(shù)據(jù)讀寫(xiě)類(lèi)操作讯沈;
5、包含訪問(wèn)HBase的接口婿奔,并維護(hù)cache來(lái)加快對(duì)HBase的訪問(wèn)
Zookeeper:
1缺狠、保證任何時(shí)候问慎,集群中只有一個(gè)HMaster;
2挤茄、存儲(chǔ)所有HRegion的尋址入口如叼;
3、HMaster和HRegionServers啟動(dòng)時(shí)會(huì)向ZooKeeper注冊(cè)穷劈;
4薇正、實(shí)時(shí)監(jiān)控HRegion Server的上線和下線信息,并實(shí)時(shí)通知給HMaster囚衔;
5、存儲(chǔ)HBase的schema和table元數(shù)據(jù)雕沿。
6练湿、容錯(cuò):Zookeeper是一個(gè)可靠的服務(wù),一般配置3或者5個(gè)Zookeeper實(shí)例审轮。
HMaster:主要負(fù)責(zé)Table和Region的管理工作
1肥哎、HMaster沒(méi)有單點(diǎn)問(wèn)題,HBase中可以啟動(dòng)多個(gè)HMaster疾渣,通過(guò)Zookeeper的Master Election機(jī)制保證總有一個(gè)Master在運(yùn)行篡诽;
2、管理用戶(hù)對(duì)table的增刪改查操作榴捡;
3杈女、管理HRegionServer的負(fù)載均衡,調(diào)整Region分布吊圾;
4达椰、Region Split后,負(fù)責(zé)新Region的分配项乒;
5啰劲、在HRegionServer停機(jī)后,負(fù)責(zé)失效HRegionServer上Region遷移工作檀何;
6蝇裤、Client訪問(wèn)hbase上數(shù)據(jù)的過(guò)程并不需要HMaster參與(尋址訪問(wèn)Zookeeper和HRegionServer,數(shù)據(jù)讀寫(xiě)訪問(wèn)HRegionServer),HMaster僅僅維護(hù)著table和Region的元數(shù)據(jù)信息频鉴,負(fù)載很低栓辜;
7、容錯(cuò):Zookeeper重新選擇一個(gè)新的的Master
—無(wú)HMaster過(guò)程中砚殿,數(shù)據(jù)讀取依舊照常進(jìn)行啃憎;
—無(wú)HMaster過(guò)程中,region切分似炎,負(fù)載均衡等無(wú)法進(jìn)行
RegionServer:
1辛萍、維護(hù)HRegion悯姊,處理對(duì)這些HRegion的IO請(qǐng)求,向HDFS文件系統(tǒng)中讀寫(xiě)數(shù)據(jù)贩毕;
2悯许、負(fù)責(zé)切分在運(yùn)行過(guò)程中變得過(guò)大的HRegion;
3辉阶、HRegionServer內(nèi)部管理了一系列的HRegion對(duì)象先壕,每個(gè)HRegion對(duì)應(yīng)了table中的一個(gè)region,HRegion中由多個(gè)HStore組成谆甜。每個(gè)HStore對(duì)應(yīng)了Table中的一個(gè)column family(列簇)垃僚,每個(gè)HStore 是一個(gè)集中的存儲(chǔ)單元,因此最好將具備共同IO特性的column放在一個(gè)column family中规辱,這樣最高效谆棺;
4、HStore存儲(chǔ)是HBase存儲(chǔ)的核心罕袋,由兩部分組成改淑,一部分是MemStore,一部分是StoreFile浴讯;MemStore是Sorted Memory Buffer朵夏,用戶(hù)寫(xiě)入的數(shù)據(jù)首先會(huì)放入MemStore中,當(dāng)MemStore滿(mǎn)了以后會(huì)Flush成一個(gè)StoreFile(底層實(shí)現(xiàn)是HFile)
5榆纽、Regionserver容錯(cuò):定時(shí)向Zookeeper匯報(bào)心跳仰猖,如果一段時(shí)間內(nèi)未出現(xiàn)心跳,Master將該RegionServer上的Region重新分配到其他RegionServer上奈籽,失效服務(wù)器上“預(yù)寫(xiě)”日志由主服務(wù)器進(jìn)行分割并派送給新的RegionServer亮元。
注:split分為切分(regionserver負(fù)責(zé))和分配(master負(fù)責(zé))兩個(gè)過(guò)程
4、物理模型
region唠摹,Hbase上的分區(qū)概念爆捞,不同rewkey存儲(chǔ)在不同的region上
當(dāng)region被分為兩個(gè)新的region時(shí),master會(huì)將這兩個(gè)region分配到不同的regionServer上
5勾拉、在HDFS上目錄結(jié)構(gòu)
WALs:預(yù)寫(xiě)日志煮甥,用來(lái)記錄日志;RegionServer在往表中寫(xiě)入數(shù)據(jù)時(shí)藕赞,會(huì)先往WALs下的Hlog寫(xiě)一份成肘,然后再往內(nèi)存寫(xiě)(和mysql的binlog類(lèi)似),避免內(nèi)存丟失數(shù)據(jù)斧蜕,可以從日志文件中恢復(fù)
data:是真正存儲(chǔ)數(shù)據(jù)的
下面第一層是namespace(nstest)
第二層是table(tb1)双霍,第三層是region,第四層是列簇Column Family,第五層是StoreFile
6洒闸、在HDFS上數(shù)據(jù)存儲(chǔ)
HBase中的所有數(shù)據(jù)文件都存儲(chǔ)在HDFS上染坯,主要有兩種文件類(lèi)型
1、Hfile : HBase中<key丘逸,value>存儲(chǔ)格式单鹿,是Hadoop的二進(jìn)制格式文件,StoreFile就是對(duì)HFile做了輕量級(jí)包裝深纲,進(jìn)行數(shù)據(jù)的存儲(chǔ)仲锄;
當(dāng)用戶(hù)寫(xiě)入時(shí)候,先寫(xiě)入memstore湃鹊,當(dāng)memstore滿(mǎn)了以后會(huì)flush成一個(gè)storefile(就是Hdfs上的Hfile)儒喊;
用戶(hù)也可以手動(dòng)flush,將內(nèi)存中的數(shù)據(jù)直接溢寫(xiě)到磁盤(pán)上币呵,手動(dòng)干預(yù)
2澄惊、Hlog File : HBase中WAL(Write Ahead Log預(yù)寫(xiě)日志)的存儲(chǔ)格式,物理上是Hadoop的squence File序列化文件
WAL類(lèi)似Mysql中的binlog富雅,用來(lái)做災(zāi)難恢復(fù)。Hlog記錄數(shù)據(jù)的所有變更肛搬,一旦數(shù)據(jù)修改没佑,就可以從log中進(jìn)行恢復(fù)。每個(gè)HRegionServer維護(hù)一個(gè)HLog温赔;這樣不同region(來(lái)自不同表table)的日志會(huì)混在一起蛤奢,這樣做的目的是不斷追加單個(gè)文件,相對(duì)于同時(shí)寫(xiě)多個(gè)文件而言陶贼,可以減少磁盤(pán)尋址次數(shù)啤贩,因此可以提高對(duì)table的寫(xiě)性能;但是拜秧,因此帶來(lái)的缺點(diǎn)是痹屹,如果一臺(tái)HRegionServer下線,為了恢復(fù)其上的region枉氮,需要將HRegionServer上的log進(jìn)行拆分志衍,然后分發(fā)到其他HRegionServer上進(jìn)行恢復(fù)
HBase中默認(rèn)有張系統(tǒng)表('hbase:namespace',下圖)聊替,存儲(chǔ)hbase中所有namespace的信息楼肪;還有張'hbase:meta'表:記錄元數(shù)據(jù),它的rowkey存儲(chǔ)的是hbase中所有表的region 的位置信息
7惹悄、在Zookeeper上數(shù)據(jù)存儲(chǔ):
除了HDFS存儲(chǔ)信息春叫,HBase還在Zookeeper中存儲(chǔ)信息,其中的znode信息:
– /hbase/root-region-server ,Root region的位置(系統(tǒng)'hbase:meta'元數(shù)據(jù)表的region信息)
– /hbase/table/-ROOT-暂殖,根元數(shù)據(jù)信息
– /hbase/table/.META.价匠,元數(shù)據(jù)信息
– /hbase/master,當(dāng)選的Mater
– /hbase/backup-masters央星,備選的Master
– /hbase/rs 霞怀,Region Server的信息
– /hbase/unassigned,未分配的Region
8莉给、Hbase讀寫(xiě)數(shù)據(jù)流程:
Hbase讀取數(shù)據(jù)流程:
1毙石、首先,Client先訪問(wèn)zookeeper颓遏,獲取系統(tǒng)'hbase:meta'元數(shù)據(jù)表的region信息和HRegionServer信息(確定'hbase:meta'元數(shù)據(jù)表的位置)徐矩,從而獲取到'hbase:meta'元數(shù)據(jù)表
2、其次叁幢,根據(jù)namespace滤灯、tablename沪哺、rowkey拒课,在'hbase:meta'元數(shù)據(jù)表查找對(duì)應(yīng)的的Region信息和HRegionserver信息
3、最后词裤,根據(jù)已經(jīng)獲取到的regionserver 和 region信息黍判,去regionserver節(jié)點(diǎn)上查找數(shù)據(jù)豫尽,先從memstore讀取,如果沒(méi)有顷帖,再到storeFile上讀让谰伞(為了讀取的效率)
從這個(gè)過(guò)程可以看出,真正的讀寫(xiě)并不依賴(lài)于master贬墩,在讀寫(xiě)的過(guò)程中如果master節(jié)點(diǎn)出現(xiàn)宕機(jī)榴嗅,短暫性的是不會(huì)出現(xiàn)太大的問(wèn)題
Hbase寫(xiě)入數(shù)據(jù)流程:
1、當(dāng)客戶(hù)端發(fā)起一個(gè)Put請(qǐng)求時(shí)陶舞,首先它從hbase:meta表中查出該P(yáng)ut數(shù)據(jù)最終需要去的HRegionServer嗽测;然后客戶(hù)端將Put請(qǐng)求發(fā)送給相應(yīng)的HRegionServer,在HRegionServer中它首先會(huì)將該P(yáng)ut操作寫(xiě)入WAL日志肿孵;
2论咏、寫(xiě)完WAL日志文件后,HRegionServer根據(jù)Put中的TableName和RowKey找到對(duì)應(yīng)的HRegion颁井,并根據(jù)Column Family找到對(duì)應(yīng)的HStore厅贪,并將Put寫(xiě)入到該HStore的MemStore中,此時(shí)寫(xiě)成功雅宾,并返回通知客戶(hù)端养涮。
9葵硕、Regionserver的內(nèi)存:Memstore & BlockCache
HBase上Regionserver的內(nèi)存分為兩個(gè)部分贯吓,一部分作為Memstore,主要用來(lái)寫(xiě)悄谐;另外一部分作為BlockCache,主要用來(lái)讀们陆。
寫(xiě)請(qǐng)求會(huì)先寫(xiě)入Memstore,Regionserver會(huì)給每個(gè)region提供一個(gè)Memstore情屹,當(dāng)Memstore滿(mǎn)128M(可配置)后坪仇,會(huì)啟動(dòng)flush刷新到磁盤(pán)。當(dāng)Memstore的總大小超過(guò)限制時(shí)(heapsizehbase.regionserver.global.memstore.upperLimit0.9)——一個(gè)Regionserver有多個(gè)Region垃你,多個(gè)region中memstore的總大小——椅文,會(huì)強(qiáng)行啟動(dòng)flush進(jìn)程,從最大的Memstore開(kāi)始flush惜颇,直到低于限制皆刺;
讀請(qǐng)求先到Memstore中查數(shù)據(jù),查不到就到BlockCache中查凌摄,再查不到就會(huì)到磁盤(pán)上磁盤(pán)上讀羡蛾,并把讀的結(jié)果放入BlockCache。由于BlockCache采用的是LRU策略(Least recently used望伦,最近最少使用),因此BlockCache達(dá)到上限(headsizehfile.block.cache.size0.85)后煎殷,會(huì)啟動(dòng)淘汰機(jī)制屯伞,淘汰掉最老的一批數(shù)據(jù)
在注重讀響應(yīng)時(shí)間的應(yīng)用場(chǎng)景下,可以將BlockCache設(shè)置大些豪直,Memstore設(shè)置小些劣摇,以加大緩存的命中率
10、Hbase的Compaction和Split:
Compaction過(guò)程:
Client寫(xiě)入 -》 存入MemStore弓乙,一直到MemStore滿(mǎn) -》Flush成一個(gè)StoreFile末融,直至增長(zhǎng)到一定閾值 -》觸發(fā)Compaction合并操作 -》 多個(gè)StoreFile合并成一個(gè)StoreFile,同時(shí)進(jìn)行版本合并和刪除 -》 當(dāng)StoreFiles Compaction后暇韧,逐步形成越來(lái)越大的StoreFile -》當(dāng)個(gè)StoreFile大小超過(guò)一定閾值后勾习,觸發(fā)Split操作,把當(dāng)前Region Split成2個(gè)Region懈玻,Region會(huì)下線巧婶,新Split出的2個(gè)子Region會(huì)被HMaster分配到相應(yīng)的HRegionServer上,使得原先1個(gè)Region的壓力得以分流到2個(gè)Region上。
HBase只是增加數(shù)據(jù)艺栈,所有的更新和刪除操作英岭,都是在Compaction階段做的湿右,所以用戶(hù)寫(xiě)操作只需要進(jìn)入到內(nèi)存即可立即返回毅人,從而保證I/O高性能;
Compaction:會(huì)從一個(gè)region的一個(gè)store中選擇一些Hfile文件進(jìn)行合并赵刑;
—》合并原理:先從這些待合并的數(shù)據(jù)文件中讀出KeyValues般此,再按照由小到大排列后寫(xiě)入一個(gè)新的文件中铐懊,之后科乎,這個(gè)新生成的文件就會(huì)取代之前合并的所有文件對(duì)外提供服務(wù)茅茂;
—》合并類(lèi)型:Minor Compaction & Major Compaction
Minor Compaction:是指選取一些小的空闲、相鄰的StoreFile將他們合并成一個(gè)更大的StoreFile走敌,在這個(gè)過(guò)程中不會(huì)處理已經(jīng)Delete或Expired的Cell掉丽。一次Minor Compation的結(jié)果是更少并且更大的StoreFile捶障;這個(gè)過(guò)程實(shí)際上是個(gè)多路歸并的過(guò)程项炼,因?yàn)镠File的每個(gè)文件都是經(jīng)過(guò)歸類(lèi)的,所以合并速度很快驱闷,只受到磁盤(pán)IO性能的影響空另;
Major Compaction:是指將所有的StoreFile合并成一個(gè)StoreFile扼菠,這個(gè)過(guò)程還會(huì)清理三類(lèi)無(wú)意義數(shù)據(jù)循榆,被刪除的數(shù)據(jù)秧饮,TTL過(guò)期數(shù)據(jù)、版本號(hào)超過(guò)設(shè)定版本號(hào)的數(shù)據(jù)柑船;major合并能掃描所有的鍵/值對(duì)鞍时,順序重寫(xiě)全部的數(shù)據(jù)逆巍,重寫(xiě)數(shù)據(jù)的過(guò)程中會(huì)略過(guò)做了刪除標(biāo)記的數(shù)據(jù)莽使,多余斷言刪除此時(shí)生效吮旅,例如庇勃,對(duì)于那些超過(guò)版本號(hào)限制的數(shù)據(jù)以及生存時(shí)間到期的數(shù)據(jù)槽驶,在重寫(xiě)數(shù)據(jù)時(shí)就不再寫(xiě)入磁盤(pán)了掂铐;所以Major Compaction時(shí)間會(huì)持續(xù)比較長(zhǎng),整個(gè)過(guò)程會(huì)消耗大量系統(tǒng)資源爆班,對(duì)上層業(yè)務(wù)有比較大的影響柿菩,因此線上業(yè)務(wù)都會(huì)關(guān)閉自動(dòng)觸發(fā)Major Compactio功能枢舶,改為手動(dòng)在業(yè)務(wù)低峰期觸發(fā);
minor compaction凉泄,輕量級(jí),將符合條件的最早生成的幾個(gè)storefile合并成一個(gè)大的sotrefile文件胀糜,它不會(huì)刪除被標(biāo)記為“刪除”的數(shù)據(jù)和已過(guò)期的數(shù)據(jù)僚纷,并且執(zhí)行過(guò)一次minor合并操作后怖竭,還會(huì)有多個(gè)storefile文件痊臭;
major compaction广匙,重要級(jí)鸦致,把所有的storefile合并成一個(gè)單一的storefile文件分唾,在文件合并期間系統(tǒng)會(huì)刪除標(biāo)記為“刪除”標(biāo)記的數(shù)據(jù)和已過(guò)期失效的數(shù)據(jù)绽乔,同時(shí)會(huì)block(阻塞)所有客戶(hù)端對(duì)該操作所屬region的請(qǐng)求直到合并完畢折砸,最后刪除已合并的storefile文件
—》Compaction本質(zhì):使用短時(shí)間的IO消耗以及帶寬消耗換取后續(xù)查詢(xún)的低延遲;
—》conpact的速度遠(yuǎn)遠(yuǎn)跟不上Hfile生產(chǎn)的速度两芳,這樣就會(huì)使Hfile的數(shù)量越來(lái)越多盗扇,導(dǎo)致讀性能急劇下降疗隶,為了避免這種情況斑鼻,在HFile的數(shù)量過(guò)多的時(shí)候坚弱,會(huì)限制寫(xiě)請(qǐng)求的速度
—》Split和Major Compaction可以手動(dòng)或者自動(dòng)觸發(fā)荒叶;
Split:當(dāng)一個(gè)Region太大時(shí)输虱,將其分裂成兩個(gè)Region