HBase讀寫流程詳細解讀

2021-08-30 18:04:28 字數 3277 閱讀 8126

插入一條資料到某個表,因為hbase通過zookeeper協調

client 首先連線zookeeper,從zookeeper中獲取表region相關資訊。

根據要插入的rowkey,獲取指定的regionserver資訊,如果是批量提交的話,會把rowkey根據hregion location進行分組。

當得到了需要訪問的regionserver之後,client,會向對應的regionserver發起寫請求,並將對應的資料傳送到該regionserver檢查操作,看region是不是唯讀狀態,blockmemorysize大小限制等。

資料寫入流程,依次將資料寫入memorystore 和hlog,只有這兩個都寫入成功,此次寫入才算成功。

寫入memorystore 和hlog的過程比較複雜,需要獲取相關的鎖,而且寫入memorystore 和hlog是原子性的,要麼都成功,要麼都失敗。

當寫入memorystore的資料大小達到我們設定的閾值之後,會將memorystore flush 成 stroefile檔案,當storefile檔案增長到一定數量之後,會觸發 compact合併機制,將多個storefile 合併為乙個大的storefile檔案,如果region大到一定的閾值,會將region一分為二,hbase給兩個region分配相應的regionserver進行管理,從而分擔壓力。

regionserver處理資料的輸入輸出請求,regionserver管理多個region,region是資料儲存的基本單元。

乙個region只儲存乙個column family的資料,或者乙個column family的一部分。當region達到一定大小之後,會根據rowkey的排序,劃分多個region每乙個region又劃分多個store物件,每個store物件,包括乙個memorystore 和乙個到多個storefile,memorystore是資料在記憶體中的實體,並且是有序的。

當有資料寫入的時候,會先寫入memorystore,當memorystore達到一定大小的時候會flush到storefile,storefile是hfile的一層封裝,hfile儲存在hdfs上,所以儲存到hbase中的資料最終會儲存到hdfs。

那麼hbase怎麼保證記憶體中資料不會丟失,hlog 是wal的一種實現,預寫日誌。他是事務中常見的一種保證一致性實現方式,每乙個regionserver都有乙個hlog例項,每乙個hbase的更新操作,都會先寫入memorystore中,然後更新到hlog中,只有成功更新到hlog之後,這條資料才會更新成功。這樣,就算memorystore中資料丟失,也可以通過hlog恢復。 注意,一般的wal預寫日誌,是先寫入日誌,再寫入記憶體的,而hbase是先寫入記憶體,後寫入日誌,依託mvcc模式,確保資料不會丟失。

rowkey讀取為例,跟寫流程一樣,先跟zookeeper簡歷連線,通過訪問meta regionserver節點資訊,hbase的meta表快取到本地,獲取要訪問的表的region的資訊。

當client知道要訪問的表在哪個regionserver之後,client就對那個regionserver 發起讀請求。

regionserver接收該讀請求之後,經過複雜的處理之後,就將結果返回給客戶端。

(regionserver先掃瞄自己的memorystore,如果沒有找到,就會掃瞄blockcache加速讀內容的緩衝區,如果還沒有找到,就會到storefile中查詢這條資料,然後將這條資料返回給client

)通過對讀寫流程的描述,發現client對hbase讀寫請求,跟hmaster沒有任何關係,客戶端只需要知道zookeeper的位址即可。

為什麼client只需要知道zookeeper位址就可以了呢?

hmaster啟動的時候,會把meta資訊表載入到zookeeper。

meta資訊表儲存了hbase所有的表,所有的region的詳細的資訊,比如region開始的key,結束的key,所在regionserver的位址。meta資訊表就相當於乙個目錄,通過它,可以快速定位到資料的實際位置,所以讀寫資料,只需要跟zookeeper對應的regionserver進行互動就可以了。hmaster只需要儲存region和表的元資料資訊,協調各個regionserver,所以他的負載就小了很多。

hbase三大模組如何一起協作的。(hmaster,regionserver,zookeeper)

通過三個問題解釋

1.當hbase啟動的時候發生了什麼?

hmaster啟動的時候會連線zookeeper,將自己註冊到zookeeper,首先將自己註冊到backup master上,因為可能會有很多的節點搶占master,最終的active master要看他們搶占鎖的速度。

將會把自己從backup master刪除,成為active master之後,才會去例項化一些類,比如master filesytem,table state manager

當乙個節點成為active master之後,他就會等待regionserver匯報。

首先regionserver註冊zookeeper,之後向hmaster匯報。hmaster現在手裡就有乙份關於regionserver狀態的清單,對各個regionserver(包括失效的)的資料進行整理,

最後hmaster整理出了一張meta表,這張表中記錄了,所有表相關的region,還有各個regionserver到底負責哪些資料等等。然後將這張表,交給zookeeper。

之後的讀寫請求,都只需要經過zookeeper就行了。

backup master 會定期同步 active master資訊,保證資訊是最新的。

2.如果regionserver失效了,會發生什麼?

如果某乙個regionserver掛了,hmaster會把該regionserver刪除,之後將regionserver儲存的資料,分配給其他的regionserver,將更新之後meta表,交給zookeeper

所以當某乙個regionserver失效了,並不會對系統穩定性產生任何影響。

3.當hmaster失效後會發生什麼?

如果active 的hmaster出現故障

處於backup狀態的其他hmaster節點會推選出乙個轉為active狀態。

當之前出現故障的hmaster從故障中恢復,他也只能成為backup hmaster,等待當前active hmaster失效了,他才有機會重新成為active hmaster

對於ha高可用集群,當active狀態的hmaster失效,會有處於backup 的hmaster可以頂上去,集群可以繼續正常執行。

如果沒有配置ha,那麼對於客戶端的新建表,修改表結構等需求,因為新建表,修改表結構,需要hmaster來執行,會涉及meta表更新。那麼 會丟擲乙個hmaster 不可用的異常,但是不會影響客戶端正常的讀寫資料請求。

HDFS讀寫流程詳細解讀

在這裡插入描述 讀取檔案過程簡述 1 客戶端向namenode發起讀資料請求 2 namenode響應請求並告訴客戶端要讀的檔案的資料塊位置 存在哪個datanode上 3 客戶端到對應datanode讀取資料,當資料讀取到達末端,關閉與這個datanode的連線,並查詢下乙個資料塊,直到檔案資料全...

HBase 讀寫流程

1.讀流程 client先訪問zookeeper,從meta表讀取region的位置,然後讀取meta表中的資料。meta中又儲存了使用者表的region資訊 根據namespace 表名和rowkey在meta表中找到對應的region資訊 找到這個region對應的regionserver 查詢...

HBase讀寫流程

1 client先訪問zookeeper,從meta表讀取region的位置,然後讀取meta表中的資料。meta中又儲存了使用者表的region資訊 2 根據namespace 表名和rowkey在meta表中找到對應的region資訊 3 找到這個region對應的regionserver 4 ...