hbase的讀寫 儲存機制 合併

2021-09-29 09:06:29 字數 2622 閱讀 8411

client訪問zk,根據root表獲取meta表所在region的位置資訊,並將該位置資訊寫入client cache。

(注:為了加快資料訪問速度,我們將元資料、region位置等資訊快取在client cache中)。

client讀取meta表,再根據meta表中查詢得到的namespace、表名和rowkey等相關資訊,獲取將要寫入region的位置資訊(此過程即region三層定位,如下圖),最後client端會將meta表寫入client cache。

hbase使用memstore和storefile儲存對錶的更新,資料在更新時首先寫入hlog和memstore,memstore是排序的(字典序),hlog是按照寫入順序排列的

當memstore積累到一定的閾值時,就會建立乙個新的memstore,並將老的memstore加入flush佇列,由單獨的執行緒flush到磁碟上,成為乙個storefile

當伺服器宕機時memstore記憶體中的內容就沒了,這時可以通過回放wal日誌檔案(即hlog)恢復,回放的動作由hbase內部機制呼叫,不需要使用者呼叫。

storefile是唯讀的,一旦建立之後就不可修改,當乙個store的storefile達到一定的閥值後,就會進行一次合併操作,將對同乙個key的修改合併到一起,同時進行版本合併和資料刪除,形成乙個大的storefile。當storefile的大小達到一定的閥值後,又會對storefile進行切分操作,等分為兩個storefile。

hbase中只有增添資料,所有的更新和刪除操作都是在後續的合併中進行的,使得使用者的寫操作只要進入記憶體就可以立刻返回,實現了hbase的高速儲存。

hfile儲存在底層檔案系統,hbase是hadoop資料庫,所以會在分布式檔案系統hdfs上,hfile對應列族,乙個列族可以有多個hfile檔案,乙個hfile檔案是乙個列族中的內容。

專業一點的說:

(1) client通過zookeeper的排程,向regionserver發出寫資料請求,在region中寫資料。

(2) 資料被寫入region的memstore,直到memstore達到預設閾值。

(3) memstore中的資料被flush成乙個storefile。

(4) 隨著storefile檔案的不斷增多,當其數量增長到一定閾值後,觸發compact合併操作,將多個storefile合併成乙個storefile,同時進行版本合併和資料刪除。

(5) storefiles通過不斷的compact合併操作,逐步形成越來越大的storefile。

(6) 單個storefile大小超過一定閾值後,觸發split操作,把當前region split成2個新的region。父region會下線,新split出的2個子region會被hmaster分配到相應的regionserver上,使得原先1個region的壓力得以分流到2個region上。

(1) client訪問zookeeper,查詢-root-表,獲取.meta.表資訊。

(2) 從.meta.表查詢,獲取存放目標資料的region資訊,從而找到對應的regionserver。

(3) 通過regionserver獲取需要查詢的資料。

(4) regionserver的記憶體分為memstore和blockcache兩部分,memstore主要用於寫資料,blockcache主要用於讀資料。讀請求先到memstore中查資料,查不到就到blockcache中查,再查不到就會到storefile上讀,並把讀的結果放入blockcache。

每一次的插入操作都會先進入memstore(記憶體緩衝區),

當 memstore達到上限的時候,hbase會將記憶體中的資料輸出為有序的storefile檔案資料(根據rowkey、版本、列名排序,這裡已經和列簇無關了因為store裡都屬於同乙個列簇)。

這樣會在store中形成很多個小的hfile,當這些小的hfile數量達到乙個閥值的時 候,hbase會用乙個執行緒來把這些小hfile合併成乙個大的hfile。這樣,hbase就把效率低下的檔案中的插入、移動操作轉變成了單純的檔案輸出、 合併操作。

由上可知,在hbase底層的store資料結構中,

1) 每個hfile內的資料是有序的,

2) 但是hfile之間不一定是有序的,

3) store只 需要管理storefile的索引就可以了。

這裡也可以看出為什麼指定版本和rowkey可以加強查詢的效率,因為指定版本和rowkey的查詢可以利用 storefile的索引跳過一些肯定不包含目標資料的資料。

hbase合併:

刪除一條記錄,就會在該記錄上打上標記,被打上標記的記錄就成了墓碑記錄,該記錄使用get和scan查詢不到,會被過濾掉,但還是在hfile中。只有進行大合併的時候才會刪除hfile中的墓碑記錄。大合併:指定region的乙個列族的所有hfile.合併完成後,這個列族的所有hfile檔案合併成乙個hfile檔案,可以在shell中手動觸發,但該動作相當耗資源。小合併是將多個小的hfile檔案內容讀取出來合併生成乙個大的hfile,把新檔案設定成啟用狀態,然後刪除小的hfile

Hbase讀寫流程和定址機制

1 client通過 zookeeper 的排程,向 regionserver 發出寫資料請求,在 region 中寫資料。2 資料被寫入 region 的memstore 直到memstore 達到預設閾值。3 memstore中的資料被 flush 成乙個storefile 4 隨著 store...

Hbase的讀寫流程

步驟1 client通過zookeeper的排程,向hregionserver發出寫資料請求,在hregion中寫資料。步驟2 資料被寫入hregion的memstore,直到memstore達到預設閾值。步驟3 memstore中的資料被flush成乙個storefile。步驟4 隨著storef...

HBase的讀寫流程

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