概念:
數(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)