天天看點

HBase Timestamp 與幂等性

HBase 的資料模型包括表(Table)、行(Row)、列族(Column Family)、列限定符(Column Qualifier)、單元格(Cells)、時間戳(Timestamp),其中單元格是行與列的交叉點,用來存儲資料值,而 timestamp 則是每個值的版本号辨別。預設情況下,timestamp 的值是更新資料時的目前時間戳,由系統自動更新,并不太會被關注,但是在實際的項目中,如果能合理的使用 timestamp 卻能帶來巨大的作用。本文主要介紹利用 timestamp 來保證資料的幂等性更新實作。

HBase Timestamp 與幂等性

一、幂等性更新

HBase 的更新或删除不會去覆寫一個值,它隻會在後面追加寫,直到 major_compaction 時,才會丢棄過期的資料。而判斷資料新舊的方式則主要是依賴于單元格中的 timestamp 的值,它的值越大則證明該單元格的值越新。如果表的版本号設定為 1,在删除過期資料時,在相同 rowkey、Family:Qualifier 下的單元格,僅會保留最新的單元格的值。

HBase Timestamp 與幂等性

是以利用 timestamp 能很好的實作資料的幂等性更新,即不管寫入的先後順序是否符合預期,隻要 timestamp 的值是固定的,那麼最終的結果也将是符合預期的。這在分布式系統中十分有效,因為這不僅不需要保證資料的更新順序,也讓多線程的資料更新變得簡單。

HBase Timestamp 與幂等性

Java API

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

為了更新操作不會覆寫删除操作,可以通過以下 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 時,可能會有明明寫入成功卻不能擷取到值的情形。是以在實際場景中,需要考慮這樣的情況。

以上。

繼續閱讀