用于实时时间序列的新 table 的 Hbase 模式设计

Hbase schema design for new table for realtime time series

我在 hbase table 中有一些域数据,例如页面等。我必须实时显示其统计数据,例如每周的文档数量、invalid/valid 文档等。 为此,我正在考虑为这些统计数据创建另一个 Hbase table。 MR 作业将在处理原始 table 后更新新的 table 以获取新的一周统计信息。现在我的新 table 的架构应该是什么?这是正确的做法吗? 我必须实时可视化前 100 个域(需要一些排序)。

Data format like
domain, week1-docs, week2-docs,week3-docs ...

此外,预计数据会随着时间增长。

domain, week1-docs, week2-docs,week3-docs ...

您可以使用这种方法来存储数据,因为您可以在 HBase 中存储基本上无限的列,但我更喜欢以下方法:

domain_week_id [row_key], week-docs 

举个例子

domainName_2019_24, {docs data}

通过这种方式,您可以更有效地获取特定的一周,并且扩展性更好。

您还可以为具有所需周间隔的行键指定一个范围,它将获取那些周的所有文档。

根据您希望如何从 HBase 获取数据,您有几种可能性。事实上,由于 HBase 提供了行键的自动字典顺序,您可以改进 GetScan 操作,如下所示:

1) 您将对给定一周的所有域感兴趣

[rowKey] -> [colName0] = [colValue0], ...
"2019-01" -> domain0 = "{data for domain0}", domain1 = "{data for domain1}"
...
"2019-52" -> ...

在这种情况下,您可以使用 Get 操作来获取给定一周内所有域的数据,或者使用 Scan 操作来获取多个星期内所有域的数据。

2) 您将在多个星期内一次对一个域感兴趣

[rowKey] -> [colName0] = [colValue0], ...
"domain0_2019-01" -> data = "{data for domain0 on week 1}"
...
"domain0_2019-52" -> data = "{data for domain0 on week 52}"
"domain1_2019-01" -> data = "{data for domain1 on week 1}"
...

在这种情况下,您可以通过相应地构建 Get 来获取单个域一周内的数据,或者您可以获取给定周内所有(或部分)周的数据使用带有部分 START_ROWEND_ROWScan 域。例如,带有 START_ROW = "domain0_2019"STOP_ROW = "domain0_2020"Scan 将为您提供域 0 的整个 2019 年的数据。

3) 您将对一周和一次单个域感兴趣

[rowKey] -> [colName0] = [colValue0], ...
"2019-01_domain0" -> data = "{data for domain0 on week 1}"
"2019-01_domain1" -> data = "{data for domain1 on week 1}"
...
"2019-52_domain0" -> data = "{data for domain0 on week 52}"
"2019-52_domain1" -> data = "{data for domain1 on week 52}"
...

此方法与第一种方法类似,区别在于您要在实际列中存储多少数据。这种方法更喜欢使用 Get 操作来获取特定域的特定周的数据。

可以考虑其他因素,这实际上取决于您希望如何从 HBase 中提取数据 table,如果您只使用 Get 操作,或者您还需要 Scan 数据等...