在过去 X 小时内从 HBase 表中获取所有数据的最佳方法是啥?
Posted
技术标签:
【中文标题】在过去 X 小时内从 HBase 表中获取所有数据的最佳方法是啥?【英文标题】:What is the best way to get all data from an HBase table for the last X hours?在过去 X 小时内从 HBase 表中获取所有数据的最佳方法是什么? 【发布时间】:2018-09-14 18:40:36 【问题描述】:我有写入 HBase 的事件流。每个事件都有user_id
、event_timestamp
和description
。
假设我需要运行一个 ETL 作业,该作业从表中检索过去 12 小时内的所有数据。我想到了两种获取数据的方法(我正在使用 Java API):
-
使用
setTimeStamp
方法进行扫描。
使用event_timestamp
作为行键前缀,但据我了解这是不好的做法,因为它会导致热点。
有没有更好的解决方案?
【问题讨论】:
【参考方案1】:您的第一种方法:
使用
setTimeStamp
方法进行扫描。
听起来是个好主意。第二种方法是绝对正确的:
使用
event_timestamp
作为行键前缀,但据我了解这是不好的做法,因为它会导致热点。
会产生热点,所以不建议在HBase或Bigtable中使用。
一般来说,创建一个行键前缀单调递增(如时间、年月日等)或递减值(如INT_MAX
- 当前时间等)问题很大,因此不推荐。
您当然可以将时间派生值用作行键的后缀:这样做的原因是为了避免将任何单行增大到太大,因为行不会跨区域拆分,但保留为原子单位。
在这种情况下,您将有多种方式表达时间:
-
一次作为行键的后缀,将是粗粒度的,例如,
<unique-id>-yyyymmdd
第二次作为单元格值本身的时间戳,可以是:
绝对时间,或 相对于行的粗粒度时间后缀每种方法都有其优缺点,具体取决于您的查询模式和特定用例。如果您想在全局范围内查询特定时间范围内的数据,那么使用绝对时间似乎是最好的,因为您可以使用时间范围进行全局扫描,而无需创建复杂的行后缀过滤器。
【讨论】:
以上是关于在过去 X 小时内从 HBase 表中获取所有数据的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
在几秒钟内从 Spring MVC 中的表中获取 400K 数据