簡介
HBase是一個(gè)開源的非關(guān)系型分布式數(shù)據(jù)庫(NoSQL),它參考了谷歌的BigTable建模,實(shí)現(xiàn)的編程語言為Java。它是Apache軟件基金會(huì)Hadoop項(xiàng)目的一部分,運(yùn)行于HDFS文件系統(tǒng)之上,為Hadoop提供類似于BigTable規(guī)模的服務(wù)。HBase在列上實(shí)現(xiàn)了BigTable論文提到的壓縮算法、內(nèi)存操作和布隆過濾器。HBase的表能夠作為MapReduce任務(wù)的輸入和輸出,可以通過Java API來存取數(shù)據(jù),也可以通過REST、Avro或者Thrift的API來訪問。HBase雖然性能有顯著的提升,但還不能直接取代SQL數(shù)據(jù)庫?,F(xiàn)今它已經(jīng)應(yīng)用于多個(gè)數(shù)據(jù)驅(qū)動(dòng)型網(wǎng)站。
本文從架構(gòu)方面探討hbase的主要設(shè)計(jì),從而在需要hbase的場(chǎng)合能夠更好的設(shè)計(jì)和判斷。
首先,先來看看hbase的整體架構(gòu)。除了DFS組件,hbase的基本組件圖實(shí)際上就是Zookeeper,HMaster,RegionServer。
其中,RegionServer作為數(shù)據(jù)的實(shí)際存取服務(wù)器,主要負(fù)責(zé)數(shù)據(jù)的最終存取,一般情況都是多臺(tái);
RegionServer根據(jù)不同的row key劃分為許多region,每個(gè)region按順序存放從startKey到endKey的數(shù)據(jù)。每個(gè)RegionServer有下面這些組件:
一個(gè)WAL: write ahead log. 聽名知其意,該文件是落庫前先寫的日志文件,它最主要的作用是恢復(fù)數(shù)據(jù)用,類似于mysql的binlog。保存在HDFS中。
一個(gè)BlockCache: regionServer的讀緩存。保存使用最頻繁的數(shù)據(jù),使用LRU算法換出不需要的數(shù)據(jù)。
多個(gè)Region: 每個(gè)region包含多個(gè)store,每個(gè)CF擁有一個(gè)store
store: 每個(gè)store包含多個(gè)storeFile和一個(gè)memstore
Memstore: region的寫緩存。保存還未寫入HFile的數(shù)據(jù),寫入數(shù)據(jù)前會(huì)先做排序,每個(gè)region每個(gè)CF都會(huì)擁有一個(gè)Memstore,這就是為什么CF不能建太多的原因。
storeFile: 真正存儲(chǔ)keyvalue數(shù)據(jù)的文件,其保存的文件是排序過的。一個(gè)storeFile對(duì)應(yīng)一個(gè)HFile。保存在HDFS中
HFile分為數(shù)據(jù)塊,索引塊,bloom過濾器以及trailer。
Trailer主要記錄了HFile的基本信息,各個(gè)部分的偏移和地址信息。
Data block主要存儲(chǔ)用戶的key-value數(shù)據(jù)
Bloom filter主要用來快速定位文件是否不在數(shù)據(jù)塊。
比較容易混淆的是zookeeper和hmaster。
Zookeeper負(fù)責(zé)保持多臺(tái)Hmaster中只有一臺(tái)是活躍的;存儲(chǔ)Hbase的schema,table,CF等元信息;存儲(chǔ)所有的region入口;監(jiān)控regionServer的狀態(tài),并將該信息通知hmaster。可以看出來,zookeeper幾乎是負(fù)責(zé)整個(gè)集群的關(guān)鍵信息存取以及關(guān)鍵狀態(tài)監(jiān)控。如果zookeeper掛了,那么整個(gè)hbase集群幾乎就是不可用的狀態(tài)。
Hmaster則是負(fù)責(zé)對(duì)table元數(shù)據(jù)的管理;對(duì)HRegion的負(fù)載均衡,調(diào)整HRegion的布局,比如分裂和合并;包括恢復(fù)數(shù)據(jù)的遷移等。Hmaster相當(dāng)于對(duì)RegionServer的后臺(tái)管理,對(duì)于一些定制的管理行為,zookeeper不可能幫你完成,于是乎才有了hmaster。如果hmaster掛了,除了不能對(duì)table進(jìn)行管理配置,不能擴(kuò)展region,并不會(huì)影響整體服務(wù)的可用性。
接下來我們來關(guān)注一些關(guān)鍵流程。
客戶端首次讀寫的流程:
1. 客戶端首先從zookeeper中得到META table的位置,根據(jù)META table的存儲(chǔ)位置得到具體的RegionServer是哪臺(tái)
2. 詢問具體的RegionServer
寫流程:
1. 首先寫入WAL日志,以防crash。
2. 緊接著寫入Memstore,即寫緩存。由于是內(nèi)存寫入,速度較快。
3. 立馬返回客戶端表示寫入完畢。
4. 當(dāng)Memstore滿時(shí),從Memstore刷新到HFile,磁盤的順序?qū)懰俣确浅??,并記錄下最后一次最高的sequence號(hào)。這樣系統(tǒng)能知道哪些記錄已經(jīng)持久化,哪些沒有。
讀流程:
1. 首先到讀緩存BlockCache中查找可能被緩存的數(shù)據(jù)
2. 如果未找到,到寫緩存查找已提交但是未落HFile的數(shù)據(jù)
3. 如果還未找到, 到HFile中繼續(xù)查找數(shù)據(jù)
數(shù)據(jù)緊湊:
數(shù)據(jù)從memStore刷新到HFile時(shí),為了保持簡單,都是每個(gè)memStore放一個(gè)HFile,這會(huì)帶來大量小HFile文件,使得查詢時(shí)效率相對(duì)較低,于是,采用數(shù)據(jù)緊湊的方式將多個(gè)小文件壓縮為幾個(gè)大文件。其中,minor compaction是自動(dòng)將相關(guān)的小文件做一些適當(dāng)?shù)木o湊,但不徹底;而major compaction則是放在午夜跑的定時(shí)任務(wù),將文件做最大化的緊湊。
數(shù)據(jù)恢復(fù)流程:
當(dāng)RegionServer掛了,zookeeper很快就能檢測(cè)到,于是將其下的region狀態(tài)設(shè)置為不可用。Hmaster隨即開始恢復(fù)的流程。
1. HFile本身有2個(gè)備份,而且有專門的HDFS來管理其下的文件。因此對(duì)HFile來說并不需要恢復(fù)。
2. Hmaster重置region到新的regionServer
3. 之前在MemStore中丟失的數(shù)據(jù),通過WAL分裂先將WAL按照region切分。切分的原因是WAL并不區(qū)分region,而是所有region的log都寫入同一個(gè)WAL。
4. 根據(jù)WAL回放并恢復(fù)數(shù)據(jù)?;胤诺倪^程實(shí)際上先進(jìn)MemStore,再flush到HFile
最后,小編還整理了更多大牛的教學(xué)視頻,和學(xué)習(xí)資料
關(guān)注 轉(zhuǎn)發(fā)文章;++我威信 bmaaa01,獲取。