2010-12-02 102 views

回答

0

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

0

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

我可以附加一个ID与时间戳,但我可以设置开始和结束时间mapreduce作业,如果我添加此ID?

5

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

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

如果您使用第一种方法<timestamp><id>,那么您的地图作业可能无法将作品拆分为尽可能多的块。默认方式表拆分工作在区域上。如果时间片足够小,则可以让一个区域服务于数据,而不会在查询中获得任何并行性。您可能会有一个自定义表格拆分,将查询并行化到比地区更多的映射器上,但是您仍然会读取来自一个区域的所有数据,并且也可能具有并行性的缺点。

设置表格的方式取决于您的预计使用场景和读写比例以及您需要为每个表现设置多高。

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

相关问题