在總結Spark讀寫HBase的同時,也順便學習了一下HBase的原理豺撑,同樣做個簡單的記錄作箍。事實上,相關的總結網(wǎng)上超級多前硫,寫的已經(jīng)很到位了胞得。本文一些內(nèi)容會直接摘取相關參考資料,對原文作者表示感謝屹电。
我自己覺得學習大數(shù)據(jù)原理時最麻煩的就是邏輯概念和物理概念的交叉混疊阶剑。每一套組件里都涉及到很多新的專有名詞,很容易就搞混弄亂危号。學習過程中最重要的還是集中注意力牧愁,參考多份資料,仔細反復閱讀外莲,效果會好些猪半。
1.HBase簡介
HBase是Hadoop生態(tài)圈中的非關系型數(shù)據(jù)庫兔朦,其最大的特點是面向列存儲、可以實現(xiàn)在超大規(guī)模數(shù)據(jù)集上的實時讀寫和隨機訪問磨确,可以說是對HDFS的有益補充沽甥。
傳統(tǒng)的行存儲是將完整的數(shù)據(jù)行存儲在磁盤中,查詢時會讀取該行的所有數(shù)據(jù)列乏奥。但有些應用場景摆舟,只需要一小部分數(shù)據(jù)列,這種方式就很浪費IO邓了。
列存儲就是將同一個數(shù)據(jù)列的各個值存放在一起恨诱,也就是說插入某行數(shù)據(jù)時,該行的各個數(shù)據(jù)列的值會存放到不同的地方骗炉。好處就是需要某幾列數(shù)據(jù)時照宝,可以很方便讀取。
2.HBase數(shù)據(jù)模型
HBase同數(shù)據(jù)庫一樣句葵,也是以表的形式存儲數(shù)據(jù)硫豆。表由行和列構成,若干列可以組成一個列族(Column family)笼呆。
2.1 HBase邏輯數(shù)據(jù)模型
基本概念:
- RowKey:每條記錄的“主鍵”
- Column Family:列族熊响,包含一個或者多個相關列,列族是表的Schema的一部分
- Column:屬于某一個columnfamily诗赌,即familyName:columnName汗茄,每條記錄在同一個列族中可以由不同的列組成
- Version Number:版本,類型為Long铭若,默認值是系統(tǒng)時間戳timestamp洪碳,也可由用戶自定義
- Value:值
2.2 HBase物理數(shù)據(jù)模型
- 對于任意值,都是按照<key, columnfamily, columnname, timestamp, value>這種多級索引結構存儲的
- 每個column family存儲在HDFS上的一個單獨文件中叼屠,空值不會被保存
- HBase中通過RowKey和Column確定的一個存儲單元稱為Cell瞳腌。每個Cell都保存著同一份數(shù)據(jù)的多個版本,默認情況下通過時間戳區(qū)分镜雨。
3.HBase體系架構
從架構上看嫂侍,HBase由client、Zookeeper荚坞、HMaster挑宠、HRegionServer、HRegion颓影、Store各淀、MemStore、StoreFile诡挂、HFile碎浇、HLog等構成临谱。
- client:訪問HBase的接口,可以是HBase Shell奴璃、HBase-Client API等
- Master:協(xié)調(diào)多個Region Server悉默,偵測各個RegionServer之間的狀態(tài),并平衡RegionServer之間的負載溺健,分配Region給RegionServer麦牺。
- zookeeper:維護HBase集群钮蛛,Master與RegionServers啟動時會向Zookeeper注冊鞭缭。集群內(nèi)可以有多個Master,但是ZK保證只有一個對外提供服務魏颓,其他做Stand by岭辣,出現(xiàn)宕機有相應的選舉機制選出新Master服務。
- Region Server:對于一個RegionServer而言甸饱,其包括了多個Region沦童。RegionServer的作用是維護Master分配給他的region,以及實現(xiàn)讀寫IO操作叹话。Client通過zookeeper尋址偷遗,最終也是直接連接RegionServer實現(xiàn)讀取數(shù)據(jù)。
- Region:table在行的方向上分隔為多個Region驼壶,不同的region可以分別在不同的Region Server上氏豌。隨著數(shù)據(jù)不斷插入表,region不斷增大热凹,當region的某個列族達到一個閾值時就會分成兩個新的region泵喘。
以上是宏觀上HBase的體系架構,下面就是更細節(jié)的信息般妙,主要是對Region的剖析纪铺。
- Store:每一個region由一個或多個store組成,一個store存放一個列族碟渺,如果有幾個ColumnFamily鲜锚,也就有幾個Store。一個Store由一個memStore和0或者 多個StoreFile組成苫拍。HBase以store的大小來判斷是否需要切分region烹棉。
- MemStore:存放在內(nèi)存中,保存修改的數(shù)據(jù)怯疤。當memStore的大小達到一個閥值(默認128MB)時浆洗,memStore會被flush到StoreFile。
- StoreFile:MemStore快照后存儲在StoreFile中集峦,其底層是以HFile的格式保存伏社。
- HFile:HFile是Hadoop的二進制格式文件抠刺,就是按照一定的結構存儲信息。HFile也是一個邏輯概念摘昌,最后落地是HDFS速妖。HFile的存儲格式有點像幀結構這種一大堆,就不展開了聪黎。
- HLog(WAL log):WAL意為write ahead log罕容,用來做災難恢復使用。每個RegionServer中都會有一個HLog的實例稿饰,會將RegionServer的所有更新操作記錄在HLog中锦秒,一旦regionServer宕機,就可以從log中進行恢復喉镰。HLog本身就是一個保障HA的機制旅择,跟Hadoop的NameNode中的Edits的作用一樣。
HBase基本體系架構就是這樣侣姆,從宏觀上理解:Client作為API接口生真,訪問HBase;Master是整個集群的大腦捺宗,負責維護RegionServer柱蟀;RegionServer管理若干個Region,并實現(xiàn)與Client的數(shù)據(jù)通信蚜厉;Region是邏輯上分布式存儲和負載均衡的最小單元长已;Zookeeper實現(xiàn)對集群的監(jiān)護和HA。
從微觀上理解Region弯囊,一個table會至少有一個Region痰哨,隨著數(shù)據(jù)量的增大,Region實現(xiàn)分裂匾嘱。Region內(nèi)部由多個Store構成斤斧,每個Store存儲一個列族。Store又由MemStore霎烙、StoreFile構成撬讽,MemStore內(nèi)存寫到一定程度后落磁盤到StoreFile。
4.Region尋址
HBase通過三級索引結果實現(xiàn)Region的尋址悬垃。我們逆序描述這個設計的思路游昼,HBase的所有數(shù)據(jù)Region元數(shù)據(jù)被存儲在.META.表中,但是隨著Region增多尝蠕,顯然.META.會越大越大烘豌,最終也會分裂成多個Region;-ROOT-表實現(xiàn)定位.META.表的Region的位置看彼,保存.META.表中所有Region的元數(shù)據(jù)廊佩。而且-ROOT-不會分裂囚聚,只有一個region。Zookeeper會記錄-ROOT-表的位置信息标锄。
我們在正序描述尋址過程顽铸,Client通過ZK找到-ROOT-表的位置,通過-ROOT-表查找到.META.的位置料皇,再從.META.查找用戶Region的位置谓松。可以實現(xiàn)最多三次跳轉就可以定位任意一個Region的效果践剂。為了加快訪問速度鬼譬,.META.表的所有Region全部保存在內(nèi)存中∠鲜郑客戶端會將查詢過的位置信息緩存起來拧簸,且緩存不會主動失效劲绪。
5.HBase讀寫過程
這部分直接拿來了參考文章的截圖男窟,寫的已經(jīng)很簡單清晰了。
5.1 讀過程
- Client訪問ZK贾富,通過-ROOT-和.META.表歉眷,查找到表的Region元數(shù)據(jù),并找到相應的RegionServer
- Client直接與RegionServer通信獲取數(shù)據(jù)
- Regionserver的內(nèi)存分為MemStore和BlockCache兩部分颤枪,MemStore主要用于寫數(shù)據(jù)汗捡,BlockCache主要用于讀數(shù)據(jù)。讀請求先到MemStore中查數(shù)據(jù)畏纲,查不到就到BlockCache中查扇住,再查不到就會到StoreFile上讀,并把讀的結果放入BlockCache
5.2 寫過程
- Client訪問ZK盗胀,通過-ROOT-和.META.表艘蹋,查找到表的Region元數(shù)據(jù),并找到相應的RegionServer
- 數(shù)據(jù)被寫入HLog和Region的MemStore中钱雷,當MemStore達到預設閾值后扳抽,F(xiàn)lush成一個StoreFile
- StoreFile文件的不斷增多漠其,當其數(shù)量增長到一定閾值后,觸發(fā)Compact合并操作浸策,將多個StoreFile合并成一個StoreFile,同時進行版本合并和數(shù)據(jù)刪除
- StoreFile的大小超過一定閾值后惹盼,會把當前的Region分割為兩個(Split)庸汗,并由Hmaster分配到相應的HRegionServer,實現(xiàn)負載均衡
6.HBase的HA
- Master的HA機制:Master為一主多備手报。當Master主節(jié)點宕機后蚯舱,剩下的備節(jié)點通過ZK選舉雕薪,產(chǎn)生新的主節(jié)點
- RegionServer容錯:當RegionServer損壞時,Master將該RegionServer上的Region重新分配到其他RegionServer上晓淀,失效服務器上“預寫”日志由主服務器進行分割并派送給新的RegionServer