用于实时时间序列的新 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 提供了行键的自动字典顺序,您可以改进 Get
或 Scan
操作,如下所示:
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_ROW
和 END_ROW
的 Scan
域。例如,带有 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
数据等...
我在 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 提供了行键的自动字典顺序,您可以改进 Get
或 Scan
操作,如下所示:
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_ROW
和 END_ROW
的 Scan
域。例如,带有 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
数据等...