为谷歌bigtable或任何谷歌产品设计时间序列数据模式



我正在进行一个项目,在该项目中,我必须每天为每个用户存储与用户活动相关的事件,以便稍后进行分析。我将获得带有时间戳的事件流,稍后将对这些数据运行数据流作业进行分析,以获得每个用户的统计数据。我正在探索大表来存储这些数据,其中时间戳将作为每一行的键,稍后我将运行范围查询来获取单日数据并对其进行处理。但在浏览了一些资源后,发现有了带时间戳的行键,大表可能会出现热点问题。无法将userid提升为行键中的键以避免这种情况。解决此问题的任何替代方法,或在此用例中可以提供帮助的任何其他存储引擎。

用例:用例是我有用户活动数据,比如流中的印象和点击。根据规则,我必须在一定的时间内从这些流中聚合数据,存储并尽快提供给上游服务。数据将在已知的24小时内以滚动窗口的方式进行处理,但可能会增加或减少。我必须做出的选择是,如何存储原始事件(大表或大查询或流上的直接分析(、计算引擎(波束与聚合查询(和最终存储(基于用户id(。用户和聚合数据之间的关系是一对多的。

考虑到在查询时无法访问userid,您将不得不在某个地方进行权衡。似乎你在这里写的比读的多,因为你在一天中为每个用户写数据,然后每天只读一次来分析数据?如果我的解释有误,请纠正我。

我想说,如果你的数据流工作中的扫描没有那么有效,以避免你写作的热点,那也没关系。

您可以将您的rowkey中的userid提升为类似userid#date的内容,然后使用rowkey regex过滤器进行扫描,以查找*#YOUR_DATE

这不是最有效的扫描,因为它是一个完整的表扫描,并且使用了相当密集的过滤器,但为了优化数据库写入数据,这仍然允许您读取数据。

如果我的假设与您的目标不一致,请随时提供有关您的管道和预期数据库用例的更多信息。

如果您需要存储大量数据,并按时间戳或日期将其提供给以后的分析,则应该使用BigQuery而不是BigTable。

BigQuery提供了按时间戳/日期对表进行分区的选项。

可以考虑日期/时间戳分区表中的每个分区作为范围的开始是一天的开始的范围,以及范围的间隔是一天。日期/时间戳已分区表不需要_PARTITIONTIME伪列。针对的查询日期/时间戳分区表可以基于以减少扫描的数据量。

最新更新