HBase Timestamp 與冪等性

HBase 的數據模型包括表(Table)、行(Row)、列族(Column Family)、列限定符(Column Qualifier)、單元格(Cells)、時間戳(Timestamp),其中單元格是行與列的交叉點,用來存儲數據值,而 timestamp 則是每個值的版本號標識。默認情況下,timestamp 的值是更新數據時的當前時間戳,由系統自動更新,並不太會被關注,但是在實際的項目中,如果能合理的使用 timestamp 卻能帶來巨大的作用。本文主要介紹利用 timestamp 來保證數據的冪等性更新實現。
在這裏插入圖片描述

一、冪等性更新

HBase 的更新或刪除不會去覆蓋一個值,它只會在後面追加寫,直到 major_compaction 時,纔會丟棄過期的數據。而判斷數據新舊的方式則主要是依賴於單元格中的 timestamp 的值,它的值越大則證明該單元格的值越新。如果表的版本號設置爲 1,在刪除過期數據時,在相同 rowkey、Family:Qualifier 下的單元格,僅會保留最新的單元格的值。
在這裏插入圖片描述
所以利用 timestamp 能很好的實現數據的冪等性更新,即不管寫入的先後順序是否符合預期,只要 timestamp 的值是固定的,那麼最終的結果也將是符合預期的。這在分佈式系統中十分有效,因爲這不僅不需要保證數據的更新順序,也讓多線程的數據更新變得簡單。
在這裏插入圖片描述

Java API

在 Java 中,可以通過調用以下 API 構建 Put 對象:

org.apache.hadoop.hbase.client.Put#addColumn(family, qualifier, ts, value)

爲了更新操作不會覆蓋刪除操作,可以通過以下 API 來構建 Delete 對象:

org.apache.hadoop.hbase.client.Delete#addColumns(family, qualifier, timestamp);

需要注意的是,這裏是addColumns而不是addColumn方法,addColumn方法只會刪除最近的版本。

二、Timestamp 與 TTL

Timestamp 不僅可以作爲版本標識,同樣的,它也是作爲數據是否超時的一個依據。如果你在表的屬性中設置了 TTL 的值,那麼數據是否超時的公式應該是這樣的:

isTimeout = (currentTimestamp - timestamp > TTL * 1000)

當數據超時後,你將無法直接獲取到這個值,並且它將最終會被刪除。 得知這個特點有助於我們在手動設置 timestamp 時做一些全面的分析,因爲不是所有的數據都能得到它的時間戳。比如最近在做 MSSQL 數據同步時,以 CT 方式監聽數據變更時,它是不帶時間的,僅有事務的更新版本(從 1 開始遞增的數字),如果以事務的版本號作爲 HBase 數據的 timestamp,那麼在遇到 TTL 時,可能會有明明寫入成功卻不能獲取到值的情形。所以在實際場景中,需要考慮這樣的情況。

以上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章