【问题标题】:Can Hbase table be partitioned based on time?Hbase表可以按时间分区吗?
【发布时间】:2010-12-02 06:22:19
【问题描述】:

我需要根据时间范围获取数据。有没有办法根据时间范围对hbase表进行分区。例如:我想要从 9:00 到 9:05 的数据。

【问题讨论】:

    标签: hbase


    【解决方案1】:

    您可以创建<timestamp><id> 类型的复合键,然后hbase 中的所有条目将按时间戳排序。然后,您可以创建一个扫描仪,该扫描仪从范围的开头开始并在范围的结尾结束。

    您可能面临的一个问题是,如果您的插入率很高,那么您将有一个服务器作为所有新条目的热点。一种解决方法是反转密钥并确保第一部分是随机的:<sha1 of ID><timestamp>。这具有将写入分布在整个集群中的优点,但缺点是需要读取整个表才能获得特定范围。

    如果您使用<timestamp><id> 的第一种方法,那么您的地图作业可能无法将工作拆分为您希望的任意数量的块。表拆分工作的默认方式是在区域上。如果您的时间片足够小,您可以让一个区域为数据提供服务,而不会在查询中获得任何并行性。您可能有一个自定义表拆分,可以在比区域更多的映射器中并行化查询,但您仍然会从一个区域读取所有数据,这也可能对并行性有不利影响。

    如何设置表取决于您的预计使用场景和读/写比例,以及您需要的性能有多高。

    如果您将 id 附加到时间戳以确保唯一性,那么您仍然可以让扫描仪返回具有给定时间戳的所有事件。 HBase 根据字节表示按字典顺序对键进行排序。因此,如果您的密钥是<timestamp>:<id>,您可以将扫描仪设置为从<timestamp> 行开始并在<timestamp+1> 停止行以获取该时间戳的所有事件

    【讨论】:

      【解决方案2】:

      您可以将时间戳作为密钥的第一部分。显然,缺点是不能再直接查询其他键。如果您也需要,您可以考虑复制您的数据,前提是这两者对您都很重要。

      【讨论】:

        【解决方案3】:

        对我来说,问题是重复的条目。我可以同时发生许多事件。例如:我可以在 10:05 发生 10 个事件。如果我将它转换为纪元时间并插入它,它们可以在 hbase 中相互覆盖(或写入失败)。

        我可以附加一个 ID 和时间戳,但是如果我添加这个 ID,我可以在 mapreduce 作业中设置开始和结束时间吗?

        【讨论】:

          猜你喜欢
          • 2012-10-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-27
          • 1970-01-01
          • 1970-01-01
          • 2019-01-11
          • 1970-01-01
          相关资源
          最近更新 更多