HBase存儲(chǔ)及分布式架構(gòu)

?本文主要從HBase存儲(chǔ)系統(tǒng)的分布式架構(gòu)設(shè)計(jì)、HBase存儲(chǔ)機(jī)制、邏輯存儲(chǔ)與物理存儲(chǔ)等方面系統(tǒng)講解了HBase存儲(chǔ)系統(tǒng)。以及根據(jù)HBase系統(tǒng)的特性講述了常用的應(yīng)用場(chǎng)景撤卢、開發(fā)過程中需要注意的事項(xiàng)、優(yōu)化方式(最佳實(shí)踐)等梧兼。
?筆者在實(shí)際開發(fā)過程中放吩,根據(jù)HBase存儲(chǔ)的特性及業(yè)務(wù)實(shí)際應(yīng)用場(chǎng)景,將HBase作為用戶畫像的底層存儲(chǔ)羽杰,在生產(chǎn)中億級(jí)用戶量渡紫,日活超千萬的量級(jí)下,HBase很好的滿足了性能與存儲(chǔ)的業(yè)務(wù)需求考赛。
?希望通過這邊文章與大家分享HBase存儲(chǔ)方面的知識(shí)惕澎,若有不正確或者有出入的地方,歡迎大家指正颜骤,在此感謝集灌!

1.HBase系統(tǒng)架構(gòu)

HBase整體系統(tǒng)架構(gòu)如下圖所示:


HBase存儲(chǔ)及分布式架構(gòu).jpg

組件簡(jiǎn)介

Client

HBase訪問客戶端,包含訪問HBase的接口复哆;Client維護(hù)著一些Cache來加快對(duì)HBase的訪問,比如Region的位置信息腌零。

主要職責(zé):
1.使用HBase RPC機(jī)制與HMaster和HRegionServer進(jìn)行通信梯找。
2.Client與HMaster進(jìn)行通信管理類操作。
3.Client與HRegionServer進(jìn)行數(shù)據(jù)讀寫類操作益涧。

HRegion

1.HBase中分布式存儲(chǔ)的最小單元锈锤;但不是存儲(chǔ)的最小單元。
2.HBase表在行的方向上分隔為多個(gè)Region闲询。不同的Region可以分別在不同的Region Server上久免,但同一個(gè)Region是不會(huì)拆分到多個(gè)Server上。Region按大小分隔扭弧,當(dāng)Region的某個(gè)列族達(dá)到一個(gè)閾值(默認(rèn)256M)時(shí)就會(huì)分成兩個(gè)新的Region阎姥。

HRegion Server

Region Server 負(fù)責(zé)處理數(shù)據(jù)的讀寫請(qǐng)求,客戶端請(qǐng)求數(shù)據(jù)時(shí)直接和 Region Server 交互鸽捻。

主要職責(zé):
1.用來維護(hù)Master分配給他的Region呼巴,處理對(duì)這些Region的IO請(qǐng)求泽腮;
2.負(fù)責(zé)切分正在運(yùn)行過程中變的過大的Region。

HMaster

1.HRegionServer管理者/協(xié)調(diào)者衣赶。
2.數(shù)據(jù)的讀寫操作與他沒有關(guān)系诊赊,它掛了之后,集群照樣運(yùn)行府瞄。但是Master 也不能宕機(jī)太久碧磅,有很多必要的操作,比如創(chuàng)建表遵馆、修改列族配置等DDL跟Region的分割與合并都需要它的操作鲸郊。

主要職責(zé):
1.負(fù)責(zé)啟動(dòng)的時(shí)候分配Region到具體的 RegionServer。
2.發(fā)現(xiàn)失效的 Region团搞,并將失效的 Region 分配到正常的 RegionServer 上严望。
3.管理HRegion服務(wù)器的負(fù)載均衡,調(diào)整HRegion分布逻恐。
4.在HRegion分裂后像吻,負(fù)責(zé)新HRegion的分配。

 HBase 中可以啟動(dòng)多個(gè)Master复隆,通過 Zookeeper 的 Master Election(選主機(jī)制) 機(jī)制保證總有一個(gè) Master 運(yùn)行拨匆。

ZooKeeper

1.HBase 通過 Zookeeper 來做 Master 的高可用。
2.RegionServer 的監(jiān)控挽拂、元數(shù)據(jù)的入口以及集群配置的維護(hù)等工作惭每。

主要職責(zé):  
1.保證任何時(shí)候,集群中只有一個(gè)Master亏栈。
2.存儲(chǔ)所有Region的尋址入口台腥。
3.實(shí)時(shí)監(jiān)控Region Server的上線和下線信息,并實(shí)時(shí)通知給Master绒北。
4.存儲(chǔ)HBase的Schema和Table元數(shù)據(jù)黎侈。

2.HMaster、HRegion Server闷游、ZooKeeper協(xié)作原理

協(xié)作基本原理

1.HMaster 與 HRegion Server 之間通過ZooKeeper的 發(fā)布與訂閱 機(jī)制進(jìn)行感知與管理峻汉。
2.HMaster集群通過ZooKeeper的競(jìng)爭(zhēng)選舉機(jī)制來維護(hù)HMaster集群的高可用性。

HRegion Server 上下線

上線

1.HMaster通過Zookeeper來追蹤HRegion Server的狀態(tài)脐往。
2.HRegion Server 上線時(shí)休吠,首先在Zookeeper的Server目錄中創(chuàng)建自己的文件,并取得文件的獨(dú)占鎖业簿。
3.由于HMaser訂閱了Server目錄瘤礁,當(dāng)目錄下有文件增加或者刪除時(shí),HMaster能收到來自Zookeeper的實(shí)時(shí)通知辖源,因此當(dāng)HRegion Server上線時(shí)HMaster能馬上得到消息蔚携。

下線

1.HRegion Server下線時(shí)希太,它斷掉了Zookeeper的通訊,Zookeeper便會(huì)釋放代表Server的文件的獨(dú)占鎖酝蜒。
2.HMaster輪詢Zookeeper Server目錄下文件的獨(dú)占鎖誊辉。 當(dāng)HMaster發(fā)現(xiàn)某個(gè)Region Server丟失了自己的獨(dú)占鎖(或者HMaster與HRegion server連續(xù)幾次通訊都不成功), HMaster將嘗試獲取該文件的讀寫鎖亡脑,一旦獲取成功堕澄,說明:
  2.1 該HRegion server與Zookeeper通訊已經(jīng)斷開
  2.2 該HResion server掛了

?無論哪種情況,HMaster將刪除Server目錄下代表該Server的文件霉咨,并將該Server的所有Region蛙紫,并將其分配給其他活著的Server。 如果HRegion Server因?yàn)榕R時(shí)網(wǎng)絡(luò)斷開丟失了鎖途戒,并很快恢復(fù)與Zookeeper的通訊坑傅,只要代表其的文件沒有被刪除,它會(huì)繼續(xù)嘗試或許該文件的鎖喷斋,一旦獲取成功唁毒,它就可以接著服務(wù)

HMaster 上下線

上線

HMaster啟動(dòng)時(shí):
1.從 Zookeeper中獲取一個(gè)代表HMaster的鎖,用以阻止其他Master成為Master(競(jìng)爭(zhēng)選主機(jī)制)星爪。
2.掃描Zookeeper中的Server目錄浆西,獲取HRegion Server的List。
3.與2中獲取的Server 通訊顽腾,獲取已分配的Region和Region Server的對(duì)應(yīng)關(guān)系近零。
4.掃描hbase:meta表,記錄尚未分配的Region的信息抄肖,并添加到待分配的Region列表中久信。

下線

1.HMaster下線時(shí),由于它不參與Client的IO操作漓摩,所以這些操作不受影響入篮。
2.HMaster下線僅導(dǎo)致元數(shù)據(jù)的操作(比如無法創(chuàng)建表,無法修改表結(jié)構(gòu)幌甘,無法進(jìn)行負(fù)載均衡,無法進(jìn)行region的合并痊项,但是split可以進(jìn)行锅风,因?yàn)閟plit只有HRegion Server參與)受影響,用戶的IO操作可以繼續(xù)進(jìn)行鞍泉。

PS:所以短時(shí)間內(nèi)的HMaster下線對(duì)HBase集群影響不大皱埠。

小結(jié)

?HMaster 和 HRegion Server通過在Zookeeper中創(chuàng)建的Ephemeral Node(臨時(shí)節(jié)點(diǎn))來完成注冊(cè)、監(jiān)聽咖驮、集群管理等工作边器,具體原理如下:
?1.活躍的HMaster監(jiān)聽Region Server的信息训枢,并在其下線后重新分配Region server來恢復(fù)相應(yīng)的服務(wù)。
?2.不活躍的HMaster監(jiān)聽活躍HMaster的信息忘巧,并在起下線后重新選出活躍的HMaster進(jìn)行服務(wù)恒界。

3.HRegion工作原理

HRegionServer架構(gòu)及原理.png

組件簡(jiǎn)介

WAL

即 Write Ahead Log,是HDFS上的一個(gè)文件砚嘴,用以存儲(chǔ)尚未進(jìn)行持久化的數(shù)據(jù)十酣。順序?qū)懭搿?br> 所有寫操作都會(huì)先保證將數(shù)據(jù)寫入這個(gè)Log文件后,才會(huì)真正去更新MemStore际长,最后寫入HFile文件中耸采。

WAL的優(yōu)點(diǎn):
1.采用這種模式,可以保證HRegionServer宕機(jī)后工育,依然可以從該Log文件中讀取數(shù)據(jù)虾宇,Replay所有的操作,而不至于數(shù)據(jù)丟失如绸。
2.這個(gè)Log文件會(huì)定期Roll出新的文件而刪除舊的文件 - 已經(jīng)持久化到HFile中的Log可以刪除嘱朽。

Block Cache

是一個(gè)讀緩存。在內(nèi)存中存放經(jīng)常讀的數(shù)據(jù)竭沫,提升讀的性能燥翅。
當(dāng)緩存滿的時(shí)候,最近最少使用的數(shù)據(jù)(Least Recently Used data)被踢出蜕提。

MemStore

是一個(gè)寫緩存森书。存儲(chǔ)的是按鍵排好序的待寫入硬盤的數(shù)據(jù)。在Region中每個(gè)Column Family對(duì)應(yīng)一個(gè)HStore谎势,每個(gè)HStore有一個(gè)MemStore和多個(gè)HFile文件凛膏。

HFile

HBase中的健值數(shù)據(jù)對(duì)存儲(chǔ)在HFile中。

?當(dāng)MemStore中積累到指定大小的數(shù)據(jù)后(默認(rèn)128M)脏榆,會(huì)Flush到一個(gè)HFile文件中(每次Flush都會(huì)生成一個(gè)新的HFile)猖毫;當(dāng)HFile增長(zhǎng)到一定閾值后(默認(rèn)8塊),會(huì)觸發(fā)Compact合并操作须喂,使多個(gè)HFile合并成一個(gè)HFile吁断。當(dāng)合并的HFile數(shù)據(jù)大小超過512M時(shí),會(huì)對(duì)HFile進(jìn)行拆分坞生。同時(shí)將當(dāng)前Region拆分成2個(gè)Region仔役,原來的Region會(huì)下線,新拆分出的2個(gè)子Region會(huì)被HMaster分配到相應(yīng)的HRegionServer上是己,使得原先1個(gè)Redion的壓力得以分流到2個(gè)Region上又兵。

工作原理

請(qǐng)?jiān)斀?4.HBase 讀寫流程

4.HBase 讀寫流程

讀流程

HRegionServer讀寫數(shù)據(jù)流程.png
流程如下:
1)Client 先訪問 zookeeper,獲取 hbase:meta 表位于哪個(gè) Region Server。
2)訪問對(duì)應(yīng)的 Region Server沛厨,獲取 hbase:meta 表宙地,根據(jù)讀請(qǐng)求的 namespace:table/rowkey,查詢出目標(biāo)數(shù)據(jù)位于哪個(gè) Region Server中的哪個(gè)Region 中逆皮。并將該table的region信息以及meta表的位置信息緩存在客戶端的meta cache宅粥,方便下次訪問。
3)與目標(biāo) Region Server 進(jìn)行通訊页屠;
4)分別在 Block Cache(讀緩存)粹胯,MemStore 和 Store File(HFile)中查詢目標(biāo)數(shù)據(jù),并將查到的所有數(shù)據(jù)進(jìn)行合并辰企。此處所有數(shù)據(jù)是指同一條數(shù)據(jù)的不同版本(time stamp)或者不同的類型(Put/Delete)风纠。
5)將從文件中查詢到的數(shù)據(jù)塊(Block,HFile 數(shù)據(jù)存儲(chǔ)單元牢贸,默認(rèn)大小為 64KB)緩存到Block Cache竹观。
6)將合并后的最終結(jié)果返回給客戶端。

寫流程

HBase寫流程.png
流程如下:
1)Client 先訪問 zookeeper潜索,獲取 hbase:meta 表位于哪個(gè) Region Server臭增。
2)訪問對(duì)應(yīng)的 Region Server,獲取 hbase:meta 表竹习,根據(jù)讀請(qǐng)求的 namespace:table/rowkey誊抛,查詢出目標(biāo)數(shù)據(jù)位于哪個(gè) Region Server 中的哪個(gè) Region 中。并將該 table 的 region 信息以及 meta 表的位置信息緩存在客戶端的 meta cache整陌,方便下次訪問拗窃。
3)與目標(biāo) Region Server 進(jìn)行通訊;
4)將數(shù)據(jù)順序?qū)懭耄ㄗ芳樱┑?WAL泌辫;
5)將數(shù)據(jù)寫入對(duì)應(yīng)的 MemStore随夸,數(shù)據(jù)會(huì)在 MemStore 進(jìn)行排序;
6)向客戶端發(fā)送 ack震放;
7)等達(dá)到 MemStore 的刷寫時(shí)機(jī)后宾毒,將數(shù)據(jù)刷寫到 HFile。

小結(jié)

第一次讀和寫操作:
?有一個(gè)特殊的 HBase Catalog 表叫 Meta Table(它其實(shí)是一張?zhí)厥獾?HBase 表)殿遂,包含了集群中所有 Regions 的位置信息诈铛。Zookeeper 保存了這個(gè) Meta table 的位置。

當(dāng)HBase第一次讀或者寫操作到來時(shí):
1.客戶端從 Zookeeper 那里獲取是哪一臺(tái) Region Server 負(fù)責(zé)管理 Meta table墨礁。   
2.客戶端會(huì)查詢那臺(tái)管理 Meta table 的 Region Server癌瘾,進(jìn)而獲知是哪一臺(tái) Region Server 負(fù)責(zé)管理本次數(shù)據(jù)請(qǐng)求所需要的rowkey《Γ客戶端會(huì)緩存這個(gè)信息,以及Meta table 的位置信息本身妇萄。   
3.然后客戶端回去訪問那臺(tái) Region Server蜕企,獲取數(shù)據(jù)咬荷。

?對(duì)于以后的的讀請(qǐng)求,客戶端從可以緩存中直接獲取 Meta table 的位置信息(在哪一臺(tái) Region Server 上)轻掩,以及之前訪問過的 rowkey 的位置信息(哪一臺(tái) Region Server 上)幸乒,除非因?yàn)?Region 被遷移了導(dǎo)致緩存失效。這時(shí)客戶端會(huì)重復(fù)上面的步驟唇牧,重新獲取相關(guān)位置信息并更新緩存罕扎。

PS1:
戶端讀寫數(shù)據(jù),實(shí)際上分了兩步:
第一步是定位丐重,從 Meta table 獲取 rowkey 屬于哪個(gè) Region Server 管理腔召;
第二步再去相應(yīng)的 Region Server 讀寫數(shù)據(jù)。這里涉及到了兩個(gè) Region Server扮惦,要理解它們各自的角色功能臀蛛。

PS2:
HBase 保證 hbase:meta 表始終只有一個(gè) Region,這是為了確保 meta 表多次操作的原子性崖蜜。

5.HBase 存儲(chǔ)機(jī)制

Flush 機(jī)制

Flush機(jī)制.png

MemStore刷寫時(shí)機(jī)及過程

1.當(dāng)某個(gè)MemStore的大小達(dá)到了hbase.hregion.memstore.flush.size(默認(rèn)值 128M)浊仆,其所在 region 的所有 memstore (對(duì)應(yīng)的列簇)都會(huì)刷寫。
  當(dāng)達(dá)到128M的時(shí)候會(huì)觸發(fā)flush memstore豫领,當(dāng)達(dá)到128M * n還沒法觸發(fā)flush時(shí)候會(huì)拋異常來拒絕寫入抡柿。
  兩個(gè)相關(guān)參數(shù)的默認(rèn)值如下:
    hbase.hregion.memstore.flush.size=128M(默認(rèn))
    hbase.hregion.memstore.block.multiplier=4(默認(rèn))

2.當(dāng) region server 中 memstore 的總大小達(dá)到
     java_heapsize(應(yīng)用的堆內(nèi)存)
    *hbase.regionserver.global.memstore.size(默認(rèn)值 0.4) 
    *hbase.regionserver.global.memstore.size.lower.limit(默認(rèn)值 0.95),
  region 會(huì)按照其所有 memstore 的大小順序(由大到械瓤帧)依次進(jìn)行刷寫洲劣。直到 region server中所有 memstore 的總大小減小到上述值以下。  當(dāng) region server 中 memstore 的總大小達(dá)到j(luò)ava_heapsize*hbase.regionserver.global.memstore.size(默認(rèn)值 0.4)時(shí)鼠锈,會(huì)阻止繼續(xù)往所有的 memstore 寫數(shù)據(jù)闪檬。

3.到達(dá)自動(dòng)刷寫的時(shí)間,也會(huì)觸發(fā) memstore flush购笆。自動(dòng)刷新的時(shí)間間隔由該屬性進(jìn)行配置 hbase.regionserver.optionalcacheflushinterval(默認(rèn) 1 小時(shí))粗悯。

4.當(dāng) WAL 文件的數(shù)量超過 hbase.regionserver.maxlogs,region 會(huì)按照時(shí)間順序依次進(jìn)行刷寫同欠,直到 WAL 文件數(shù)量減小到 hbase.regionserver.maxlogs 以下(該屬性名已經(jīng)廢棄样傍,現(xiàn)無需手動(dòng)設(shè)置,最大值為 32)铺遂。

StoreFile Compaction 機(jī)制

HBase StoreFile Compaction機(jī)制.png

HBase StoreFile Compaction機(jī)制:
?由于memstore每次刷寫都會(huì)生成一個(gè)新的HFile衫哥,且同一個(gè)字段的不同版本(timestamp)和不同類型(Put/Delete)有可能分布在不同的HFile中芋齿,因此查詢時(shí)需要遍歷所有的HFile怜校。為了減少HFile的個(gè)數(shù),以及清除掉過期和刪除的數(shù)據(jù)寓辱,會(huì)進(jìn)行StoreFile Compaction。

?Compaction分為兩種蚊荣,分別時(shí)Minor CompactionMajor Compaction初狰。

  • Minor Compaction 會(huì)將臨時(shí)的若干較小的HFile合并成一個(gè)較大的HFile,但不會(huì)清理過期和刪除的數(shù)據(jù)互例。
  • Major Compaction 會(huì)將一個(gè)Store下的所有HFile合并為一個(gè)大HFile奢入,并且會(huì)清理掉過期和刪除的數(shù)據(jù)。

Region Split 機(jī)制

HBase Region Split機(jī)制.png

Region Split機(jī)制:
?默認(rèn)情況下媳叨,每個(gè) Table 起初只有一個(gè) Region腥光,隨著數(shù)據(jù)的不斷寫入,Region 會(huì)自動(dòng)進(jìn)行拆分糊秆。剛拆分時(shí)武福,兩個(gè)子 Region 都位于當(dāng)前的 Region Server,但處于負(fù)載均衡的考慮扩然,HMaster 有可能會(huì)將某個(gè) Region 轉(zhuǎn)移給其他的 Region Server艘儒。

Region Split 時(shí)機(jī):
1)當(dāng)1個(gè)region中的某個(gè)Store下所有StoreFile的總大小超過hbase.hregion.max.filesize,該 Region 就會(huì)進(jìn)行拆分(0.94 版本之前)夫偶。
2)當(dāng) 1 個(gè) region 中 的 某 個(gè) Store 下所有 StoreFile 的 總 大 小 超 過 Min(R^2 *"hbase.hregion.memstore.flush.size",hbase.hregion.max.filesize")界睁,該 Region 就會(huì)進(jìn)行拆分,其中 R 為當(dāng)前 Region Server 中屬于該 Table 的個(gè)數(shù)(0.94 版本之后)兵拢。

6.HBase邏輯表 與 物理存儲(chǔ)表

邏輯表

HBase邏輯表.png

物理存儲(chǔ)
HBase物理存儲(chǔ).png

數(shù)據(jù)模型(相關(guān)術(shù)語)


1)Name Space
命名空間翻斟,類似于關(guān)系型數(shù)據(jù)庫(kù)的database概念,每個(gè)命名空間下有多個(gè)表说铃。HBase兩個(gè)自帶的命名空間访惜,分別是hbase和default,hbase中存放的是HBase內(nèi)置的表腻扇,default表是用戶默認(rèn)使用的命名空間债热。
一個(gè)表可以自由選擇是否有命名空間,如果創(chuàng)建表的時(shí)候加上了命名空間后幼苛,這個(gè)表名字以<Namespace>:<Table>作為區(qū)分窒篱!

2)Table
類似于關(guān)系型數(shù)據(jù)庫(kù)的表概念。不同的是舶沿,HBase定義表時(shí)只需要聲明列族即可墙杯,數(shù)據(jù)屬性,比如超時(shí)時(shí)間(TTL)括荡,壓縮算法(COMPRESSION)等高镐,都在列族的定義中定義,不需要聲明具體的列畸冲。
這意味著嫉髓,往HBase寫入數(shù)據(jù)時(shí)观腊,字段可以動(dòng)態(tài)、按需指定算行。因此恕沫,和關(guān)系型數(shù)據(jù)庫(kù)相比,HBase能夠輕松應(yīng)對(duì)字段變更的場(chǎng)景纱意。

3)Row
HBase表中的每行數(shù)據(jù)都由一個(gè)RowKey和多個(gè)Column(列)組成。一個(gè)行包含了多個(gè)列鲸阔,這些列通過列族來分類,行中的數(shù)據(jù)所屬列族只能從該表所定義的列族中選取,不能定義這個(gè)表中不存在的列族偷霉,否則報(bào)錯(cuò)NoSuchColumnFamilyException。

4) RowKey
Rowkey由用戶指定的一串不重復(fù)的字符串定義褐筛,是一行的唯一標(biāo)識(shí)类少!數(shù)據(jù)是按照RowKey的字典順序存儲(chǔ)的,并且查詢數(shù)據(jù)時(shí)只能根據(jù)RowKey進(jìn)行檢索渔扎,所以RowKey的設(shè)計(jì)十分重要硫狞。
如果使用了之前已經(jīng)定義的RowKey,那么會(huì)將之前的數(shù)據(jù)更新掉晃痴!

5)Column Family
列族是多個(gè)列的集合残吩。一個(gè)列族可以動(dòng)態(tài)地靈活定義多個(gè)列。表的相關(guān)屬性大部分都定義在列族上倘核,同一個(gè)表里的不同列族可以有完全不同的屬性配置泣侮,但是同一個(gè)列族內(nèi)的所有列都會(huì)有相同的屬性。
列族存在的意義是HBase會(huì)把相同列族的列盡量放在同一臺(tái)機(jī)器上紧唱,所以說活尊,如果想讓某幾個(gè)列被放到一起,你就給他們定義相同的列族漏益。
官方建議一張表的列族定義的越少越好蛹锰,列族太多會(huì)極大程度地降低數(shù)據(jù)庫(kù)性能,且目前版本Hbase的架構(gòu)绰疤,容易出BUG铜犬。

6) Column Qualifier
Hbase中的列是可以隨意定義的,一個(gè)行中的列不限名字峦睡、不限數(shù)量翎苫,只限定列族。因此列必須依賴于列族存在榨了!列的名稱前必須帶著其所屬的列族煎谍!例如info:name,info:age龙屉。
因?yàn)镠Base中的列全部都是靈活的呐粘,可以隨便定義的满俗,因此創(chuàng)建表的時(shí)候并不需要指定列!列只有在你插入第一條數(shù)據(jù)的時(shí)候才會(huì)生成作岖。其他行有沒有當(dāng)前行相同的列是不確定唆垃,只有在掃描數(shù)據(jù)的時(shí)候才能得知!

7)TimeStamp
用于標(biāo)識(shí)數(shù)據(jù)的不同版本(version)痘儡。時(shí)間戳默認(rèn)由系統(tǒng)指定辕万,也可以由用戶顯式指定。
在讀取單元格的數(shù)據(jù)時(shí)沉删,版本號(hào)可以省略渐尿,如果不指定,Hbase默認(rèn)會(huì)獲取最后一個(gè)版本的數(shù)據(jù)返回矾瑰!

8)Cell
一個(gè)列中可以存儲(chǔ)多個(gè)版本的數(shù)據(jù)砖茸。而每個(gè)版本就稱為一個(gè)單元格(Cell)。
Cell由{rowkey, column Family:column Qualifier, time Stamp}確定殴穴。
Cell中的數(shù)據(jù)是沒有類型的凉夯,全部是字節(jié)碼形式存貯。

9)Region
Region由一個(gè)表的若干行組成采幌!在Region中行的排序按照行鍵(rowkey)字典排序劲够。
Region不能跨RegionSever,且當(dāng)數(shù)據(jù)量大的時(shí)候植榕,HBase會(huì)拆分Region再沧。
Region由RegionServer進(jìn)程管理。HBase在進(jìn)行負(fù)載均衡的時(shí)候尊残,一個(gè)Region有可能會(huì)從當(dāng)前RegionServer移動(dòng)到其他RegionServer上炒瘸。
Region是基于HDFS的,它的所有數(shù)據(jù)存取操作都是調(diào)用了HDFS的客戶端接口來實(shí)現(xiàn)的寝衫。

7.HBase特性 及 常用場(chǎng)景

特性

  • 千萬級(jí)高并發(fā)
  • PB級(jí)存儲(chǔ)(千億數(shù)據(jù)量)
  • 非結(jié)構(gòu)化存儲(chǔ)(列式數(shù)據(jù)庫(kù))
  • 動(dòng)態(tài)列顷扩,稀疏列
  • 支持二級(jí)索引
  • 強(qiáng)一致性,可靠性慰毅,擴(kuò)展性

場(chǎng)景

  1. 寫密集型應(yīng)用隘截,每天寫入量巨大,而相對(duì)讀數(shù)量較小的應(yīng)用
  2. 不需要復(fù)雜查詢條件來查詢數(shù)據(jù)的應(yīng)用
    • 使用rowkey汹胃,單條記錄或者小范圍的查詢性能不錯(cuò)婶芭,大范圍的查詢由于分布式的原因,可能在性能上有點(diǎn)影響着饥。
    • 使用HBase的過濾器的話性能比較差犀农。
  3. 不需要關(guān)聯(lián)的場(chǎng)景,HBase為NoSQL無法支持join
  4. 可靠性要求高
    • master支持主備熱切宰掉。
    • regionServer宕機(jī)呵哨,region會(huì)分配給在線的機(jī)器赁濒。
    • 數(shù)據(jù)持久化在HDFS,默認(rèn)3份孟害,HDFS保證數(shù)據(jù)可靠性拒炎。
    • 內(nèi)存的數(shù)據(jù)若丟失可以通過Wal預(yù)寫日志恢復(fù)。
  5. 數(shù)據(jù)量較大挨务,而且增長(zhǎng)量無法預(yù)估的應(yīng)用
    • HBase支持在線擴(kuò)展击你,即使在一段時(shí)間內(nèi)數(shù)據(jù)量呈井噴式增長(zhǎng),也可以通過HBase橫向擴(kuò)展來滿足功能谎柄。

應(yīng)用

  • 對(duì)象存儲(chǔ)系統(tǒng)
    ?HBase MOB(Medium Object Storage)果漾,中等對(duì)象存儲(chǔ)是hbase-2.0.0版本引入的新特性,用于解決hbase存儲(chǔ)中等文件(0.1m~10m)性能差的問題谷誓。這個(gè)特性適合將圖片、文檔吨凑、PDF捍歪、小視頻存儲(chǔ)到Hbase中。
  • OLAP的存儲(chǔ)
    ?Kylin的底層用的是HBase的存儲(chǔ)鸵钝,看中的是它的高并發(fā)和海量存儲(chǔ)能力糙臼。kylin構(gòu)建cube的過程會(huì)產(chǎn)生大量的預(yù)聚合中間數(shù)據(jù),數(shù)據(jù)膨脹率高恩商,對(duì)數(shù)據(jù)庫(kù)的存儲(chǔ)能力有很高要求变逃。
    ?Phoenix是構(gòu)建在HBase上的一個(gè)SQL引擎,通過phoenix可以直接調(diào)用JDBC接口操作Hbase怠堪,雖然有upsert操作揽乱,但是更多的是用在OLAP場(chǎng)景,缺點(diǎn)是非常不靈活粟矿。
  • 時(shí)序型數(shù)據(jù)
    ?openTsDB應(yīng)用凰棉,記錄以及展示指標(biāo)在各個(gè)時(shí)間點(diǎn)的數(shù)值,一般用于監(jiān)控的場(chǎng)景陌粹,是HBase上層的一個(gè)應(yīng)用撒犀。
  • 用戶畫像系統(tǒng)
    ?動(dòng)態(tài)列,稀疏列的特性掏秩。用于描述用戶特征的維度數(shù)是不定的且可能會(huì)動(dòng)態(tài)增長(zhǎng)的(比如愛好或舞,性別,住址等); 不是每個(gè)特征維度都會(huì)有數(shù)據(jù)蒙幻;
  • 消息/訂單系統(tǒng)
    ?強(qiáng)一致性映凳,良好的讀性能
  • feed流系統(tǒng)存儲(chǔ)

8.HBase與關(guān)系型數(shù)據(jù)庫(kù)的區(qū)別

指標(biāo) 傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù) HBase
數(shù)據(jù)類型 有豐富的數(shù)據(jù)類型 字符串
數(shù)據(jù)操作 豐富操作,復(fù)雜聯(lián)表查詢 簡(jiǎn)單CRUD
存儲(chǔ)模式 基于行存儲(chǔ) 基于列存儲(chǔ)
數(shù)據(jù)索引 復(fù)雜的多個(gè)索引 只有RowKey索引
數(shù)據(jù)維護(hù) 新覆蓋舊 多版本
可伸縮性 難實(shí)現(xiàn)橫向擴(kuò)展 性能動(dòng)態(tài)伸縮

9.HBase最佳實(shí)踐

RowKey 的設(shè)計(jì)原則

1.RowKey 長(zhǎng)度原則

?二進(jìn)制碼流RowKey 最大長(zhǎng)度 64Kb杆煞,實(shí)際應(yīng)用中一般為 10-100bytes魏宽,以 byte[] 形式保存腐泻,一般設(shè)計(jì)定長(zhǎng)。建議越短越好队询,因?yàn)镠File是按照KV存儲(chǔ)的Key太大浪費(fèi)空間派桩。

2.RowKey 散列原則

?RowKey 在設(shè)計(jì)時(shí)候要盡可能的實(shí)現(xiàn)可以將數(shù)據(jù)均衡的分布在每個(gè) RegionServer 上,防止熱點(diǎn)Region的產(chǎn)生蚌斩。
Region熱點(diǎn)問題解決

  • Reverse反轉(zhuǎn)
    針對(duì)固定長(zhǎng)度的Rowkey反轉(zhuǎn)后存儲(chǔ)铆惑,這樣可以使Rowkey中經(jīng)常改變的部分放在最前面,可以有效的隨機(jī)Rowkey送膳。
  • Salt加鹽
    Salt是將每一個(gè)Rowkey加一個(gè)前綴员魏,前綴使用一些隨機(jī)字符,使得數(shù)據(jù)分散在多個(gè)不同的Region叠聋,達(dá)到Region負(fù)載均衡的目標(biāo)撕阎。
  • Hash散列或者M(jìn)od
    用Hash散列來替代隨機(jī)Salt前綴的好處是能讓一個(gè)給定的行有相同的前綴,這在分散了Region負(fù)載的同時(shí)碌补,使讀操作也能夠推斷虏束。

3.排序原則

?HBase的Rowkey是按照ASCII有序設(shè)計(jì)的,我們?cè)谠O(shè)計(jì)Rowkey時(shí)要充分利用這點(diǎn)厦章。

4.RowKey 唯一原則

?RowKey 必須在設(shè)計(jì)上保證其唯一性镇匀,RowKey 是按照字典順序排序存儲(chǔ)的,因此設(shè)計(jì) RowKey 時(shí)可以將將經(jīng)常讀取的數(shù)據(jù)存儲(chǔ)到一塊袜啃。

HBase 優(yōu)化方法

減少調(diào)整

?HBase中有幾個(gè)內(nèi)容會(huì)動(dòng)態(tài)調(diào)整汗侵,如Region(分區(qū))、HFile群发。通過一些方法可以減少這些會(huì)帶來I/O開銷的調(diào)整晰韵。

Region

?沒有預(yù)建分區(qū)的話,隨著Region中條數(shù)的增加熟妓,Region會(huì)進(jìn)行分裂宫屠,這將增加I/O開銷,所以解決方法就是根據(jù)你的RowKey設(shè)計(jì)來進(jìn)行預(yù)建分區(qū)滑蚯,減少Region的動(dòng)態(tài)分裂浪蹂。

HFile

?MemStore執(zhí)行flush會(huì)生成HFile,同時(shí)HFile過多時(shí)候也會(huì)進(jìn)行Merge告材, 為了減少這樣的無謂的I/O開銷坤次,建議估計(jì)項(xiàng)目數(shù)據(jù)量大小,給HFile設(shè)定一個(gè)合適的值斥赋。

減少啟停

?數(shù)據(jù)庫(kù)事務(wù)機(jī)制就是為了更好地實(shí)現(xiàn)批量寫入缰猴,較少數(shù)據(jù)庫(kù)的開啟關(guān)閉帶來的開銷,那么HBase中也存在頻繁開啟關(guān)閉帶來的問題疤剑。

關(guān)閉 Compaction

?HBase 中自動(dòng)化的Minor Compaction和Major Compaction會(huì)帶來極大的I/O開銷滑绒,為了避免這種不受控制的意外發(fā)生闷堡,建議關(guān)閉自動(dòng)Compaction,在閑時(shí)進(jìn)行compaction疑故。

減少數(shù)據(jù)量

?開啟過濾杠览,提高查詢速度
?開啟BloomFilter,BloomFilter是列族級(jí)別的過濾纵势,在生成一個(gè)StoreFile同時(shí)會(huì)生成一個(gè)MetaBlock踱阿,用于查詢時(shí)過濾數(shù)據(jù)。

使用壓縮

?一般推薦使用Snappy和LZO壓縮

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末钦铁,一起剝皮案震驚了整個(gè)濱河市软舌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌牛曹,老刑警劉巖佛点,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異黎比,居然都是意外死亡恋脚,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門焰手,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人怀喉,你說我怎么就攤上這事书妻。” “怎么了躬拢?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵躲履,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我聊闯,道長(zhǎng)工猜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任菱蔬,我火速辦了婚禮篷帅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拴泌。我一直安慰自己魏身,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布蚪腐。 她就那樣靜靜地躺著箭昵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪回季。 梳的紋絲不亂的頭發(fā)上家制,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天正林,我揣著相機(jī)與錄音,去河邊找鬼颤殴。 笑死觅廓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的诅病。 我是一名探鬼主播哪亿,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼贤笆!你這毒婦竟也來了蝇棉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤芥永,失蹤者是張志新(化名)和其女友劉穎篡殷,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體埋涧,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡板辽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了棘催。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片劲弦。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖醇坝,靈堂內(nèi)的尸體忽然破棺而出邑跪,到底是詐尸還是另有隱情,我是刑警寧澤呼猪,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布画畅,位于F島的核電站,受9級(jí)特大地震影響宋距,放射性物質(zhì)發(fā)生泄漏轴踱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一谚赎、第九天 我趴在偏房一處隱蔽的房頂上張望淫僻。 院中可真熱鬧,春花似錦壶唤、人聲如沸嘁傀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽细办。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間笑撞,已是汗流浹背岛啸。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留茴肥,地道東北人坚踩。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像瓤狐,于是被迫代替她去往敵國(guó)和親瞬铸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容