我该如何为这个时间序列场景设计我的HBASE架构?

时间:2013-11-27 15:18:27

标签: hbase

我们的数据流包含:time stamp, object ID, data 所需的处理是:

对于每个新条目,获取具有相同对象ID的所有条目,并对所有数据执行某些操作

一种选择是使用单独的排队服务。 在这种情况下,HBASE模式可以包含对象id作为简单密钥,因为所有查询都基于对象ID。

主要缺点是需要维护额外的基础设施。

另一种选择是使用<object ID>.<time stamp>

形式的复杂键

我还会在值中添加一个'processed'布尔标志,以指示此记录是否已被处理。 (此标志可以与其他数据位于同一列族中,也可以单独存在)

用户ID的查询应该保持快速,因为它们会查询一组连续的密钥。

但是,我不确定在这种情况下按时间范围查询也会很快。

是否将处理后的标志设为一个单独的列族,一旦处理就会被删除,从而提高性能? (理论上,只需要扫描此列族,并且它将仅包括未处理的记录。另一方面 - 具有一个标记的列族可能会产生很大的开销)

还有其他任何建议或改进吗?

2 个答案:

答案 0 :(得分:1)

如何在键上加上一个1字节标志(0/1)来表示是否处理了记录?这样,您可以在比标记存储为单独列的时间更短的时间内从未处理的记录中过滤出已处理的记录。你甚至不需要查看行内部。只需遍历rowkeys就可以得到清晰的图片。

答案 1 :(得分:1)

我不会将处理过的标志添加到密钥中 - 因为这意味着您必须在处理完记录后更改密钥(即删除旧密钥)。删除的密钥只能在主要压缩中清除。

如果您不断查询时间戳以获取最新的未处理记录,您只需将时间戳存储在HBase时间戳中(每个put也可以包含时间戳),然后将其添加到扫描中(它接受开始/结束时间戳)除了密钥) - 这对于最新数据来说会非常快,因为很可能它仍然存在于memstore中。请注意,时间戳是一个二进制字段,所以你也可以在那里添加一个前缀,如果处理了记录(因此处理recod将创建一个具有不同“时间戳”的新版本)