2

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

4

3 回答 3

5

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

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

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

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

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

于 2011-01-12T01:19:34.230 回答
0

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

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

于 2010-12-20T18:15:35.253 回答
0

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

于 2010-12-19T16:40:42.150 回答