HBase 海量數據高效入倉解決方案

作者:vivo 互聯網大數據團隊 - Tang Xicheng

一、方案背景

現階段部分業務數據存儲在 HBase 中,這部分數據體量較大,達到數十億。大數據需要增量同步這部分業務數據到數據倉庫中,進行離線分析,目前主要的同步方式是通過 HBase 的 hive 映射表來實現的。該種方式具有以下痛點:

基於以上背景,對 HBase 數據增量同步到數倉的場景,給出了通用的解決方案,解決了以上這些痛點。

二、方案簡述

2.1 數據入倉構建流程

圖片

2.2 HBase 數據入倉方案實驗對比

圖片

分別對以上三種實現方案進行合理性分析。

2.2.1 方案一

使用 HBase 的 hive 映射表。此種方案實現方式簡單,但是不符合數倉的實現機制,主要原因有:

所以此種方案在此實際應用場景中,是不應該採取的方案。

2.2.2 方案二

根據業務表中的時間戳字段,抓取增量數據。由於 HBase 是基於 rowKey 的 NoSQL 數據庫,所以會存在以下幾個問題:

所以此種方案存在一定的風險。

2.2.3 方案三

根據 HBase 的 timeRange 特性(HBase 寫入數據的時候會記錄時間戳,使用的是服務器時間),首先過濾出增量的 rowKey,然後根據這些 rowKey 去 HBase 查詢對應的數據。這種實現方案同時解決了方案一、方案二的問題。同時,能夠有效監控業務方對 HBase 表字段的新增情況,避免業務方未及時通知而導致的數據缺失問題,能夠最大限度的減少數據回溯的頻率。

綜上,採用方案三作爲實現 HBase 海量數據入倉的解決方案。

2.3 方案選擇及實現原理

基於 HBase 數據寫入時會更新 TimeRange 的特性,scan 的時候如果指定 TimeRange,那麼就不需要掃描全表,直接根據 TimeRange 獲取到對應的 rowKey,然後再根據 rowKey 去 get 出增量信息,能夠實現快速高效的獲取增量數據。

爲什麼 scan 之後還要再去 get 呢?主要是因爲通過 timeRanme 出來的數據,只包含這個時間範圍內更新的列,而無法查詢到這個 rowkey 對應的所有字段。比如一個 rowkey 有 name,age 兩個字段,在指定時間範圍內只更新了 age 字段,那麼在 scan 的時候,只能查詢出 age 字段,而無法查詢出 name 字段,所以要再 get 一次。同時,獲取增量數據對應的 columns,跟 hive 表的 meta 數據進行比對,對字段的變更進行及時預警,減少後續因少同步字段內容而導致全量初始化的情況發生。其實現的原理圖如下:

圖片

三、效果對比

運行時間對比如下(單位:秒):

圖片

四、總結與展望

數據倉庫的數據來源於各方業務系統,高效準確的將業務系統的數據同步到數倉,是數倉建設的根本。通過該解決方案,主要解決了數據同步過程中的幾大痛點問題,能夠較好的保證數據入倉的質量問題,爲後續的數倉建設打下一個較好的基礎。

另外,通過多次實驗對比,及對各種方案的可行性分析,將數據同步方案同步給一站式大數據開發平臺,推動大數據開發平臺支持基於 timeRange 的增量同步功能,實現此功能的平臺化、配置化,解決了 HBase 海量數據入倉的痛點。

同時,除了以上這幾種解決方案之外,還可以嘗試結合 Phoenix 使用二級索引,然後通過查詢 Phoenix 表的方式同步到數倉,這個將在後期進行性能測試。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/tqC4HCvxhVxOgujWdr1eXg