全部產品
Search
文件中心

ApsaraDB for HBase:注意事項

更新時間:Jul 06, 2024

當HBase表配置Search索引後,帶時間戳記的寫入將會被禁止掉(非索引列不會禁止帶時間戳記寫入),會拋出User defined timestamp is not allowed when external index is enabled...的Exception。

  • 預設不支援自訂時間戳記寫入。
  • 不支援多版本。
  • 有限支援表TTL。

1. 自訂時間戳記

  1. 使用的情境一定要帶入時間戳記;
  2. 寫入HBase的資料是通過BDS同步過來(如主備同步,RDS的增量匯入等),BDS有可能會加上寫入時間戳記。

可以通過使用HBaseue Shell訪問增強版叢集修改表的Mutability屬性為MUTABLE_ALL來開啟對自訂時間戳記的支援。開啟時間戳記支援會有一些效能損耗,但通常不會非常明顯。

# 開啟時間戳記支援
hbase(main):002:0> alter 'testTable', MUTABILITY=> 'MUTABLE_ALL'
# 關閉時間戳記支援
hbase(main):002:0> alter 'testTable', MUTABILITY=> 'MUTABLE_LATEST'

2. 多版本

當HBase表配置Search索引後,如果資料表有多版本,會導致HBase與Search執行個體的資料不一致。需要通過使用HBaseue Shell訪問增強版叢集顯示的將HBase表版本修改為1。另外,也不再支援刪除指定的某個版本,這種刪除行為將會被禁止。舉例來說

    //如果構造的Delete對象不加任何Family和Qualifier,則代表刪除整行 --支援
    Delete delete = new Delete(Bytes.toBytes("row"));
    //刪除f:q1這一列 --支援
    delete.addColumns(Bytes.toBytes("f"), Bytes.toBytes("q1"));
    //刪除時間戳記在ts1和ts1之前的所有資料  -- 開自訂時間戳記(MUTABLE_ALL)後支援
    delete.addColumns(Bytes.toBytes("f"), Bytes.toBytes("q1"), ts1);
    //刪除f這個family裡所有的列 --支援
    delete.addFamily(Bytes.toBytes("f"));
    //刪除f這個family裡時間戳記在ts1和ts1之前的所有列資料 -- 開自訂時間戳記(MUTABLE_ALL)後支援
    delete.addFamily(Bytes.toBytes("f"), ts1);
    //刪除f:q1這一列的最新版本  --不支援
    delete.addColumn(Bytes.toBytes("f"), Bytes.toBytes("q1"));
    //刪除f:q1這一列中時間戳記(版本)為ts1的資料  --不支援
    delete.addColumn(Bytes.toBytes("f"), Bytes.toBytes("q1"), ts1);

注意: 為了防止資料不一致,在HBase中執行刪除某一行後,Search中對應的Document不會刪除,而是會刪除這個Document中除了id這個field(Rowkey映射)以外的其他所有field。一般情況下,使用者都是帶一定條件去查詢Search,不會命中這種只有id的行。但如果查詢到只有id的行,代表此行已經刪除,使用者需要自行過濾。我們後續將考慮使用Search的TTL功能在一定時間後自動刪除這些行。

3. TTL

HBase和Search都支援資料TTL到期,但是HBase的TTL機制與Search的TTL機制不一樣,HBase是單個KV到期,而Search中只能按照Document(對應HBase的一行)到期,而且到期的時間不會完全一致。如果業務中需要支援TTL,可以單獨聯絡雲HBase答疑或提工單。