寫在開頭
這是一次對自己之前看bigtable論文和hbase各種文章的筆記的總結(jié)
關(guān)于Hbase的架構(gòu)不會(huì)再多說闺属,網(wǎng)上有很多淑趾。
HBASE 寫流程
寫操作流程
(1) Client通過Zookeeper的調(diào)度藏斩,向RegionServer發(fā)出寫數(shù)據(jù)請求庶骄,在Region中寫數(shù)據(jù)黎烈。
? Client提交一個(gè)Put請求到RegionServer胡嘿,數(shù)據(jù)首先會(huì)寫到WAL中
? 當(dāng)數(shù)據(jù)寫到WAL之后,數(shù)據(jù)會(huì)寫到MemStore中停做,等待刷新到磁盤中
? 數(shù)據(jù)寫到MemStore完成之后晤愧,RS會(huì)給Client發(fā)送確認(rèn)信息
(2) 數(shù)據(jù)被寫入Region的MemStore,直到MemStore達(dá)到預(yù)設(shè)閾值蛉腌。
(3) MemStore中的數(shù)據(jù)被Flush成一個(gè)StoreFile官份。
(4) 隨著StoreFile文件的不斷增多,當(dāng)其數(shù)量增長到一定閾值后烙丛,觸發(fā)Compact合并操作舅巷,將多個(gè)StoreFile合并成一個(gè)StoreFile,同時(shí)進(jìn)行版本合并和數(shù)據(jù)刪除河咽。
(5) StoreFiles通過不斷的Compact合并操作钠右,逐步形成越來越大的StoreFile。
(6) 單個(gè)StoreFile大小超過一定閾值后忘蟹,觸發(fā)Split操作飒房,把當(dāng)前Region Split成2個(gè)新的Region搁凸。父Region會(huì)下線,新Split出的2個(gè)子Region會(huì)被HMaster分配到相應(yīng)的RegionServer上狠毯,使得原先1個(gè)Region的壓力得以分流到2個(gè)Region上护糖。
可以看出HBase只有增添數(shù)據(jù),所有的更新和刪除操作都是在后續(xù)的Compact歷程中舉行的嚼松,使得用戶的寫操作只要進(jìn)入內(nèi)存就可以立刻返回嫡良,實(shí)現(xiàn)了HBase I/O的高性能。
HBase 讀流程
讀操作流程
(1) Client訪問Zookeeper皆刺,查找-ROOT-表,獲取.META.表信息凌摄。
(2) 從.META.表查找羡蛾,獲取存放目標(biāo)數(shù)據(jù)的Region信息,從而找到對應(yīng)的RegionServer锨亏。
(3) 通過RegionServer獲取需要查找的數(shù)據(jù)痴怨。
(4) Regionserver的內(nèi)存分為MemStore和BlockCache兩部分,MemStore主要用于寫數(shù)據(jù)器予,BlockCache主要用于讀數(shù)據(jù)浪藻。讀請求先到MemStore中查數(shù)據(jù),查不到就到BlockCache中查乾翔,再查不到就會(huì)到StoreFile上讀爱葵,并把讀的結(jié)果放入BlockCache。
尋址過程:client–>Zookeeper–>-ROOT-表–>META表–>RegionServer–>Region–>client
pS HBase會(huì)使用BlockCache索引和bloom filters來加載那包含目標(biāo)row cells的HFile到內(nèi)存
關(guān)于Meta Table
可以看成普通的表
作用:用來存放所有的region信息反浓,查詢的時(shí)候通過meta table來找到一個(gè)給出的table key所在的Region
結(jié)構(gòu)
(默認(rèn)列簇為info)
Key
格式: ([table],[region start key],[region id])
Values
info:regioninfo(序列化HRgionInfo實(shí)例)
info:server (包含此Region的RegionServer的server:port)
info:serverstartcode(包含此Region的RegionServer的啟動(dòng)時(shí)間)
所有客戶端訪問用戶數(shù)據(jù)前萌丈,需要首先訪問Zookeeper獲得-ROOT-的位置,然后訪問-ROOT-表獲得.META.表的位置雷则,最后根據(jù).META.表中的信息確定用戶數(shù)據(jù)存放的位置
關(guān)于ROOT Table
HBase的用-ROOT-表來記錄.META.的Region信息辆雾,就和.META.記錄用戶表的Region信息一模一樣。-ROOT-只會(huì)有一個(gè)Region月劈。
這么一來Client端就需要先去訪問-ROOT-表度迂。所以需要知道管理-ROOT-表的RegionServer的地址。這個(gè)地址被存在ZooKeeper中猜揪。默認(rèn)的路徑是:
/hbase/root-region-server
HBase的所有Region元數(shù)據(jù)被存儲(chǔ)在.META.表中2.1惭墓,隨著Region的增多,.META.表中的數(shù)據(jù)也會(huì)增大而姐,并分裂成多個(gè)新的Region诅妹。為了定位.META.表中各個(gè)Region的位置,把.META.表中所有Region的元數(shù)據(jù)保存在-ROOT-表中,最后由Zookeeper記錄-ROOT-表的位置信息吭狡。
-ROOT-表永遠(yuǎn)不會(huì)被分割,它只有一個(gè)Region丈莺,這樣可以保證最多只需要三次跳轉(zhuǎn)就可以定位任意一個(gè)Region划煮。為了加快訪問速度,.META.表的所有Region全部保存在內(nèi)存中缔俄〕谇铮客戶端會(huì)將查詢過的位置信息緩存起來,且緩存不會(huì)主動(dòng)失效俐载。如果客戶端根據(jù)緩存信息還訪問不到數(shù)據(jù)蟹略,則詢問相關(guān).META.表的Region服務(wù)器,試圖獲取數(shù)據(jù)的位置遏佣,如果還是失敗挖炬,則詢問-ROOT-表相關(guān)的.META.表在哪里状婶。最后,如果前面的信息全部失效草姻,則通過ZooKeeper重新定位Region的信息撩独。所以如果客戶端上的緩存全部是失效综膀,則需要進(jìn)行6次網(wǎng)絡(luò)來回僧须,才能定位到正確的Region担平。