天天看點

大資料技術-HBase:HBase寫入路徑

HBase資料是最終存放到hdfs上的,而我們知道hdfs是不支援随機寫,隻能提供append的形式追加,然後一旦寫入後是不可變的。那麼HBase是如何提供所謂的低延時寫入和讀取?下面我們就分析下其中的奧秘。

寫路徑就是指HBase怎樣完成put和delete操作的。該路徑開始于用戶端,然後到regionserver,最後被寫入到一個叫做HFile的資料檔案中。其中還包括了HBase為了防止資料丢失寫路徑的優化設計。是以,了解寫路徑對于HBase的可能資料出現丢失情況會有一個更加深入的了解。

每個HBase表被托管到一系列伺服器上面,主要分為以下三類:

1、一個active狀态的master server;

2、一個或多個backup severs;

3、多個regionserver。

regionserver用于托管HBase的表。因為HBase表可能特别大,會被分為多個部分,叫做多個region。每個regionserver上具有一個或多個regions。由于regionsever才處理regions,是以如果master server崩潰了卻不會引起資料丢失或不可用。

由于rowkey是排序的,很容易确認哪個regionserver管理哪個key。每個更改請求都會指定一個具體的row。每個rowkey屬于一個特定regionserver上的region。用戶端會首先定位到哪個regionserver, 然後本地緩存這部分location資料,失效的情況會更新。

當一個請求被特定的regionserver收到後,改變不會馬上被寫入HFile的,因為資料寫入HFile是必須是排序好的rowkey,這樣當讀資料的适合可以允許随機的row高效率搜尋。資料不能被随機插入HFile。如果每個更新都寫入一個新的檔案,許多小檔案将會被建立。這種方案是非常不好的,不具有可擴充性去合并和讀。因為更新不能立即寫入新的HFile。

實際上,HBase是用一個叫做memstore的記憶體區塊存儲這些更新,這個可以高效處理随機寫入操作。memstore裡面的資料是被排序好的。當memstore所占的空間達到一定大小後,将會被寫入到新的HFile。

大資料技術-HBase:HBase寫入路徑

盡管資料先寫入memstore是比較高效的,但是引入了資料丢失風險。一旦系統或者regionserver異常退出,所有的memstore中資料将會丢失。為了應對這個問題,HBase提供了一中叫做預寫式日志(WAL)的機制。它是在寫入memstore之前,首先将更新寫入WAL,如果regionserver崩潰,将可以依賴于WAL裡面的記錄資訊重新建構資料。

WAL檔案中的資料組織形式有别于HFile的資料結構。WAL 檔案包括一系列edits,一個edit代表當個put或者delete,包括屬于哪個region的更新。更新資料是append的形式到WAL的。

WAL也會定期輪轉,一旦輪轉後,原來的表将不會做任何改動了。預設是WAL檔案的大小達到HDFS的block大小的95%時候,将會輪轉。參數hbase.regionserver.logroll.multiplier乘上block的大小hbase.regionserver.hlog.blocksize。同時也會定期進行輪轉,受hbase.regionserver.logroll.period的影響,預設是1個小時,及時這時大小還比較小,都可能輪轉。

控制一定大小的WAL有利于在做replay的時候更為高效。一旦replay完成,WAL将會被歸檔起來,然後由一個叫做LogCleaner的背景線程去做删除。一個regionserver共享一個WAL檔案。一個确定時間對于某個regionserver隻可能存在一個active的WAL。

每個edit和它對于的sequence id是唯一的。當memstore被重新整理到磁盤,最後的sequence id将會被清除。記憶體裡面會記錄每個WAL 檔案的最大sequence id及對應的檔案名,這樣便于跟蹤哪些WAL可以被歸檔了。WAL 檔案輪轉和memstore flush是兩個獨立的動作,不會同時發生。但是我們不需要保留很多WAL檔案,以避免耗時的恢複過程。是以當WAL檔案輪轉後,HBase會檢查是否有過多的WAL檔案,然後決定是否需要強制将memstore重新整理到磁盤,這樣可以将某些WAL檔案歸檔。

可以使用$HBASE_HOME/bin/hbase hlog 工具檢視WAL檔案内容:

usage: HLog <filename...> [-h] [-j] [-p] [-r <arg>] [-s <arg>] [-w <arg>]

 -h,--help             Output help message

 -j,--json             Output JSON

 -p,--printvals        Print values

 -r,--region <arg>     Region to filter by. Pass region name; e.g.

                       'hbase:meta,,1'

 -s,--sequence <arg>   Sequence to filter by. Pass sequence number.

 -w,--row <arg>        Row to filter by. Pass row name.

繼續閱讀