在过去 X 小时内从 HBase table 获取所有数据的最佳方法是什么?

What is the best way to get all data from an HBase table for the last X hours?

我有写入 HBase 的事件流。每个事件都有 user_idevent_timestampdescription.

假设我需要 运行 一个 ETL 作业,该作业从 table 中检索过去 12 小时的所有数据。我想了两种获取数据的方法(我用的是Java API):

  1. 要使用 setTimeStamp 扫描方法。
  2. 使用 event_timestamp 作为 rowkey 前缀,但根据我的理解,这是不好的做法,因为它会导致热点。

有更好的解决方案吗?

您的第一种方法:

  1. To use setTimeStamp method of Scan.

听起来不错。第二种方法绝对正确:

  1. To use event_timestamp as the rowkey prefix, but from my understanding it's bad practice because it leads to hotspots.

会产生热点,不建议在HBase或Bigtable中使用。

一般情况下,创建行键prefix单调递增(如时间、年月日等)或递减值(如INT_MAX - 当前时间等)问题很大,因此不推荐。

您当然可以使用时间派生的值作为行键的 后缀 :您这样做的原因是为了避免将任何单行增长得太大,因为行不跨区域拆分,而是作为一个原子单元保存。

在这种情况下,您将有多种方式表达时间:

  1. 一次作为行键的后缀,这将是粗粒度的,例如,<unique-id>-yyyymmdd
  2. 第二次作为单元格值本身的时间戳,可以是:

    • 绝对时间,或
    • 相对到行的粗粒度时间后缀

每种方法都各有利弊,具体取决于您的查询模式和具体用例。如果你想全局查询特定时间范围内的数据,那么使用绝对时间似乎是最好的,因为这样你就可以使用时间范围进行全局扫描,而无需创建复杂的行后缀过滤器,例如。