HBase 入門筆記 資料落地篇

2022-04-05 20:33:50 字數 2592 閱讀 4593

一、前言

關於資料落地方面,hbase官網也有相關介紹。本文主要介紹一下實際工作中涉及的資料儲存方面的一些經驗和技巧,主要涉及表rowkey設計、資料落地方案

二、表設計

相對於mysql等關係型資料庫而言,hbase也有相應的類似庫和表的概念,其中mysql的庫對應於hbase的namespace (0.95以上版本才支援), 表對應於hbase的表。對於namespace來說,hbase預設有兩類:default和hbase, default中存放的實際資料的表,hbase中存放的是系統內建表,如meta元資料表。

2.1 rowkey設計

hbase表在設計過程中,rowkey設計很關鍵,如果rowkey設計不好,可能會出現熱點、負載不均衡、資料冗餘等問題。常見的rowkey設計一般需要遵循幾個原則:

1) rowkey要惟一: 組成rowkey的字段需要全域性惟一,比如像支付訂單類的系統,一般存在交易單號,交易時間等,可以把這兩個字段組合成rowkey, 這樣在scan資料時還可以按單號還時間來批量掃瞄資料以提高效率

2) 避免熱點問題: 在考慮惟一性之後,還需要考慮熱點問題,hbase是分布式儲存系統,資料儲存時按region維度進行管理,region會分配到各regionserver上,如果rowkey設計不好,會存在同一型別的資料會集中在某幾個region上,導致資料寫入和訪問時出現熱點現象,像這類問題很容易導致regionserver宕機現象,影響集群穩定性。像我們生產環境的下rowkey設計,還會考慮乙個分桶規則,分桶的規則是比如將單號後三位作為分桶號,同時在建表時指定splits引數,預拆分表的region。

a. 建表時怎麼指定region數呢,如下建表語句,即指定表預先分配3個分桶,這樣以001,002,003結尾單號的資料會儲存到001,002,003分桶中,同時這些分桶會被隨機分配各到各台regionserver。

create 'test', 

b. rowkey設計形式類似於如下:分桶號#交易時間#交易單號    

000#2017-01-27 00:00:00#11111111000

3)業務需求:一般業務在查詢hbase資料時,會要求你的資料必須能實現多維度查詢和按時間段,使用者id進行批量提取資料等。對於多維度查詢方面,hbase因不支援二級索引,導致實現這類多維度查詢有很大難度,在我們集群中,用了乙個折中方案,就是將索引字段獨立出來建乙個單獨的索引表,索引表的key值 為索引欄位加時間組合成rowkey, 索引表的value值為資料表的rowkey值, 這樣通過索引欄位先掃瞄索引表,得到資料表的rowkey後,再掃主表,得到具體的交易資料。這樣就間接實現類似二級索引功能。具體設計如下:

索引表設計: 索引表的rowkey主要是將單號和交易時間組合,同時為避免單號存在熱點問題,將單號反轉後處理,如下面rowkey:

rowkey: 654321#2017-01-27 00:00:00

value: 456#2017-01-27 00:00:00#123456

2.2 表設計

hbase表在設計時,需要評估業務表資料量的大小,像我們的業務資料單錶可能日均資料量能達到20億級別,如果在設計時只設計單錶的話,那後續在資料維護、業務使用時將會碰到很大的麻煩,所以我們考慮的是將同一類業務表,設計成按月分表,設計成按月分表的話,對某個月的表的操作可以不影響其它月份的表,儘量減少受影響的資料範圍,同時操作月表,資料也易遷移,使集群受影響的程度儘量減少。上面介紹到分桶的概念,對於按月分的表,根據資料量的大小,預先規劃region的數量,會使資料盡量分布均衡。

create 'test', }, 

三、資料落地方案

hbase資料場景很多,業務產生的資料如何入到hbase呢,對於實時資料而言,一般會用到一些元件,如kafaka, storm, spark等, 通過採集agent將業務資料進行清洗,將資料規範成指定格式的訊息記錄,然後寫入到kafaka, 進行資料分發,再通過storm集群進行資料消費到hbase, 這種模式也是業界很常見的模式。對於我們的集群,由於業務資料過於龐大,業務對資料時效性也很高,所以資料一般先入mysql, 通過binlog採集解析入到訊息佇列再經過storm集群進行消費入hbase。這種架構的話,對於採集要求很高,不能有資料丟失,業界關於binlog實時採集國內比較有名的就是**的canal元件,該元件可以高效穩定採集業務db的資料,並實時記錄binlog採集位置,一旦採集agent機器故障,支援將任務切換到其它機器繼續採集,對於業務db如果出現故障,可以及時告警發現異常。經過canal清洗的資料進入到kafaka,kafaka的優點我就不介紹了,網上很多資料介紹,kafaka的資料再經過storm程式批量同步到hbase,實現實時資料入hbase這一方案。

因資料分析,業務查詢需要,需將儲存在mysql的歷史資料也同步到hbase,但因歷史資料已無binlog, 所以需要考慮其它方案將資料同步到hbase, 對於這種場景,一般是用bulkload將資料同步到hbase,我們也是用bulkload,因為原生的bulkload使用還是用些問題,無法適應業務資料表和索引表的匯入,所以自己部門專門定製了bulkload以適應我們的業務場景。

四、總結

本文簡單的介紹了一下hbase表設計相關的經驗和資料落地方面的經驗,很多經驗都是在踩過坑之後才有的優化,還是那句話,沒有問題就沒有進步,希望後面少踩些坑。

筆記 資料結構入門(二)

所用教材為 資料結構教程第4版 李春葆 主編 1 資料元素之間的關係有邏輯關係和物理關係,對應的運算有邏輯結構上的運算 抽象運算 和具體儲存結構上的運算 運算實現 演算法是具體儲存結構上實現某個抽象運算 2 確切地說,演算法是對特定問題的求解步驟的一種描述,它是指令的有限序列,其中每一條指令表示計算...

(三)Python入門筆記(資料型別)

一 內建資料型別 資料型別 資料型別 文字型別 str數值型別 int,float,complex 複數 序列型別 list,tuple,range 對映型別 dict 集合型別 set,frozenset 布林型別 bool 二進位制型別 bytes,bytearray,memoryview 二 ...

js入門筆記 陣列(6)

類似陣列的物件,其實就是它的key剛好是數值且有length屬性,如arguments 陣列的slice方法可以將 類似陣列的物件 變成真正的陣列。var arr array.prototype.slice.call arraylike 除了轉為真正的陣列,類似陣列的物件 還有乙個辦法可以使用陣列的...