?本文主要從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)如下圖所示:
組件簡(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工作原理
組件簡(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 讀寫流程
讀流程
流程如下:
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é)果返回給客戶端。
寫流程
流程如下:
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ī)制
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ī)制:
?由于memstore每次刷寫都會(huì)生成一個(gè)新的HFile衫哥,且同一個(gè)字段的不同版本(timestamp)和不同類型(Put/Delete)有可能分布在不同的HFile中芋齿,因此查詢時(shí)需要遍歷所有的HFile怜校。為了減少HFile的個(gè)數(shù),以及清除掉過期和刪除的數(shù)據(jù)寓辱,會(huì)進(jìn)行StoreFile Compaction。
?Compaction分為兩種蚊荣,分別時(shí)Minor Compaction和Major 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ī)制
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ǔ)表
邏輯表
物理存儲(chǔ)
數(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)景
- 寫密集型應(yīng)用隘截,每天寫入量巨大,而相對(duì)讀數(shù)量較小的應(yīng)用
- 不需要復(fù)雜查詢條件來查詢數(shù)據(jù)的應(yīng)用
- 使用rowkey汹胃,單條記錄或者小范圍的查詢性能不錯(cuò)婶芭,大范圍的查詢由于分布式的原因,可能在性能上有點(diǎn)影響着饥。
- 使用HBase的過濾器的話性能比較差犀农。
- 不需要關(guān)聯(lián)的場(chǎng)景,HBase為NoSQL無法支持join
- 可靠性要求高
- master支持主備熱切宰掉。
- regionServer宕機(jī)呵哨,region會(huì)分配給在線的機(jī)器赁濒。
- 數(shù)據(jù)持久化在HDFS,默認(rèn)3份孟害,HDFS保證數(shù)據(jù)可靠性拒炎。
- 內(nèi)存的數(shù)據(jù)若丟失可以通過Wal預(yù)寫日志恢復(fù)。
- 數(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壓縮