我应该如何为这个时间序列场景设计我的HBASE模式?

我应该如何为这个时间序列场景设计我的HBASE模式?,hbase,Hbase,我们有一个数据流,它包含:时间戳、对象ID、数据 所需的处理是: 对于每个新条目,获取具有相同对象ID的所有条目,并对所有数据进行处理 一种选择是使用单独的排队服务。 在这种情况下,HBASE模式可以将对象id作为简单键包含,因为所有查询都基于对象id 主要缺点是需要维护额外的基础设施 另一个选项是使用形式为 我还将在值中添加一个“已处理”布尔标志,以指示此记录是否已处理。(此标志可以与其他数据位于同一列族中,也可以是单独的) 按用户id进行的查询应该保持快速,因为它们查询的是一组连续的密钥 但

我们有一个数据流,它包含:
时间戳、对象ID、数据
所需的处理是:

对于每个新条目,获取具有相同对象ID的所有条目,并对所有数据进行处理

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

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

另一个选项是使用形式为

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

按用户id进行的查询应该保持快速,因为它们查询的是一组连续的密钥

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

将“已处理”标志设为单独的列族(处理后将删除)是否会提高性能?(理论上,只需扫描此列族,它将只包括未处理的记录。另一方面,为一个标志使用列族可能会产生大量开销)


还有其他建议或改进吗?

在键的前面加一个1字节的标志(0/1)怎么样,它将表示是否处理记录?这样,与将标志存储为单独的列相比,您可以在更短的时间内从未处理的记录中筛选出已处理的记录。你甚至不需要看里面的行。只需遍历行键即可获得清晰的图像。

我不会将已处理标志添加到键,因为这意味着您必须在处理记录后更改键(即删除旧键)。删除的关键帧仅在主要压缩中被清除

如果您连续查询timestamp以获取最新的未处理记录,您只需将时间戳存储在HBase时间戳中(每个put也可以包括一个时间戳),然后将其添加到扫描中(除了密钥之外,它还接受开始/结束时间戳)-对于最新数据,这将非常快,因为它可能仍在memstores中。请注意,时间戳与其他任何字段一样是一个二进制字段,因此,如果记录被处理或未被处理,您也可以在其中添加前缀(因此,处理recod将创建具有不同“时间戳”的行的新版本)