在过去 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_idevent_timestampdescription

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

    使用setTimeStamp 方法进行扫描。 使用event_timestamp 作为行键前缀,但据我了解这是不好的做法,因为它会导致热点。

有没有更好的解决方案?

【问题讨论】:

【参考方案1】:

您的第一种方法:

    使用setTimeStamp 方法进行扫描。

听起来是个好主意。第二种方法是绝对正确的:

    使用event_timestamp 作为行键前缀,但据我了解这是不好的做法,因为它会导致热点。

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

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

您当然可以将时间派生值用作行键的后缀:这样做的原因是为了避免将任何单行增大到太大,因为行不会跨区域拆分,但保留为原子单位。

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

    一次作为行键的后缀,将是粗粒度的,例如,<unique-id>-yyyymmdd

    第二次作为单元格值本身的时间戳,可以是:

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

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

【讨论】:

以上是关于在过去 X 小时内从 HBase 表中获取所有数据的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在几秒钟内从 Spring MVC 中的表中获取 400K 数据

如何在 hbase 表中获取计数记录?查询记录的最快方法是啥?

我们可以从 HBase 表中获取所有列名吗?

Hive或HBase用于报告?

如果有几百亿条数据,如何在hbase表中存放?

用于报告的 Hive 或 HBase?