在过去 X 小时内从 HBase table 获取所有数据的最佳方法是什么?
What is the best way to get all data from an HBase table for the last X hours?
我有写入 HBase 的事件流。每个事件都有 user_id
、event_timestamp
和 description
.
假设我需要 运行 一个 ETL 作业,该作业从 table 中检索过去 12 小时的所有数据。我想了两种获取数据的方法(我用的是Java API):
- 要使用
setTimeStamp
扫描方法。
- 使用
event_timestamp
作为 rowkey 前缀,但根据我的理解,这是不好的做法,因为它会导致热点。
有更好的解决方案吗?
您的第一种方法:
- To use
setTimeStamp
method of Scan.
听起来不错。第二种方法绝对正确:
- 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
- 当前时间等)问题很大,因此不推荐。
您当然可以使用时间派生的值作为行键的 后缀 :您这样做的原因是为了避免将任何单行增长得太大,因为行不跨区域拆分,而是作为一个原子单元保存。
在这种情况下,您将有多种方式表达时间:
- 一次作为行键的后缀,这将是粗粒度的,例如,
<unique-id>-yyyymmdd
第二次作为单元格值本身的时间戳,可以是:
- 绝对时间,或
- 相对到行的粗粒度时间后缀
每种方法都各有利弊,具体取决于您的查询模式和具体用例。如果你想全局查询特定时间范围内的数据,那么使用绝对时间似乎是最好的,因为这样你就可以使用时间范围进行全局扫描,而无需创建复杂的行后缀过滤器,例如。
我有写入 HBase 的事件流。每个事件都有 user_id
、event_timestamp
和 description
.
假设我需要 运行 一个 ETL 作业,该作业从 table 中检索过去 12 小时的所有数据。我想了两种获取数据的方法(我用的是Java API):
- 要使用
setTimeStamp
扫描方法。 - 使用
event_timestamp
作为 rowkey 前缀,但根据我的理解,这是不好的做法,因为它会导致热点。
有更好的解决方案吗?
您的第一种方法:
- To use
setTimeStamp
method of Scan.
听起来不错。第二种方法绝对正确:
- 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
- 当前时间等)问题很大,因此不推荐。
您当然可以使用时间派生的值作为行键的 后缀 :您这样做的原因是为了避免将任何单行增长得太大,因为行不跨区域拆分,而是作为一个原子单元保存。
在这种情况下,您将有多种方式表达时间:
- 一次作为行键的后缀,这将是粗粒度的,例如,
<unique-id>-yyyymmdd
第二次作为单元格值本身的时间戳,可以是:
- 绝对时间,或
- 相对到行的粗粒度时间后缀
每种方法都各有利弊,具体取决于您的查询模式和具体用例。如果你想全局查询特定时间范围内的数据,那么使用绝对时间似乎是最好的,因为这样你就可以使用时间范围进行全局扫描,而无需创建复杂的行后缀过滤器,例如。