簡介
HBase是一個(gè)開源的非關(guān)系型分布式數(shù)據(jù)庫(NoSQL),它參考了谷歌的BigTable建模,實(shí)現(xiàn)的編程語言為Java涣脚。它是Apache軟件基金會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ù)庫。現(xiàn)今它已經(jīng)應(yīng)用于多個(gè)數(shù)據(jù)驅(qū)動型網(wǎng)站造成。
本文從架構(gòu)方面探討hbase的主要設(shè)計(jì)显熏,從而在需要hbase的場合能夠更好的設(shè)計(jì)和判斷。
首先晒屎,先來看看hbase的整體架構(gòu)喘蟆。除了DFS組件,hbase的基本組件圖實(shí)際上就是Zookeeper鼓鲁,HMaster蕴轨,RegionServer。
其中骇吭,RegionServer作為數(shù)據(jù)的實(shí)際存取服務(wù)器橙弱,主要負(fù)責(zé)數(shù)據(jù)的最終存取,一般情況都是多臺燥狰;
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ù)前會先做排序,每個(gè)region每個(gè)CF都會擁有一個(gè)Memstore僧诚,這就是為什么CF不能建太多的原因遮婶。
storeFile: 真正存儲keyvalue數(shù)據(jù)的文件,其保存的文件是排序過的湖笨。一個(gè)storeFile對應(yīng)一個(gè)HFile旗扑。保存在HDFS中
HFile分為數(shù)據(jù)塊,索引塊慈省,bloom過濾器以及trailer臀防。
Trailer主要記錄了HFile的基本信息,各個(gè)部分的偏移和地址信息。
Data block主要存儲用戶的key-value數(shù)據(jù)
Bloom filter主要用來快速定位文件是否不在數(shù)據(jù)塊袱衷。
比較容易混淆的是zookeeper和hmaster捎废。
Zookeeper負(fù)責(zé)保持多臺Hmaster中只有一臺是活躍的;存儲Hbase的schema致燥,table登疗,CF等元信息;存儲所有的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é)對table元數(shù)據(jù)的管理猜年;對HRegion的負(fù)載均衡抡锈,調(diào)整HRegion的布局,比如分裂和合并乔外;包括恢復(fù)數(shù)據(jù)的遷移等床三。Hmaster相當(dāng)于對RegionServer的后臺管理,對于一些定制的管理行為杨幼,zookeeper不可能幫你完成撇簿,于是乎才有了hmaster。如果hmaster掛了差购,除了不能對table進(jìn)行管理配置四瘫,不能擴(kuò)展region,并不會影響整體服務(wù)的可用性欲逃。
接下來我們來關(guān)注一些關(guān)鍵流程找蜜。
客戶端首次讀寫的流程:
1. 客戶端首先從zookeeper中得到META table的位置,根據(jù)META table的存儲位置得到具體的RegionServer是哪臺
2. 詢問具體的RegionServer
寫流程:
1. 首先寫入WAL日志稳析,以防crash洗做。
2. 緊接著寫入Memstore,即寫緩存彰居。由于是內(nèi)存寫入诚纸,速度較快。
3. 立馬返回客戶端表示寫入完畢裕菠。
4. 當(dāng)Memstore滿時(shí)咬清,從Memstore刷新到HFile,磁盤的順序?qū)懰俣确浅?炀缮眨⒂涗浵伦詈笠淮巫罡叩膕equence號影钉。這樣系統(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,這會帶來大量小HFile文件匾鸥,使得查詢時(shí)效率相對較低蜡塌,于是,采用數(shù)據(jù)緊湊的方式將多個(gè)小文件壓縮為幾個(gè)大文件勿负。其中馏艾,minor compaction是自動將相關(guān)的小文件做一些適當(dāng)?shù)木o湊,但不徹底奴愉;而major compaction則是放在午夜跑的定時(shí)任務(wù)琅摩,將文件做最大化的緊湊。
數(shù)據(jù)恢復(fù)流程:
當(dāng)RegionServer掛了锭硼,zookeeper很快就能檢測到房资,于是將其下的region狀態(tài)設(shè)置為不可用。Hmaster隨即開始恢復(fù)的流程檀头。
1. HFile本身有2個(gè)備份轰异,而且有專門的HDFS來管理其下的文件。因此對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,獲取容为。