HBase 原理 | 淺析 Region split 引入 HFileLink 優化子 Region 操作實現原理

語言: CN / TW / HK

Region Split 使用 HFileLink 代替 reference 生成子 Region,能優化子 Region 讀資料、二次分裂和 Compaction 操作,本文對該優化實現原理進行剖析 ,文章作者為中國移動雲能力中心大資料團隊軟體開發工程師李天梅。

一、Region Split

Region Split 介紹

HBase Region 執行分裂操作,在.split 資料夾下新建兩個子資料夾,稱之為 daughter A、daughter B,並在資料夾中生成 reference 檔案,分別指向父 Region 中對應檔案。reference 檔名形式:父 Region 對應 HFile.父 Region。reference 檔案是一個引用檔案,由兩部分構成:其一是分裂點 splitKey,其二是一個 boolean 型別的變數(true 或 false),true 表示該 regerence 檔案引用的是父檔案的上半部分(top),false 表示引用的是下半部分(bottom)。

父 Region 分裂為兩個子 Region 後,將 daughterA、daughterB 拷貝到根目錄下,形成兩個新的 Region;父 Region 通知修改 hbase.meta 表後下線,不再提供服務。下線後 parent region 在 meta 表中的資訊並不會馬上刪除,而是標註 split 列、offline 列為 true,並記錄兩個子 region;開啟 daughter A、daughter B 兩個子 region,通知修改 hbase.meta 表,正式對外提供服務。父 Region 與兩個子 Region 的組成如下:

存在 reference 的子 Region 操作問題

讀操作問題

HBase Region Split 過程中沒有涉及資料移動,分裂後的子 Region 檔案實際沒有任何資料,檔案中儲存的僅是一些元資料資訊。相較於父 Region 執行讀操作,子 Region 執行讀操作,增加了解析 reference 檔名定位引用 HFile 位置以及讀取 reference 檔案內容定位確定引用 HFile 範圍的操作,具體流程如下圖。新增的操作會影響讀操作的效能。

1. 根據 reference 檔名(region 名+真實檔名)定位到真實資料所在檔案路徑; 2. 根據 Reference 檔案內容中記錄的兩個重要欄位確定實際掃描範圍。top 欄位表示掃描範圍是 HFile 上半部分還是下半部分。如果 top 為 true,表示掃描的是上半部分,結合 splitkey 欄位可以明確掃描範圍為 [firstkey,splitkey) ;如果 top 為 false,表示掃描的是下半部分,結合 splitkey 欄位可以明確掃描範圍為 [splitkey,endkey)。

Compaction 問題

HBase Compaction 是從一個 region 的一個 Store 中選擇部分 HFile 檔案進行合併。合併原理是,先從這些待合併的資料檔案中依次讀出 KeyValue,再由小到大排序後寫入一個新檔案。

子 Region Compaction 相較於父 Region Compaction,同樣增加了 reference 名解析和 reference 內容讀取過程,增大 Region Compaction IO。子 Region Compaction 的檔案組成如下:

二次分裂問題

Region Split 分裂生成的子 Region 僅僅使用 Reference File 儲存元資料資訊,不包含任何資料。如果子 Region 沒有執行 Compaction 操作,則子 Region 目錄下是由 reference 檔案組成,對其執行二次分裂操作,實際是對 region 下的 reference 執行分裂操作,但是 reference 檔案是對 HFile 檔案的部分引用,不能進行分裂,所以存在 reference 檔案的子 Region 不能執行二次分裂操作。

二、HFileLink 介紹

HFileLink 是一個描述到另一個 Table/Region 的 HFile 的連結,這個連結是一個名稱形式為 table=region-info 的空檔案。HFile 的儲存位置是在 HBase Region 目錄或 HFile 的歸檔目錄 rootDir/.archive/下,HBase 通過 HFileLink 檔名解析連結的 HFile 所屬表、region 以及 HFile 名稱,從而定位連結的 HFile 位置。HFileLink 定位連結的 HFile 的流程如下:

三、Region split 使用 HFileLink 替換 reference

Region split 尋找到分裂點之後,開始執行真正的 region split 操作。在對 Region 下的每個 HFile 進行分裂過程中,判斷 HFile 中是否包含分裂點,如果包含分裂點,則生成兩個指向該 HFile 的 Reference File 檔案到子 Region 下,如果不包含分裂點,則生成一個連結該 HFile 的 HFileLink File 到子 Region 下。HFileLink 替換 reference 檔案生成的子 Region 組成如下:

四、存在 HFileLink 的子 Region 操作優化

HFileLink 連結的是整個 HFile 檔案,reference 引用的是 HFile 檔案的一部分。Region split 使用 HFileLink 代替 reference,能優化其生成的子 Region 的讀、二次分裂和 Compaction 操作。

讀操作優化

HBase Region 分裂沒有涉及到資料移動,子 Region 的檔案沒有任何使用者資料,執行讀操作,如果是 reference 檔案,則按照 1.2.1 節介紹方式讀取資料,如果是 HFileLink 檔案,僅僅通過 HFileLink 的檔名即可快速定位 HFile 所在位置,並執行讀操作,HFileLlink 定位 HFile 的流程如下:

Region split 使用 HFileLink 代替 reference,執行讀操作時,僅需要通過 HFileLink 檔名實現快速定位 HFile 位置,並執行讀操作,相比與從 reference 讀資料,省略了讀取檔案內容定位引用 HFile 的範圍,能提高子 Region 讀操作的效能。

Compaction 優化

使用 HFileLink 替換 reference 的 Region split 與 Stripe Compaction 結合,可以實現輕量級的 Compaction,能大大節省 Compaction IO。

Stripe Compaction 思想

Stripe store file engine 儲存檔案,Region 的 rowkey 的 rowkey 被切分形成 stripes,例如 [1FFF,2FFF),切分成 [1FFF,24FF),[24FF,2FFF) 兩個區間,每個區間成為 Stripe。Region 下的資料檔案分為 Level-0 和 Level-1 兩層。其中 Level-0 主要用來儲存臨時的資料檔案(例如使用 bulkload 或者執行 mem flush 操作之後的資料), Level-1 層的資料是按照 Stripe 的分割槽來區分。Compaction 是 Level-0 上升到 Level-1 的過程,同時,在 Level-1 層的資料,也會進行相關的合併。Region 形式如下:

輕量級 Compaction

Stripe store file engine 獲取 Region splitKey,傾向於返回 stripe 的 endRowKey,因此,執行 Region Split 操作,子 Region 的 Level-0 層的檔案由 reference 組成, Level-1 層檔案由 HFileLink 組成。執行 Compaction 操作,Level-0 層需要讀取 reference 檔案內容,確定讀取的 HFile 範圍,從 HFile 讀 Key-Value 寫入到新的 HFile,但是 Level-1 層僅需要移動 HFileLink 連結的 HFile 即可,不需要 Compaction IO,從而使 Compaction 變成輕量級操作。具體操作流程如下圖所示:

二次分裂優化

由於 HFileLink 連結的是整個 HFile,對其執行分裂操作,實際上是對整個 HFile 執行分裂操作,而 HFile 是可以執行分裂操作,故 HFileLink 檔案是可以執行分裂操作。子 Region 中如果只存在 HFile 和 HFileLink 檔案,是可以執行二次分裂操作。

五、總結

Region Split 使用 HFileLink 代替 reference,能優化子 Region 讀資料、分裂和壓縮操作,但是在具體應用之前,還需要對子 Region 操作優化的效能需要進一步測試。

參考連結:

Use HFileLink file to replace entire file‘s reference when splitting(https://issues.apache.org/jira/browse/HBASE-26421) Fast split regions and lightweight compaction with stripe store engine(https://issues.apache.org/jira/browse/HBASE-25302)


關於本週文章如果大家有疑問,或者有其他感興趣的大資料內容,歡迎大家在評論區留言,後續會持續分享大資料領域的乾貨知識。