使用HBase已有半年時(shí)間均蜜,最近在公司內(nèi)部組織了一場(chǎng)HBase的分享會(huì)但绕,沒(méi)想到引起了很多同學(xué)的熱烈討論却特。但是由于功課沒(méi)做好扶供,加之底層的原理沒(méi)有完全搞懂,很多同學(xué)的提問(wèn)不能很好的給予解答裂明,不免有些遺憾椿浓。
今天特地整理一下ppt上的內(nèi)容,希望能給第一次接觸HBase的同學(xué)一點(diǎn)幫助闽晦。
HBase 官方文檔 https://hbase.apache.org/book.html
本文主要從以下幾個(gè)方面介紹下HBase
1.基本概念
HBase 是建立在HDFS之上扳碍,提供高可靠、高性能仙蛉、列存儲(chǔ)笋敞、可伸縮、實(shí)時(shí)讀寫NoSql的分布式數(shù)據(jù)庫(kù)系統(tǒng)荠瘪。
- HDFS為HBase提供底層數(shù)據(jù)存儲(chǔ)服務(wù)
- Zookeeper為HBase提供穩(wěn)定服務(wù)和fail-over機(jī)制
- LSM提供了高性能支持
- WAL提供了可靠性
2.HBase 特性
- 面向列夯巷,面向列(族)的存儲(chǔ)和權(quán)限控制,列(族)獨(dú)立檢索
- 容量巨大哀墓,單表可以有百億行趁餐,百萬(wàn)列
- 無(wú)模式,同一張表中不同的行可以有截然不同的列
- LSM數(shù)據(jù)結(jié)構(gòu)(Log-Structured Merge-Tree)
- WAL(Write-Ahead-Log)預(yù)寫日志機(jī)制
- Row Key有序排列(字典排序)
- 稀疏性篮绰,空值不占用存儲(chǔ)空間
- TTL(Time to Live)
- 數(shù)據(jù)多版本后雷,每個(gè)單元中的數(shù)據(jù)可以有多個(gè)版本,默認(rèn)情況下版本號(hào)自動(dòng)分配吠各,是單元格插入時(shí)的時(shí)間戳
- 數(shù)據(jù)類型單一臀突,Hbase中的數(shù)據(jù)都是字符串(byte[])
3.HBase 架構(gòu)
Client
- 包含訪問(wèn)HBase的接口,并維護(hù)cache來(lái)加快對(duì)HBase的訪問(wèn)走孽,比如region的位置信息
Master
- 為Region server分配region
- 負(fù)責(zé)Region server的負(fù)載均衡
- 發(fā)現(xiàn)失效的Region server并重新分配其上的region
- 管理用戶對(duì)table的增刪改查操作
Region Server
- Regionserver維護(hù)region惧辈,處理對(duì)這些region的IO請(qǐng)求
- Regionserver負(fù)責(zé)切分在運(yùn)行過(guò)程中變得過(guò)大的region
4.HBase 邏輯視圖
- 隱形主鍵,rowkey
- 數(shù)據(jù)單一磕瓷,type[]
- 無(wú)模式盒齿,列不固定,列由列族管理和檢索
- 多版本困食,一個(gè)單元列內(nèi)不同時(shí)間戳對(duì)應(yīng)不同的數(shù)值
5.HBase 物理模型
- Table中所有行都按照row key的字典序排列
- Table在行的方向上分割為多個(gè)Region
- Region按大小分割的边翁,每個(gè)表開(kāi)始只有一個(gè)region,隨著數(shù)據(jù)增多硕盹,region不斷增大符匾,當(dāng)增大到一個(gè)閾值的時(shí)候,region就會(huì)等分會(huì)兩個(gè)新的region瘩例,之后會(huì)有越來(lái)越多的region
- Region是Hbase中分布式存儲(chǔ)和負(fù)載均衡的最小單元啊胶,不同Region分布到不同RegionServer上
- Region雖然是分布式存儲(chǔ)的最小單元甸各,但并不是存儲(chǔ)的最小單元
6.HBase 容錯(cuò)和恢復(fù)WAL
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組成。 思考:為什么不建議一張表創(chuàng)建多個(gè)列族黔漂?
MemStore
memStore 是放在內(nèi)存里的诫尽。保存修改的數(shù)據(jù)即keyValues。當(dāng)memStore的大小達(dá)到一個(gè)閾值時(shí)炬守,memStore會(huì)被flush到文件牧嫉,即生成一個(gè)快照。目前hbase 會(huì)有一個(gè)線程來(lái)負(fù)責(zé)memStore的flush操作减途。
StoreFile
memStore內(nèi)存中的數(shù)據(jù)寫到文件后就是StoreFile驹止,StoreFile底層是以HFile的格式保存。
HFile
HBase中KeyValue數(shù)據(jù)的存儲(chǔ)格式观蜗,是hadoop的二進(jìn)制格式文件臊恋。HBase 的寫入最先會(huì)放入內(nèi)存中,提供實(shí)時(shí)的查詢墓捻,當(dāng) Memstore 中數(shù)據(jù)達(dá)到一定量的閾值(128MB)抖仅,會(huì)通過(guò) Flush 操作生成 HFile 持久化到 HDFS 中,隨著用戶的寫入砖第,生成的 HFile 數(shù)目會(huì)逐步增多撤卢,這會(huì)影響用戶的讀操作,同時(shí)也會(huì)系統(tǒng)占用(HDFS 層 block 的數(shù)目梧兼, regionserver 服務(wù)器的文件描述符占用)放吩, region split 操作,region reopen 操作也會(huì)受到不同程度影響羽杰。 HBase 通過(guò) Compaction 機(jī)制將多個(gè) HFile 合并成一個(gè) HFile 以控制每個(gè) Region 內(nèi)的 HFile 的數(shù)目在一定范圍內(nèi)
HLog
HLog文件就是一個(gè)普通的Hadoop Sequence File渡紫, Sequence File的key是HLogKey對(duì)象,其中記錄了寫入數(shù)據(jù)的歸屬信息考赛,除了table和region名字外惕澎,還同時(shí)包括sequence number和timestamp,timestamp是寫入時(shí)間颜骤,sequence number的起始值為0唧喉,或者是最近一次存入文件系統(tǒng)中的sequencenumber。 Sequence File的value是HBase的KeyValue對(duì)象,即對(duì)應(yīng)HFile中的KeyValue八孝。
LogFlusher
定期將內(nèi)存中kv數(shù)據(jù)同步到hlog
LogRoller
定期滾動(dòng)更新日志董朝,刪除舊日志。每個(gè)regionserver維護(hù)一個(gè)HLog干跛,而不是每一個(gè)region一個(gè)益涧,這樣不同region(來(lái)自不同的table)的日志會(huì)混在一起,這樣做的目的是不斷追加單個(gè)文件相對(duì)于同時(shí)寫多個(gè)文件而言驯鳖,可以減少磁盤尋址次數(shù),因此可以提高table的寫性能久免。帶來(lái)麻煩的時(shí)浅辙,如果一個(gè)regionserver下線,為了恢復(fù)其上的region阎姥,需要將region server上的log進(jìn)行拆分记舆,然后分發(fā)到其他regionserver上進(jìn)行恢復(fù)。
容錯(cuò)
每個(gè)HRegionServer中都有一個(gè)HLog對(duì)象呼巴,HLog是一個(gè)實(shí)現(xiàn)Write Ahead Log的類泽腮。在每次用戶操作寫入MemStore的同時(shí),也會(huì)寫一份數(shù)據(jù)到HLog文件中衣赶。HLog文件定期會(huì)滾動(dòng)更新诊赊,并刪除舊的文件(已持久化到StoreFile中的數(shù)據(jù))。
恢復(fù)
當(dāng)HRegionServer意外終止后府瞄,HMaster會(huì)通過(guò)Zookeeper感知到碧磅,HMaster首先會(huì)處理遺留的 HLog文件,將其中不同Region的Log數(shù)據(jù)進(jìn)行拆分遵馆,分別放到相應(yīng)region的目錄下鲸郊,然后再將失效的region重新分配,領(lǐng)取到這些region的HRegionServer在Load Region的過(guò)程中货邓,會(huì)發(fā)現(xiàn)有歷史HLog需要處理秆撮,因此會(huì)Replay HLog中的數(shù)據(jù)到MemStore中,然后flush到StoreFiles换况,完成數(shù)據(jù)恢復(fù)职辨。
7.HBase 一次查詢過(guò)程
-ROOT-表和.META.表是hbase內(nèi)置的兩張表,結(jié)構(gòu)相同戈二。
一張表可能有多個(gè)分區(qū)拨匆,Hbase查詢一條數(shù)據(jù)首先要知道這條記錄存放在哪個(gè)分區(qū)region,.META.表就是記錄用戶信息與分區(qū)的關(guān)系數(shù)據(jù)挽拂。
.META.表由regionServer 管理惭每,當(dāng)分區(qū)足夠多時(shí).META.也會(huì)分區(qū),這就意味著可能有多個(gè)regionServer在管理.META.信息,要想知道是哪個(gè)分區(qū)存儲(chǔ)了這條記錄台腥,就要先知道這個(gè).META.由哪個(gè)regionServer 管理宏赘。
-ROOT-表有著和meta表一樣的數(shù)據(jù)結(jié)構(gòu),它是用來(lái)存儲(chǔ)meta 與分區(qū)關(guān)系的表黎侈,-ROOT-表只有一份察署,由zk管理地址。
8.HBase 應(yīng)用場(chǎng)景
- 大數(shù)據(jù)量存儲(chǔ)峻汉,大數(shù)據(jù)量高并發(fā)操作
- 高并發(fā)寫入贴汪,瞬間寫入量很大
- 業(yè)務(wù)場(chǎng)景簡(jiǎn)單(無(wú)交叉列,交叉表休吠,事務(wù)扳埂, 連接等)
- 可以優(yōu)雅的數(shù)據(jù)擴(kuò)展
9.HBase RowKey設(shè)計(jì)
參見(jiàn)文章:RowKey行鍵設(shè)計(jì)規(guī)范
最后補(bǔ)充一些分享會(huì)上別人提出的問(wèn)題
Q:HBase為什么寫入會(huì)有熱點(diǎn),不應(yīng)該是負(fù)載均衡嗎瘤礁?
A:HBase 寫入不是直接負(fù)載均衡到各個(gè)節(jié)點(diǎn)的阳懂,而是去META表查詢各個(gè)region的開(kāi)始結(jié)束區(qū)間,以及對(duì)應(yīng)的regionServer柜思,符合某個(gè)region區(qū)間岩调,就去連接這個(gè)region所在的server,當(dāng)前綴都相同時(shí)(日期打頭)赡盘,數(shù)據(jù)都在相鄰位置号枕,很容易寫在同一個(gè)region,所以就造成了某個(gè)server熱點(diǎn)
Q:數(shù)據(jù)在HFile中存儲(chǔ)陨享,有更小的rowkey寫入磁盤時(shí)堕澄,是插入到前面的HFile還是追加在后面的HFile?
A:追加在后面的HFile霉咨,多個(gè)HFile之間是允許有rowkey 交叉存儲(chǔ)的蛙紫,也就是無(wú)序的。當(dāng)HFile數(shù)量到達(dá)一定閾值途戒,就會(huì)啟動(dòng)合并排序坑傅,將多個(gè)小HFile合并并排序成一個(gè)大的HFile。最后刪除舊的HFile喷斋。
Q:regionServer 往HLog寫日志是同步的嗎唁毒?如果同步寫怎么做到高并發(fā)的?
A:是同步的星爪。昨天我有說(shuō)有緩沖區(qū)浆西,這個(gè)是不對(duì)的,抱歉顽腾!因?yàn)閷憀og數(shù)據(jù)是只追加近零,不更新诺核,因此io的消耗并不大,足夠支撐hbase高并發(fā)久信。
參考資料:
HBase原理窖杀、基本概念、基本架構(gòu) https://blog.csdn.net/woshiwanxin102213/article/details/17584043
HBase基本概念
https://www.cnblogs.com/SuKiWX/p/8861993.html
HBase -ROOT-和.META.表結(jié)構(gòu)(region定位原理) https://blog.csdn.net/chlaws/article/details/16918913