<>1:什么是HBase
HBase是一個(gè)高可靠性,高性能,面向列,可伸縮的分布式數(shù)據(jù)庫(kù)
,提供海量數(shù)據(jù)存儲(chǔ)功能,一個(gè)結(jié)構(gòu)化的分布式存儲(chǔ)系統(tǒng),不同于一般的關(guān)系型數(shù)據(jù)庫(kù),它適合半結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)。
<>2:HBase表的特點(diǎn)
大:一個(gè)表中可以有數(shù)十億行,上百萬(wàn)列
無(wú)模式:每行都有一個(gè)可排序的主鍵和任意多的列,列可以根據(jù)需要?jiǎng)討B(tài)的增加,同一張表中不同的行可以有截然不同的列
面向列:面向列存儲(chǔ)和權(quán)限控制
稀疏:空列并不占用存儲(chǔ)空間,可以設(shè)計(jì)的非常稀疏
數(shù)據(jù)多版本:每個(gè)單元中的數(shù)據(jù)可以有多個(gè)版本,默認(rèn)情況下版本號(hào)自動(dòng)分配,是單元格插入的時(shí)間戳
數(shù)據(jù)類型單一:Hbase中的數(shù)據(jù)都是字符串,沒(méi)有類型
<>3:HBase架構(gòu)
<>HBase由client,zookeeper,HMaster,HRegionServer,HRegion以及StoreFile和HFile組成
<>Client
是HBase的接口,并維護(hù)cache來(lái)加快對(duì)HBase的訪問(wèn),client不是直接和HMaster直接通信,而是和ZooKeeper,通過(guò)Zookeeper返回HRegionServer,在client去找對(duì)應(yīng)的HRegionServer
<>HMaster是主節(jié)點(diǎn)
HMaster進(jìn)程負(fù)責(zé)管理所有的RegionServer,包括新的RegionServer的注冊(cè),RegionServer的故障切換處理。負(fù)責(zé)RegionServer的負(fù)載均衡。發(fā)現(xiàn)失效的RegionServer并重新分配其上的Region。管理用戶對(duì)table的增刪改查工作。GFS上的垃圾文件回收。處理Schema更新請(qǐng)求.
<>Zookeeper
保證任何時(shí)候集群只有一個(gè)Master。存儲(chǔ)region的尋址入口。實(shí)現(xiàn)監(jiān)控RegionServer的上線和下線信息,并實(shí)現(xiàn)通知給Master。存儲(chǔ)HBase的schma和table元數(shù)據(jù).
<>HRegion Server
HRegionServer是HBase的從點(diǎn),它負(fù)責(zé)提供表數(shù)據(jù)讀寫(xiě)等服務(wù),是數(shù)據(jù)存儲(chǔ)和計(jì)算單元。一臺(tái)HRegionServer管理多個(gè)Region和一個(gè)Hlog
Region Server負(fù)責(zé)維護(hù)Master分配給它的Region,處理對(duì)這些Region的IO請(qǐng)求
Region Server負(fù)責(zé)切分在運(yùn)行過(guò)程中變得過(guò)大的Region
<>Region
一個(gè)region由一個(gè)或多個(gè)store組成,每個(gè)store存儲(chǔ)該region一個(gè)列簇的數(shù)據(jù),一個(gè)store包含一個(gè)memstore緩存以及若干StoreFile文件,Memstore緩存客戶端向region插入的數(shù)據(jù),當(dāng)HregionServer中的Memstore大小達(dá)到配置容量上限時(shí),RegionServer會(huì)將Memstore中的數(shù)據(jù)刷新(flush)到HDFS中,成為Hfile。
Region是將一個(gè)數(shù)據(jù)表按Key值范圍橫向劃分為一個(gè)個(gè)的子表,實(shí)現(xiàn)分布式存儲(chǔ) Region分為元數(shù)據(jù)Region以及用戶Region兩類
元數(shù)據(jù)Region也叫Meta
Region,記錄了每個(gè)Region的路由信息,每個(gè)子表的存放位置,起始Key值,元數(shù)據(jù)Region存放在Root表中,Root表則存放在Zookeeper中
讀取Region數(shù)據(jù)的路由需要以下幾步 1:在Zookeeper只查找Meta Region的地址 2:再由Meta Region中尋找User
Region的地址
<>Zookeeper(HMaster選舉流程)
主備Master同時(shí)向ZooKeeper注冊(cè)自己的節(jié)點(diǎn)信息,誰(shuí)先寫(xiě)入,誰(shuí)就是主節(jié)點(diǎn)
注冊(cè)寫(xiě)入時(shí)會(huì)查詢有沒(méi)有相對(duì)應(yīng)的節(jié)點(diǎn),如果有,這個(gè)HMaster查看主節(jié)點(diǎn)是誰(shuí),如果主Master有相對(duì)應(yīng)的節(jié)點(diǎn)并且實(shí)時(shí)更新了,那么這個(gè)HMaster就會(huì)自動(dòng)作為備節(jié)點(diǎn),進(jìn)入休眠狀態(tài)
備節(jié)點(diǎn)會(huì)實(shí)時(shí)監(jiān)聽(tīng)ZooKeeper的狀態(tài)主節(jié)點(diǎn)的信息
在系統(tǒng)開(kāi)始時(shí),主備節(jié)點(diǎn)都會(huì)向Zookeeper里面創(chuàng)建一個(gè)目錄,比如叫HBase,在目錄中寫(xiě)入節(jié)點(diǎn)信息,創(chuàng)建之前先去查詢里面有沒(méi)有這個(gè)目錄以及目錄里面文件的時(shí)間戳信息與當(dāng)前節(jié)點(diǎn)的時(shí)間戳信息做對(duì)比,如果對(duì)比超過(guò)了5秒鐘,那說(shuō)明這個(gè)節(jié)點(diǎn)已經(jīng)損壞了主節(jié)點(diǎn)每隔一秒更新下時(shí)間戳,備節(jié)點(diǎn)每隔一秒去查詢下時(shí)間戳,當(dāng)主節(jié)點(diǎn)宕機(jī)時(shí),時(shí)間戳沒(méi)更新,備節(jié)點(diǎn)查詢超過(guò)5秒鐘沒(méi)有更新,意味著主節(jié)點(diǎn)已經(jīng)宕機(jī),備節(jié)點(diǎn)非常高興的把自己的節(jié)點(diǎn)信息寫(xiě)入,變成主節(jié)點(diǎn)
保證任何時(shí)候,集群中只有一個(gè)Master 存儲(chǔ)所有Region的尋址入口 實(shí)時(shí)監(jiān)控Region Server的狀態(tài),將Region
Server的上線和下線信息實(shí)時(shí)通知給Master 存儲(chǔ)HBase的Schema,包括有哪些Table,每個(gè)Table有哪些Column family
<>MemStore和StoreFile
MenStore相當(dāng)于緩存功能,數(shù)據(jù)會(huì)先寫(xiě)入MemStore,然后再寫(xiě)入StoreFile
當(dāng)MemStore大小達(dá)到某個(gè)值時(shí),會(huì)進(jìn)行刷盤操作,啟動(dòng)flashcache進(jìn)程,把MenStore數(shù)據(jù)生成StoreFile文件
HDFS也會(huì)有合并文件的操作,不適合存儲(chǔ)文件數(shù)量太多的文件,HDFS不適合文件隨機(jī)的修改和刪除,所有操作都是在文件的末尾做追加
HBase數(shù)據(jù)的修改和刪除是在數(shù)據(jù)合并時(shí),才會(huì)真正的做修改和刪除
<>4:HBase Write-Ahead_log(WAL)機(jī)制,容錯(cuò)與恢復(fù)
該機(jī)制用于數(shù)據(jù)的容錯(cuò)和恢復(fù)
每個(gè)HRegionServer中都有一個(gè)HLog對(duì)象,HLog是一個(gè)實(shí)現(xiàn)Write Ahead
log的類,在每次用戶操作寫(xiě)入MemStore的同時(shí),也會(huì)寫(xiě)一份數(shù)據(jù)到HLog文件中,HLog文件定期滾動(dòng)出新的,并刪除舊的文件,即已經(jīng)持久化到StoreFile中的數(shù)據(jù),當(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ù)
1.RegionServer故障,ZK感知到。 2.通知HMaster 3.HMstaer拆分Hlog,根據(jù)所屬region來(lái)拆分。
4.拆分后,存放到對(duì)應(yīng)的region的目錄里面去。 5.把故障的region分配到其他的RegionServer.
6.新的RegionServer加載故障的region,加載相應(yīng)的Hlog文件。
<>5:HBase的寫(xiě)流程
數(shù)據(jù)寫(xiě)請(qǐng)求首先發(fā)給client,client查詢?cè)摂?shù)據(jù)應(yīng)該往哪個(gè)地方存儲(chǔ),會(huì)去zookeeper查詢MetaRegion獲取現(xiàn)在要寫(xiě)入數(shù)據(jù)應(yīng)該在哪個(gè)Region里面,獲取到之后,再根據(jù)獲取額結(jié)果做個(gè)分組,發(fā)給各個(gè)RegionServer,數(shù)據(jù)并發(fā)寫(xiě)入,數(shù)據(jù)先寫(xiě)入MemStore,然后再寫(xiě)入HLog,寫(xiě)完后,HMaster也會(huì)做相應(yīng)的更新,然后才會(huì)返回寫(xiě)成功
當(dāng)MemStore達(dá)到一定值時(shí),也會(huì)做個(gè)刷盤操作,生成一個(gè)新的HFile文件,當(dāng)HFile文件變多之后,也會(huì)做個(gè)合并,數(shù)據(jù)最終存放在DataNode里面
1.客戶端發(fā)起寫(xiě)請(qǐng)求 2.客戶端會(huì)和ZK通訊,請(qǐng)求meta-region的路由信息。 3.得到ZK返回后,會(huì)和相應(yīng)的RegionServer通訊。
4.在相應(yīng)的meta-region表中讀到數(shù)據(jù)存放位置。 5.將數(shù)據(jù)根據(jù)regionserver和region進(jìn)行的分組打包 6.獲得region鎖機(jī)制
7.并行發(fā)送到各個(gè)RegionServer上。 8.數(shù)據(jù)寫(xiě)入相應(yīng)Store里面的MemStore,同時(shí)會(huì)在Hlog里面寫(xiě)一份。
9.RegionServer通知HMaster更新信息。 10.返回寫(xiě)成功。 PS:HBase,數(shù)據(jù)刪除,是在數(shù)據(jù)整合/合并的時(shí)候完成的。
數(shù)據(jù)越來(lái)越多,生成的StoreFile越來(lái)越大,數(shù)據(jù)合并;分裂成形成新的StoreFile;
數(shù)據(jù)持續(xù)增加,RegionServer會(huì)把Region分裂成兩個(gè)region,通知HMaster更新信息。
<>6:HBase的讀流程
客戶端發(fā)起請(qǐng)求,通過(guò)Zookeeper尋找到Meta表所在RegionServer,通過(guò)RowKey查找Meta表,獲取所要讀取的Region所在RegionServer,請(qǐng)求發(fā)送到該RegionServer,由其具體處理數(shù)據(jù)讀取
1.客戶端發(fā)起讀請(qǐng)求。 2.客戶端回合ZK通訊,請(qǐng)求ROOT表,讀元數(shù)據(jù)region的路由信息。
3.收到ZK返回之后,會(huì)和相應(yīng)的Regionserver.找到相應(yīng)的meta-region,獲取數(shù)據(jù)的位置 4.收到返回后,到數(shù)據(jù)所在的Region上讀取數(shù)據(jù)。
熱門工具 換一換
