[Hbase]Hbase章2 Hbase读写过程解析
寫數(shù)據(jù)
Hbase使用memstore和storefile存儲對表的更新。數(shù)據(jù)在更新時首先寫入hlog和memstore,memstore中的數(shù)據(jù)是排序的,當memstore累計到一定的閥值時,就會創(chuàng)建一個新的memstore,并將老的memstore添加到flush隊列,由單獨的線程flush到磁盤上,成為一個filestore。與此同時,系統(tǒng)會在zookeeper中記錄一個checkpoint,表示這個時刻之前的數(shù)據(jù)變更已經(jīng)持久化了。當系統(tǒng)出現(xiàn)意外時,可能導(dǎo)致memstore中的數(shù)據(jù)丟失,此時使用hlog來恢復(fù)checkpoint之后的數(shù)據(jù)。
Storefile是只讀的,一旦創(chuàng)建之后就不可修改。因此hbase的更新就是不斷追加的操作。當一個store的storefile達到一定的閥值后,就會進行一次合并操作,將對同一個key的修改合并到一起,同時進行版本合并和數(shù)據(jù)刪除,形成一個大的storefile。當storefile的大小達到一定的閥值后,又會對storefile進行切分操作,等分為兩個storefile。
???????? Hbase中只有增添數(shù)據(jù),所有的更新和刪除操作都是在后續(xù)的合并中進行的,使得用戶的寫操作只要進入內(nèi)存就可以立刻返回,實現(xiàn)了hbase的高速存儲。
(1) Client通過Zookeeper的調(diào)度,向RegionServer發(fā)出寫數(shù)據(jù)請求,在Region中寫數(shù)據(jù)。
(2) 數(shù)據(jù)被寫入Region的MemStore,直到MemStore達到預(yù)設(shè)閾值。
(3) MemStore中的數(shù)據(jù)被Flush成一個StoreFile。
(4) 隨著StoreFile文件的不斷增多,當其數(shù)量增長到一定閾值后,觸發(fā)Compact合并操作,將多個StoreFile合并成一個StoreFile,同時進行版本合并和數(shù)據(jù)刪除。
(5) StoreFiles通過不斷的Compact合并操作,逐步形成越來越大的StoreFile。
(6) 單個StoreFile大小超過一定閾值后,觸發(fā)Split操作,把當前Region Split成2個新的Region。父Region會下線,新Split出的2個子Region會被HMaster分配到相應(yīng)的RegionServer上,使得原先1個Region的壓力得以分流到2個Region上。
讀操作
Hbase的所有region元數(shù)據(jù)被存儲在.META表中,隨著region的增多,.META表中的數(shù)據(jù)也會增大,并分裂成多個新的region。為了定位.META表中各個region的位置,把.META表中的所有region的元數(shù)據(jù)保存在-ROOT-表中,最后由zookeeper記錄-ROOT-表的位置信息。所有的客戶端訪問數(shù)據(jù)之前,需要首先訪問zookeeper獲取-ROOT-的位置,然后訪問-ROOT-表獲得.META表的位置,最后根據(jù).META表中的信息確定用戶數(shù)據(jù)存放的位置。
-ROOT-表永遠不會被分割,它只有一個region,這樣可以保證最多只需要三次跳轉(zhuǎn)就可以定位任意一個region。為了加快訪問速度,.META表的所有region全部保存在內(nèi)存中??蛻舳藭⒉樵冞^的位置信息緩存起來,且緩存不會主動失效。如果客戶端根據(jù)緩存信息還訪問不到數(shù)據(jù),則詢問相關(guān).META表的region服務(wù)器,試圖獲取數(shù)據(jù)的位置,如果還是失敗,則詢問-ROOT-表相關(guān)的.META表在哪里。最后,如果前面的信息全部失效,則通過zookeeper重新定位region的信息。所以如果客戶端上的緩存全部失效,則需要進行6次網(wǎng)絡(luò)來定位,才能定位到正確的region。
client-->Zookeeper-->-ROOT-表-->.META.表-->RegionServer-->Region-->client?
(1) Client訪問Zookeeper,查找-ROOT-表,獲取.META.表信息。
(2) 從.META.表查找,獲取存放目標數(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中查,再查不到就會到StoreFile上讀,并把讀的結(jié)果放入BlockCache。
?
后記:
高可用性
Write-Ahead-Log(WAL)保障數(shù)據(jù)高可用
我們理解下HLog的作用。HBase中的HLog機制是WAL的一種實現(xiàn),而WAL(一般翻譯為預(yù)寫日志)是事務(wù)機制中常見的一致性的實現(xiàn)方式。每個RegionServer中都會有一個HLog的實例,RegionServer會將更新操作(如 Put,Delete)先記錄到 WAL(也就是HLog)中,然后將其寫入到Store的MemStore,最終MemStore會將數(shù)據(jù)寫入到持久化的HFile中(MemStore 到達配置的內(nèi)存閥值)。這樣就保證了HBase的寫的可靠性。如果沒有 WAL,當RegionServer宕掉的時候,MemStore 還沒有寫入到HFile,或者StoreFile還沒有保存,數(shù)據(jù)就會丟失?;蛟S有的讀者會擔(dān)心HFile本身會不會丟失,這是由 HDFS 來保證的。在HDFS中的數(shù)據(jù)默認會有3份。因此這里并不考慮 HFile 本身的可靠性。
?
組件高可用
Master容錯:Zookeeper重新選擇一個新的Master。如果無Master過程中,數(shù)據(jù)讀取仍照常進行,但是,region切分、負載均衡等無法進行;
RegionServer容錯:定時向Zookeeper匯報心跳,如果一旦時間內(nèi)未出現(xiàn)心跳,Master將該RegionServer上的Region重新分配到其他RegionServer上,失效服務(wù)器上“預(yù)寫”日志由主服務(wù)器進行分割并派送給新的RegionServer;
Zookeeper容錯:Zookeeper是一個可靠地服務(wù),一般配置3或5個Zookeeper實例。
轉(zhuǎn)載于:https://www.cnblogs.com/szss/p/10007612.html
總結(jié)
以上是生活随笔為你收集整理的[Hbase]Hbase章2 Hbase读写过程解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: css: transform导致文字显示
- 下一篇: hihoCoder week17 最近公