我需要根据时间范围获取数据。有没有办法根据时间范围对hbase表进行分区。例如:我希望数据从9:00到9:05。
答案 0 :(得分:5)
您可以创建<timestamp><id>
类型的复合键,然后hbase中的所有条目将按时间戳排序。然后,您可以创建一个扫描程序,该扫描程序从范围的开头开始,并在范围的结尾处结束。
您可能面临的一个问题是,如果您的插入率很高,您将拥有一台服务器作为所有新条目的热点。一种方法是反转密钥并确保第一部分是随机的:<sha1 of ID><timestamp>
。这样做的好处是可以在整个集群中分配写入,但缺点是需要读取整个表才能获得特定的范围。
如果您使用<timestamp><id>
的第一种方法,那么您的地图作业可能无法将工作分成任意数量的块。表分割工作的默认方式是在区域上。如果时间片足够小,则可以使用单个区域为数据提供服务,而不会在查询中获得任何并行性。您可能有一个自定义表拆分,可以跨越更多映射器将查询并行化,而不是区域,但您仍然会从一个区域读取所有数据,这也可能有并行性的缺点。
您如何设置表格取决于您的预计使用情况和读/写比例,以及您需要的性能有多高。
如果您在时间戳中添加ID以确保唯一性,那么您仍然可以让扫描程序返回具有给定时间戳的所有事件。 HBase根据字节表示法对字符串进行排序。因此,如果您的密钥为<timestamp>:<id>
,则可以将扫描仪设置为从<timestamp>
行开始,并在<timestamp+1>
处停止行以获取该时间戳记下的所有事件
答案 1 :(得分:0)
您可以将时间戳作为密钥的第一部分。显然,缺点是您不能再直接查询其他键。如果您也需要,可以考虑复制您的数据,如果这些对您来说都很重要。
答案 2 :(得分:0)
对我来说问题是重复的条目。我可以同时发生许多事件。例如:我可以在10点05分发生10个事件。如果我将它转换为纪元时间并插入它,它们可以在hbase中相互覆盖(或无法写入)。
我可以附加一个ID以及时间戳,但如果我添加此ID,我可以在mapreduce作业中设置开始和结束时间吗?