HBase 基礎(chǔ)原理

概念:

數(shù)據(jù)模型:表由行和列組成。表格的“單元格”(cell)由行和列的坐標(biāo)交叉決定延刘,是有版本的匹层。默認(rèn)情況下,版本號(hào)是自動(dòng)分配的

Hbase內(nèi)部保留名為hbase:meta的特殊目錄表(catalog table)蛾号。他們維護(hù)著當(dāng)前集群上所有區(qū)域的列表稠项、狀態(tài)和位置。

NoSQL的基礎(chǔ)

1鲜结、not only sql

2展运、回顧:關(guān)系型數(shù)據(jù)庫(kù):Oracle活逆、MySQL等 ——> 面向行

適合insert,update乐疆,delete

不適合查詢

3划乖、常見(jiàn)的NoSQL數(shù)據(jù)庫(kù)

基于Key——Value模型:Redis(基于內(nèi)存)

前身:MEMCached(不足:不支持持久化)

面向列的模型:Hbase、Cassandra

適合select(查詢)

基于文檔型:MongoDB

文檔:BSON文檔(json的二進(jìn)制)

1.Hbase的表結(jié)構(gòu)

BigTable:大表

思想:通過(guò)犧牲存儲(chǔ)的空間挤土,來(lái)?yè)Q取性能

把所有的數(shù)據(jù)存入一張表琴庵,完全違背了關(guān)系型數(shù)據(jù)庫(kù)范式的要求

HBase 基于HDFS之上的NoSQL數(shù)據(jù)庫(kù)、列式數(shù)據(jù)庫(kù)

表 ——> 目錄

數(shù)據(jù) ——> 文件

2.Hbase 在ZK中保存數(shù)據(jù)

配置信息仰美、Hbase集群結(jié)構(gòu)信息

表的元信息

實(shí)現(xiàn)Hbase的HA(high avaibility)高可用性

3.Hbase配置信息

4.操作Hbase

4.1 Web Console網(wǎng)頁(yè):端口-16010

4.2 命令行

hbase shell

1)創(chuàng)建表

create 'students','info','grade'

創(chuàng)建表'students'相當(dāng)于創(chuàng)建一個(gè)目錄

2)查看表結(jié)構(gòu)

desc 'students'

describe 'students'

hbase:003:0> desc 'students'

Table students is ENABLED ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

students ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

COLUMN FAMILIES DESCRIPTION ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

{NAME => 'grade', BLOOMFILTER => 'ROW', IN_MEMORY => 'false', VERSIONS => '1', KEEP_DELETED_CE

SIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'} ? ? ? ? ?

{NAME => 'info', BLOOMFILTER => 'ROW', IN_MEMORY => 'false', VERSIONS => '1', KEEP_DELETED_CEL

IONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'} ? ? ? ? ? ?

2 row(s)

Quota is disabled

Took 0.0337 seconds

3)插入數(shù)據(jù)

put 'students','stu001','info:name','Tom'

put 'students','stu001','info:age','24'

put 'students','stu001','info:gender','Male'

put 'students','stu001','grade:math','80'

put 'students','stu002','info:name','Mike'

4)查詢數(shù)據(jù)

scan 相當(dāng)于:select * from students

scan '表名'

get? 相當(dāng)于 select * from students where rowkey=?

get '表名','行健'

get 'student','stu001'

5)關(guān)閉和開(kāi)啟表

disable '表名'

enable '表名'

6)刪除表

disable '表名'

drop '表名'

7)清空表中的數(shù)據(jù)

truncate '表名'

truncate本質(zhì):先刪除表迷殿,再重建

日志:

Truncating 'students' table (it may take a while):

- Disabling table...

- Truncating table...

0 row(s) in 4.0840 seconds

5.數(shù)據(jù)保存的過(guò)程

注意:region分裂

HBase 架構(gòu)

ZooKeeper 作為分布式的協(xié)調(diào)。RegionServer也會(huì)把自己的信息寫(xiě)到ZooKeeper中咖杂。

HDFS是Hbase運(yùn)行的底層文件系統(tǒng)

RegionServer庆寺,數(shù)據(jù)節(jié)點(diǎn),存儲(chǔ)數(shù)據(jù)

Master诉字,RegionServer要實(shí)時(shí)向Master報(bào)告信息懦尝。Master知道全局的RegionServer運(yùn)行情況,可以控制RegionServer的故障轉(zhuǎn)移和Region的切分壤圃。

架構(gòu)細(xì)化

HMaster 是Master Server的實(shí)現(xiàn)陵霉,負(fù)責(zé)監(jiān)控集群中的Region Server實(shí)例,同時(shí)是所有metadata改變的接口伍绳,在集群中踊挠,通常運(yùn)行在NameNode上

HMasterInterface暴露的接口,Table(createTable冲杀,modifyTable效床,removeTable,enable权谁,disable)剩檀,ColumnFamily(addColumn,modifyColumn闯传,removeColumn)谨朝,Region(move,assign甥绿,unassign)

Master運(yùn)行的后臺(tái)線程:LoadBalancer線程字币,控制region來(lái)平衡集群的負(fù)載。CatalogJanitor線程共缕,周期性的檢查hbase:meta表洗出。

HRegionServer 是RegionServer的實(shí)現(xiàn),服務(wù)和管理Regions图谷,集群中RegionServer運(yùn)行在DataNode

HRegionInterface暴露接口:Data(get翩活,put阱洪,delete,next菠镇,etc.)冗荸,Region(splitRegion,compactRegion利耍,etc.)

RegionServer后臺(tái)線程:CompactSplitThread蚌本,MajorCompactionChecker,MenStoreFlusher隘梨,LogRoller

Regions程癌,代表table,Region有多個(gè)Store(列簇)轴猎,Store有一個(gè)Memstore和多個(gè)StoreFiles(HFiles)嵌莉,StoreFiles的底層是Block。

Hbase 存儲(chǔ)設(shè)計(jì)

在Hbase中捻脖,表被分割成多個(gè)更小的塊然后分散的存儲(chǔ)在不同的服務(wù)器上锐峭,這些小塊叫做Regions,存放Regions的地方叫做RegionServer可婶。Master進(jìn)程負(fù)責(zé)處理不同的RegionServer和Region只祠。HRegionServer除了包含一些HRegions之外,還處理兩種類型的文件用于數(shù)據(jù)存儲(chǔ)

HLog扰肌,預(yù)寫(xiě)日志文件,也叫做WAL(write-ahead log)

HFile 真實(shí)的數(shù)據(jù)存儲(chǔ)文件

Hlog

MasterProcWAL:HMaster記錄管理操作熊杨,比如解決沖突的服務(wù)器曙旭,表創(chuàng)建和其他DDLs等操作到它的WAL文件中,這個(gè)WALs存儲(chǔ)在MasterProcWALs目錄下晶府,它不像RegionServer的WALs桂躏,Hmaster的WAL也支持彈性操作,就是如果Master服務(wù)器掛了川陆,其他的Master接管的時(shí)候繼續(xù)操作這個(gè)文件剂习。

WAL記錄所有的Hbase數(shù)據(jù)改變,如果一個(gè)RegionServer在MemStore進(jìn)行Flush的時(shí)候掛掉了较沪,WAL可以保證數(shù)據(jù)的改變被應(yīng)用到鳞绕。如果寫(xiě)WAL失敗了,那么修改數(shù)據(jù)的完整操作就是失敗的尸曼。

通常情況们何,每個(gè)RegionServer只有一個(gè)WAL實(shí)例。在2.0之前控轿,WAL的實(shí)現(xiàn)叫做HLog

WAL位于/hbase/WALs/ 目錄下

MultiWAL:如果每個(gè)RegionServer只有一個(gè)WAL冤竹,由于HDFS必須是連續(xù)的拂封,導(dǎo)致必須寫(xiě)WAL連續(xù)的,然后出現(xiàn)性能問(wèn)題鹦蠕。MultiWAL可以讓RegionServer同時(shí)寫(xiě)多個(gè)WAL并行的冒签,通過(guò)HDFS底層的多管道,最終提升總的吞吐量钟病,但是不會(huì)提升單個(gè)Region的吞吐量萧恕。

WAL的配置

// 啟用multiwal

<property>

? <name>hbase.wal.provider</name>

? <value>multiwal</value>

</property>

HFile

HFile 是Hbase在HDFS中存儲(chǔ)數(shù)據(jù)的格式,它包含多層的索引档悠,在Hbase檢索數(shù)據(jù)的時(shí)候就不用完全的加載整個(gè)文件廊鸥。索引的大小(keys的大小辖所,數(shù)據(jù)量的大卸杷怠)影響block的大小,在大數(shù)據(jù)的情況下缘回,block的大小設(shè)置為每個(gè)RegionServer 1GB也是常見(jiàn)的吆视。

HFile生成方式

起初,HFile中并沒(méi)有任何Block酥宴,數(shù)據(jù)還存在于MemStore中啦吧。

Flush發(fā)生時(shí),創(chuàng)建HFile Writer拙寡,第一個(gè)空的Data Block出現(xiàn)授滓,初始化后的Data Block中為Header部分預(yù)留了空間,Header部分用來(lái)存放一個(gè)Data Block的元數(shù)據(jù)信息肆糕。而后般堆,位于MemStore中的KeyValues被一個(gè)個(gè)append到位于內(nèi)存中的第一個(gè)Data Block中:

:如果配置了Data Block Encoding,則會(huì)在append KeyValue的時(shí)候進(jìn)行同步編碼诚啃,編碼后的數(shù)據(jù)不再是單純的KeyValue模式淮摔。Data Block Encoding是為了降低KeyValue結(jié)構(gòu)性膨脹而提供的內(nèi)部編碼機(jī)制。

讀寫(xiě)簡(jiǎn)流程

HBase Region管理

HFile 合并

每個(gè)RegionServer包含多個(gè)Region始赎,而每個(gè)Region又對(duì)應(yīng)多個(gè)Store和橙,每一個(gè)Store對(duì)應(yīng)表中一個(gè)列簇的存儲(chǔ),且每個(gè)Store由一個(gè)MemStore和多個(gè)StoreFile文件組成造垛。

StoreFile在底層文件系統(tǒng)中由HFile實(shí)現(xiàn)魔招,也可以把Store看作由一個(gè)MemStore和多個(gè)HFile文件組成。MemStore充當(dāng)內(nèi)存寫(xiě)緩存筋搏,默認(rèn)大小64MB仆百,當(dāng)MemStore超過(guò)閾值時(shí),MemStore中的數(shù)據(jù)會(huì)刷新到一個(gè)新的HFile文件中來(lái)持久化存儲(chǔ)奔脐。

久而久之俄周,每個(gè)Store中的HFile文件會(huì)越來(lái)越多吁讨,I/O操作的速度也隨之變慢,讀寫(xiě)也會(huì)延時(shí)峦朗,導(dǎo)致慢操作建丧。因此,需要對(duì)HFile文件進(jìn)行合并波势,讓文件更緊湊翎朱,讓系統(tǒng)更有效率。

HFile的合并分為兩種類型尺铣,分別是Minior合并和Major合并拴曲。這兩種合并都發(fā)生在Store內(nèi)部,不是Region的合并凛忿,如下圖所示澈灼。

Minor合并

Minor合并是把多個(gè)小HFile合并生成一個(gè)大的HFile。

執(zhí)行合并時(shí)店溢,Hbase讀出已有的多個(gè)HFile的內(nèi)容叁熔,把記錄寫(xiě)入一個(gè)新文件中。然后把新文件設(shè)置為激活狀態(tài)床牧,并標(biāo)記舊文件為刪除荣回。

在Minor合并中,這些標(biāo)記為刪除的舊文件是沒(méi)有被移除的戈咳,仍然會(huì)出現(xiàn)在HFile中心软,只有在進(jìn)行Major合并時(shí)才會(huì)移除這些舊文件。對(duì)需要進(jìn)行Minor合并的文件的選擇是觸發(fā)式的著蛙,當(dāng)達(dá)到觸發(fā)條件才會(huì)進(jìn)行Minor合并糯累,而觸發(fā)條件有很多,例如册踩,在將MemStore的數(shù)據(jù)刷新到HFile時(shí)會(huì)申請(qǐng)對(duì)Store下符合條件的HFile進(jìn)行合并,或者定期對(duì)Store內(nèi)的HFile進(jìn)行合并效拭。

另外暂吉,對(duì)選擇合并的HFile也是有條件的,如下表所示缎患。

參數(shù)名配置項(xiàng)默認(rèn)值備注

minFileToCompacthbase.hstore.compaction.min3至少需要三個(gè)滿足條件的 HFile 才啟動(dòng)合并

minFileToCompacthbase.hstore.compaction.max10一次合并最多選擇 10 個(gè)

maxCompactSizehbase.hstore.compaction.max.sizeLong.MAX_VALUEHFile 大于此值時(shí)被排除合并慕的,避免對(duì)大文件的合并

minCompactSizehbase.hstore.compaction.min.sizeMemStoreFlushSizeHFile 小于 MemStore 的默認(rèn)值時(shí)被加入合并隊(duì)列

在執(zhí)行Minor合并時(shí),系統(tǒng)會(huì)根據(jù)上述配置參數(shù)選擇合適的HFile進(jìn)行合并挤渔。Minor合并對(duì)HBase的性能是有輕微影響的肮街,因此,合并的HFile數(shù)量是有限的判导,默認(rèn)最多為10個(gè)嫉父。

Major合并

Major合并針對(duì)的是給定Region的一個(gè)列簇的所有HFile沛硅,如圖1所示。它將Store中的所有HFile合并成一個(gè)大文件绕辖,有時(shí)也會(huì)對(duì)整個(gè)表的同一列簇的HFile進(jìn)行合并摇肌,這是一個(gè)耗時(shí)和耗費(fèi)資源的操作,會(huì)影響集群性能仪际。

一般情況下都是做Minor合并围小,不少集群是禁止Major合并的,只有在集群負(fù)載較小時(shí)進(jìn)行手動(dòng)Major合并操作树碱,或者配置Major合并周期肯适,默認(rèn)為7天。另外成榜,Major合并時(shí)會(huì)清理Minor合并中被標(biāo)記為刪除的HFile框舔。

Region的相關(guān)知識(shí)

Region在HBase中的角色

Table? ? ? ? ? ? ? ? ? ? (HBase表)

? ? Region? ? ? ? ? ? ? (Region)

? ? ? ? Store? ? ? ? ? ? (每個(gè)Region的每個(gè)列簇獨(dú)立存儲(chǔ))

? ? ? ? ? ? MemStore? ? (MemStore每個(gè)Store有一個(gè),用于在內(nèi)存中保存數(shù)據(jù))

? ? ? ? ? ? StoreFile? ? (StoreFile對(duì)應(yīng)于Store伦连,是具體存儲(chǔ)在磁盤(pán)的文件)

? ? ? ? ? ? ? ? Block? ? (Blocks是HDFS上的存儲(chǔ)單元)

Region的管理

一般來(lái)說(shuō)對(duì)于每個(gè)Region Server雨饺,官方推薦最好是控制Region的數(shù)量在20-200個(gè)、大小在5-20Gb左右惑淳。

為什么要控制Region的數(shù)量呢额港?

1、默認(rèn)MemStore需要2MB的空間用來(lái)存儲(chǔ)數(shù)據(jù)歧焦,如果一臺(tái)機(jī)器上有1000個(gè)Region移斩,每個(gè)有兩個(gè)列簇,那就需要3.9GB的數(shù)據(jù)绢馍。

2向瓷、如果同時(shí)以某個(gè)相同的頻率更新所有的Region,當(dāng)同時(shí)進(jìn)行數(shù)據(jù)持久化的時(shí)候也會(huì)有問(wèn)題

3舰涌、Master對(duì)于維護(hù)大量的Region有很大的性能問(wèn)題猖任,因?yàn)樵谄胶釸egion的時(shí)候,在ZK中的操作都是同步的瓷耙。

4朱躺、Region Server需要維護(hù)Region的索引信息

Region Server如何管理Region

啟動(dòng)

1、HMaster 創(chuàng)建 AssignmentManager

2搁痛、AssignmentManager查看當(dāng)前的Region分配信息

3长搀、滿足條件后,通過(guò)LoadBalancerFactory創(chuàng)建LoadBalancer鸡典,1.0后的版本默認(rèn)是StochasticLoadBalancer

Region的狀態(tài)機(jī)

HBase中每個(gè)Region自己維護(hù)其在hbase:meta表中的信息源请。

狀態(tài)機(jī)中包含下面幾種狀態(tài):

offline:region離線沒(méi)有開(kāi)啟

opening:region正在被打開(kāi)

open:region正在打開(kāi),并且region server通知了master

failed_open:region server打開(kāi)失敗

closing:region正在被關(guān)閉

closed:region server正在關(guān)閉,并且已經(jīng)通知了master

failed_close:region server關(guān)閉失敗了

splitting:region server通知master谁尸,region正在被切分

split:region server通知master舅踪,region已經(jīng)被切分完了

spliting_new:region是切分過(guò)程中新建的文件

merging:region server通知master,region正在合并

merged:region server 通知master症汹,region合并完了

merging_new:region是合并新建出來(lái)的

不同的顏色是不同含義:

棕色:離線狀態(tài)硫朦,屬于一種短暫的瞬間狀態(tài)(比如關(guān)閉后開(kāi)啟的中間狀態(tài))、停止?fàn)顟B(tài)或者初始化的時(shí)候的狀態(tài)

綠色:正常的狀態(tài)背镇,可以支持請(qǐng)求訪問(wèn)

藍(lán)色:短暫的狀態(tài)

紅色:失敗

黃色:合并或者切分的狀態(tài)

灰色:剛開(kāi)始的狀態(tài)

各個(gè)序號(hào)代表不同的操作場(chǎng)景:

1咬展、Master向Region server發(fā)起region從offline到openning的狀態(tài)請(qǐng)求,region server如果沒(méi)有收到瞒斩,master會(huì)嘗試重試幾次破婆。RegionServer接收到請(qǐng)求后,region狀態(tài)變?yōu)閛pening

2胸囱、如果Master發(fā)起的open請(qǐng)求超過(guò)次數(shù)祷舀,那么無(wú)論RegionServer是否已經(jīng)打開(kāi)region,master都會(huì)命令RegionServer關(guān)閉文件烹笔,狀態(tài)變?yōu)閏losing

3裳扯、當(dāng)RegionServer打開(kāi)region后,會(huì)嘗試通知Master谤职,讓它把region狀態(tài)修改為open狀態(tài)

4饰豺、如果RegionServer打開(kāi)失敗,會(huì)嘗試通知Master允蜈,讓它把region狀態(tài)修改為closed冤吨,并且嘗試去其他的RegionServer打開(kāi)region

5、如果Master嘗試幾次后饶套,都沒(méi)有打開(kāi)region漩蟆,就會(huì)把狀態(tài)變更為failed_open

6、master通知RegionServer關(guān)閉region妓蛮,如果沒(méi)有反應(yīng)怠李,會(huì)重試

7、如果RegionServer沒(méi)有在線蛤克,會(huì)拋出異常扔仓。然后region的狀態(tài)會(huì)變成closing

8、如果RegionServer在線咖耘,但是好幾次都沒(méi)響應(yīng),就會(huì)更新?tīng)顟B(tài)為failed_closed撬码。并且把region分配給其他的server

10儿倒、再分配之前,master會(huì)先把region從closed狀態(tài)變?yōu)閛ffline

11、如果RegionServer正在切分region夫否,會(huì)通知master彻犁。master把region狀態(tài)由open變?yōu)閟plitting,并且新增兩個(gè)region的信息凰慈,這兩個(gè)region都是splitting_new狀態(tài)

12汞幢、如果region切分成功,當(dāng)前的region狀態(tài)從splitting變成split微谓;新增的兩個(gè)region狀態(tài)從splitting_new變成open

13森篷、如果切分失敗,狀態(tài)從splitting回到open豺型,兩個(gè)region也從splitting_new變成offline

14仲智、如果RegionServer想要合并兩個(gè)region,那么也會(huì)先通知master姻氨。master把兩個(gè)region從open變?yōu)閙erging钓辆,然后增加一個(gè)新的region,狀態(tài)為merging_new

15肴焊、如果合并成功前联,舊的region狀態(tài)從merging變?yōu)閙erged,新的region從merging_new變?yōu)閛pen

16娶眷、如果合并失敗似嗤,region的狀態(tài)從merging變回open,新建的一個(gè)region狀態(tài)又變成offline

17茂浮、如果管理員通過(guò)hbase shell操作分配region双谆,master會(huì)嘗試把失敗的狀態(tài)變成close

Region的數(shù)據(jù)本地性

數(shù)據(jù)本地性通過(guò)來(lái)自于hdfs client和hdfs block存儲(chǔ)的節(jié)點(diǎn)差異性,針對(duì)數(shù)據(jù)備份來(lái)說(shuō)席揽,會(huì)按照下面的機(jī)制進(jìn)行:

1顽馋、第一個(gè)備份會(huì)優(yōu)先選擇本地node節(jié)點(diǎn)上

2、第二個(gè)備份會(huì)隨機(jī)選擇一個(gè)不同的機(jī)架

3幌羞、第三個(gè)備份會(huì)在第二個(gè)備份所在的機(jī)架上寸谜,在隨機(jī)選擇一個(gè)節(jié)點(diǎn)

4、如果還有其他的備份節(jié)點(diǎn)属桦,就在集群中隨機(jī)選擇了

這樣HBase在刷新或者壓縮時(shí)熊痴,可以體現(xiàn)數(shù)據(jù)的本地性。如果一個(gè)RegionServer出現(xiàn)故障聂宾,那么就沒(méi)有數(shù)據(jù)本地性可言了果善,因?yàn)樗膫浞荻荚谄渌墓?jié)點(diǎn)上。

Region拆分

Region拆分是HBase能夠擁有良好擴(kuò)展性的最重要因素系谐。一旦Region的負(fù)載過(guò)大或者超過(guò)閾值時(shí)巾陕,它就會(huì)被分裂成兩個(gè)新的Region讨跟,如圖所示。

這個(gè)過(guò)程是由RegionServer完成的鄙煤,其拆分流程如下晾匠。

1、將需要拆分的Region下線梯刚,阻止所有對(duì)該Region的客戶端請(qǐng)求凉馆,Master會(huì)檢測(cè)到Region的狀態(tài)為SPLITTING。

2亡资、將一個(gè)Region拆分成兩個(gè)子Region澜共,先在父Region下建立兩個(gè)引用條件,分別指向Region的首行和末行沟于,這時(shí)兩個(gè)引用文件并不會(huì)從父Region中復(fù)制數(shù)據(jù)咳胃。

3、之后在HDFS上建立兩個(gè)子Region的目錄旷太,分別復(fù)制上一步建立的引用文件展懈,每個(gè)子Region分別占父Region的一半數(shù)據(jù)。復(fù)制登錄完成后刪除兩個(gè)引用文件供璧。

4存崖、完成子Region創(chuàng)建后,向Meta表發(fā)送新產(chǎn)生的Region的元數(shù)據(jù)信息睡毒。

5来惧、將Region的拆分信息更新到HMaster,并且每個(gè)Region進(jìn)入可用狀態(tài)演顾。

以上是Region的拆分過(guò)程供搀,那么,Region在什么時(shí)候才會(huì)觸發(fā)拆分呢钠至?常用的拆分策略如下表所示

策略原理描述

ConstantSizeRegionSplitPolicyRegion 中最大 Store 的大小大于設(shè)置閾值(hbase.hregion.max.filesize)之后才會(huì)觸發(fā)拆分葛虐。 拆分策略原理相同,只是閾值的設(shè)置不同拆分策略對(duì)于大表和小表沒(méi)有明顯的區(qū)分棉钧。閾值設(shè)置較大時(shí)小表可能不會(huì)觸發(fā)分裂屿脐。如果閾值設(shè)置較小,大表就會(huì)在整個(gè)集群產(chǎn)生大量的 Region宪卿,影響整個(gè)集群的性能

IncreasingToUpper BoundRegionSplitPolicy閾值在一定條件下不斷調(diào)整的诵,調(diào)整規(guī)則與 Region 所屬表在當(dāng)前 Region 服務(wù)器上的 Region 個(gè)數(shù)有關(guān)系很多小表會(huì)在大集群中產(chǎn)生大量小 Region,分散在整個(gè)集群中

SteppingSplitPolicy閾值可變佑钾。如果 Region 個(gè)數(shù)等于 1西疤,則拆分閾值為 flushsize × 2;否則為 MaxRegionFileSize小表不會(huì)再產(chǎn)生大量的小 Region休溶,而是適可而止

DisabledRegionSplitPolicy關(guān)閉策略代赁,手動(dòng)拆分可控制拆分時(shí)間撒遣,選擇集群空閑時(shí)間

Region 合并

從Region的拆分過(guò)程中可以看到,隨著表的增大管跺,Region的數(shù)量也越來(lái)越大。如果有很多Region禾进,它們中MemStore也過(guò)多豁跑,會(huì)頻繁出現(xiàn)數(shù)據(jù)從內(nèi)存被刷新到HFile的操作,從而會(huì)對(duì)用戶請(qǐng)求產(chǎn)生較大的影響泻云,可能阻塞該Region服務(wù)器上的更新操作艇拍。過(guò)多的Region會(huì)增加ZooKeeper的負(fù)擔(dān)。

因此宠纯,當(dāng)Region服務(wù)器中的Region數(shù)量達(dá)到閾值時(shí)卸夕,Region服務(wù)器就會(huì)發(fā)起Region合并,其合并過(guò)程如下婆瓜。

1快集、客戶端發(fā)起Region合并處理,并發(fā)送Region合并請(qǐng)求給Master廉白。

2个初、Master在Region服務(wù)器上把Region移到一起,并發(fā)起一個(gè)Region合并操作的請(qǐng)求猴蹂。

3院溺、Region服務(wù)器將準(zhǔn)備合并的Region下線,然后進(jìn)行合并磅轻。

4珍逸、從Meta表刪除被合并的Region元數(shù)據(jù),新的合并了的Region的元數(shù)據(jù)被更新寫(xiě)入Meta表中聋溜。

5谆膳、合并的Region被設(shè)置為上線狀態(tài)并接受訪問(wèn),同時(shí)更新Region信息到Master勤婚。

Region 負(fù)載均衡

當(dāng)Region分裂之后摹量,Region服務(wù)器之間的Region數(shù)量差距變大時(shí),Master便會(huì)執(zhí)行負(fù)載均衡來(lái)調(diào)整部分Region的位置馒胆,使每個(gè)Region服務(wù)器的Region數(shù)量保持在合理范圍之內(nèi)缨称,負(fù)載均衡會(huì)引起Region的重新定位,使涉及的Region不具備數(shù)據(jù)本地性祝迂。

Region的負(fù)載均衡由Master來(lái)完成睦尽,Master有一個(gè)內(nèi)置的負(fù)載均衡器,在默認(rèn)情況下型雳,均衡器每5分鐘運(yùn)行一次当凡,用戶可以配置山害。負(fù)載均衡操作分為兩步進(jìn)行:首先生成負(fù)載均衡計(jì)劃表,然后按照計(jì)劃表執(zhí)行Region的分配沿量。

執(zhí)行負(fù)載均衡前要明確浪慌,在以下幾種情況時(shí),Master是不會(huì)執(zhí)行負(fù)載均衡的朴则。

均衡負(fù)載開(kāi)關(guān)關(guān)閉

Master沒(méi)有初始化

當(dāng)前有Region處于拆分狀態(tài)

當(dāng)前集群中有Region服務(wù)器出現(xiàn)故障

Master內(nèi)部使用一套集群負(fù)載評(píng)分的算法权纤,來(lái)評(píng)估HBase某一個(gè)表的Region是否需要進(jìn)行重新分配。這套算法分別從Region服務(wù)器中Region的數(shù)目乌妒、表的Region數(shù)汹想、MemStore大小、StoreFile大小撤蚊、數(shù)據(jù)本地性等幾個(gè)維度來(lái)對(duì)集群進(jìn)行評(píng)分古掏,評(píng)分越低代表集群的負(fù)載越合理。

確定需要負(fù)載均衡后侦啸,再根據(jù)不同策略選擇Region進(jìn)行分配槽唾,負(fù)載均衡策略有三種,如下表所示匹中。

策略原理

RandomRegionPicker隨機(jī)選出兩個(gè) Region 服務(wù)器下的 Region 進(jìn)行交換

LoadPicker獲取 Region 數(shù)目最多或最少的兩個(gè) Region 服務(wù)器夏漱,使兩個(gè) Region 服務(wù)器最終的 Region 數(shù)目更加平均

LocalityBasedPicker選擇本地性最強(qiáng)的 Region

根據(jù)上述策略選擇分配Region后再繼續(xù)對(duì)整個(gè)表的所有Region進(jìn)行評(píng)分,如果依然未達(dá)到標(biāo)準(zhǔn)顶捷,循環(huán)執(zhí)行上述操作直至整個(gè)集群達(dá)到負(fù)載均衡的狀態(tài)挂绰。

Region/Store/StoreFile/Hfile之間的關(guān)系

1、Region

table在行的方向上分隔為多個(gè)Region服赎。Region是Hbase中分布式存儲(chǔ)和負(fù)載均衡的最小單元葵蒂,即不同的Region可以分別在不同的Region Server上,但同一個(gè)Region是不會(huì)拆分到多個(gè)Server上重虑。

Region按大小分隔践付,表中每一行只能屬于一個(gè)region。隨著數(shù)據(jù)不斷插入表缺厉,region不斷增大永高,當(dāng)region的某個(gè)列簇達(dá)到一個(gè)閾值(默認(rèn)值)時(shí)就會(huì)分成兩個(gè)新的region。

2提针、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

3艇抠、MemStore

memStore是放在內(nèi)存里的幕庐。保存修改的數(shù)據(jù)即keyValues。當(dāng)memStore的大小達(dá)到一個(gè)閾值(默認(rèn)值)時(shí)家淤,memStore會(huì)被flush到文件异剥,即生成一個(gè)快照。目前hbase會(huì)有一個(gè)線程來(lái)負(fù)責(zé)memStore的flush操作絮重。

4届吁、StoreFile

memStore內(nèi)存中的數(shù)據(jù)寫(xiě)到文件后就是StoreFile(即memStore的每次flush操作都會(huì)生成一個(gè)新的StoreFile),StoreFile底層是以HFile的格式保存绿鸣。

5、HFile

HFile是Hbase中KeyValue數(shù)據(jù)的存儲(chǔ)格式暂氯,是hadoop的二進(jìn)制格式文件潮模。一個(gè)StoreFile對(duì)應(yīng)著一個(gè)HFile。而HFile是存儲(chǔ)在HFDS之上的痴施。HFile文件格式是基于Google Bigtable中的 SS Table擎厢,如下圖所示:

Data Block段:保存表中的數(shù)據(jù),這部分可以被壓縮辣吃。Data Block是 HBase I/O的基本單元动遭,為了提高效率。HRegion Server中有基于LRU的Block Cache機(jī)制神得,每個(gè)Data Block大小可以在創(chuàng)建一個(gè)Table的時(shí)候通過(guò)參數(shù)指定厘惦,較大的Data Block有利于順序scan,小的Data Block有利于隨機(jī)查詢

Meta Block段:保存用戶自定義的kv對(duì)哩簿,可以被壓縮宵蕉。

File Info段:HFile的元信息,不被壓縮节榜,用戶也可以在這一部分添加自己的元信息羡玛,記錄了文件的META信息,例如:AVG_KEY_LEN宗苍,ACG_VALUE_LEN稼稿,LAST_KEY,COMPARATOR讳窟,MAX_SEQ_ID_KEY等

Data Block Index段:Data Block的索引让歼。每條索引的key是被索引的block的第一條記錄的key

Meta Block Index段:Meta Block的索引

Trailer:這一段是定長(zhǎng)的。保存了每一段的偏移量挪钓,讀取一個(gè)HFile時(shí)是越,會(huì)首先讀取Trailer,Trailer保存了每個(gè)段的起始位置(段的Magic Number用來(lái)做安全check)碌上,然后倚评,DataBlock Index會(huì)被讀取到內(nèi)存中浦徊,這樣,當(dāng)檢索某個(gè)key時(shí)天梧,不需要掃描整個(gè)HFile盔性,而只需要從內(nèi)存中找到key所在的block,通過(guò)一次磁盤(pán)io將整個(gè)block讀取到內(nèi)存中呢岗,再找到需要的key冕香。DataBlock Index采用LRU機(jī)制淘汰。

HFile的Data Block后豫,Meta Block通常采用壓縮方式存儲(chǔ)悉尾,壓縮之后可以大大減少網(wǎng)絡(luò)IO和磁盤(pán)IO,隨之而來(lái)的開(kāi)銷當(dāng)然是需要花費(fèi)cpu進(jìn)行壓縮和解壓縮挫酿。

HFile里面的每個(gè)key-value對(duì)就是一個(gè)簡(jiǎn)單的byte數(shù)組构眯,這個(gè)byte數(shù)組具有固定結(jié)構(gòu)。

(1)KeyLength和ValueLength:兩個(gè)固定的長(zhǎng)度早龟,分別代表Key和Value的長(zhǎng)度

(2)Key部分:Row Length是固定長(zhǎng)度的數(shù)值惫霸,表示RowKey的長(zhǎng)度,Row 就是RowKey

(3)Column Family Length是固定長(zhǎng)度的數(shù)值葱弟,表示Family的長(zhǎng)度

(4)接著就是Column Family壹店,再接著是Qualifier,然后是兩個(gè)固定長(zhǎng)度的數(shù)值芝加,表示Time Stamp和Key Type(Put/Delete)

(5)Value部分沒(méi)有這么復(fù)雜的結(jié)構(gòu)硅卢,就是純粹的二進(jìn)制數(shù)據(jù)

首先HFile文件是不定長(zhǎng)的,長(zhǎng)度固定的只有其中的兩塊:Trailer和FileInfo藏杖。Trailer中指針又指向其它數(shù)據(jù)塊的起始點(diǎn)老赤,F(xiàn)ileInfo記錄了文件的一些meta信息。

HBase 在HDFS上的存儲(chǔ)結(jié)構(gòu)

Hbase表的HDFS目錄結(jié)構(gòu)為

/hbase /data /<Namespace> (集群里的Namespaces) /<Table> (該集群的Tables) /<Region> (該table的Regions) /<ColumnFamily> (該Region的列族) /<StoreFile> (該列族的StoreFiles)

HLog的HDFS目錄結(jié)構(gòu)

/hbase /WALs /<RegionServer> (RegionServers) /<WAL> (WAL files for the RegionServer)

6制市、Meta表

有了 Region 標(biāo)識(shí)符抬旺,就可以唯一標(biāo)識(shí)每個(gè) Region。為了定位每個(gè) Region 所在的位置祥楣,可以構(gòu)建一張映射表开财。

映射表的每個(gè)條目包含兩項(xiàng)內(nèi)容,一項(xiàng)是 Region 標(biāo)識(shí)符误褪,另一項(xiàng)是 Region 服務(wù)器標(biāo)識(shí)责鳍。這個(gè)條目就表示 Region 和 Region 服務(wù)器之間的對(duì)應(yīng)關(guān)系,從而就可以使用戶知道某個(gè) Region 存儲(chǔ)在哪個(gè) Region 服務(wù)器中兽间。這個(gè)映射表包含了關(guān)于 Region 的元數(shù)據(jù)历葛,因此也被稱為“元數(shù)據(jù)表”,又名“Meta表”。

使用 scan 命令可查看 Meta 表的結(jié)構(gòu)恤溶,如圖所示乓诽。

Meta 表中的每一行記錄了一個(gè) Region 的信息。RowKey 包含表名咒程、起始行鍵和時(shí)間戳信息鸠天,中間用逗號(hào)隔開(kāi),第一個(gè) Region 的起始行鍵為空帐姻。時(shí)間戳之后用.隔開(kāi)的為分區(qū)名稱的編碼字符串稠集,該信息是由前面的表名、起始行鍵和時(shí)間戳進(jìn)行字符串編碼后形成的饥瓷。

Meta 表里有一個(gè)列簇 info剥纷。info 包含了三個(gè)列,分別為 Regionlnfo呢铆、RegioninfoServer 和 Serverstartcode筷畦。Regionlnfo中記錄了 Region 的詳細(xì)信息,包括行鍵范圍 StartKey 和 EndKey刺洒、列族列表和屬性。

Server 記錄了管理該 Region 的 Region 服務(wù)器的地址吼砂,如 localhost:16201逆航。

Serverstartcode 記錄了 Region 服務(wù)器開(kāi)始托管該 Region 的時(shí)間。

當(dāng)用戶表特別大時(shí)渔肩,用戶表的 Region 也會(huì)非常多因俐。Meta 表存儲(chǔ)了這些 Region 信息,也變得非常大周偎。Meta 表也需要?jiǎng)澐殖啥鄠€(gè) Region抹剩,每個(gè) Meta 分區(qū)記錄一部分用戶表和分區(qū)管理的情況。

hbase:meta表的一個(gè)rowkey對(duì)應(yīng)一個(gè)region蓉坎,rowkey設(shè)計(jì)如下:

表名,region的startRowkey,region創(chuàng)建時(shí)的時(shí)間戳.EcodedName

例:test:vt_article,66192017090716590_4149388609714192,1542770105784.5c44f752e1012fba9eacad769185b9dd

表名 : test:vt_article

開(kāi)始rowkey :66192017090716590_4149388609714192

創(chuàng)建Region時(shí)間戳:1542770105784

EncodedName :5c44f752e1012fba9eacad769185b9dd = MD5(test:vt_article,66192017090716590_4149388609714192,1542770105784)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末澳眷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蛉艾,更是在濱河造成了極大的恐慌钳踊,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勿侯,死亡現(xiàn)場(chǎng)離奇詭異拓瞪,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)助琐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)祭埂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人兵钮,你說(shuō)我怎么就攤上這事蛆橡∩嘟纾” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵航罗,是天一觀的道長(zhǎng)禀横。 經(jīng)常有香客問(wèn)我,道長(zhǎng)粥血,這世上最難降的妖魔是什么柏锄? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮复亏,結(jié)果婚禮上趾娃,老公的妹妹穿的比我還像新娘。我一直安慰自己缔御,他們只是感情好抬闷,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著耕突,像睡著了一般笤成。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上眷茁,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天炕泳,我揣著相機(jī)與錄音,去河邊找鬼上祈。 笑死培遵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的登刺。 我是一名探鬼主播籽腕,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼嗓蘑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼敷待!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起赞哗,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤揍很,失蹤者是張志新(化名)和其女友劉穎廊宪,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體女轿,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡箭启,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蛉迹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片傅寡。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出荐操,到底是詐尸還是另有隱情芜抒,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布托启,位于F島的核電站宅倒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏屯耸。R本人自食惡果不足惜拐迁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望疗绣。 院中可真熱鬧线召,春花似錦、人聲如沸多矮。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)塔逃。三九已至讯壶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間湾盗,已是汗流浹背伏蚊。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留淹仑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓肺孵,卻偏偏與公主長(zhǎng)得像匀借,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子平窘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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