Cassandra 卡桑德拉聚集

Cassandra 卡桑德拉聚集,cassandra,cassandra-2.0,Cassandra,Cassandra 2.0,Cassandra数据库不太适合聚合,这就是为什么我决定在写之前进行聚合。我正在为每个用户存储一些数据(例如事务),我按小时聚合这些数据。这意味着对于一个用户,我们的每个用户只有一行 每当我收到新数据时,我读取当前小时的行,将其与接收到的数据聚合并写回。我使用此数据生成每小时报告 这对低速数据很有效,但我观察到当速度非常高时,数据丢失率相当高(例如一分钟内一个用户有100条记录)。这是因为读取和写入的速度非常快,而且由于“延迟写入”,我没有得到更新的数据 我认为我的方法“先汇总再写”本身是错误的

Cassandra数据库不太适合聚合,这就是为什么我决定在写之前进行聚合。我正在为每个用户存储一些数据(例如事务),我按小时聚合这些数据。这意味着对于一个用户,我们的每个用户只有一行

每当我收到新数据时,我读取当前小时的行,将其与接收到的数据聚合并写回。我使用此数据生成每小时报告

这对低速数据很有效,但我观察到当速度非常高时,数据丢失率相当高(例如一分钟内一个用户有100条记录)。这是因为读取和写入的速度非常快,而且由于“延迟写入”,我没有得到更新的数据

我认为我的方法“先汇总再写”本身是错误的。我在考虑UDF,但我不确定它会对性能产生什么影响

在Cassandra中存储聚合数据的最佳方法是什么?

我的想法是:

  • Cassandra中逐小时存储桶的模型数据
  • 当数据到达时,立即将普通数据存储到Cassandra中
  • 在X处理X-1小时的所有数据,并将聚合结果存储在另一个表中

这将允许您具有非常快的传入速率,只处理一次数据,将聚合存储到另一个表中以进行快速读取。

我也使用Cassandra进行预聚合。我每小时、每天、每周和每月都有不同的表格。我认为在上次插入复制到其他节点之前选择数据时,可能会丢失数据

要想绕过这件事,就要仔细调查


您还可以在INSERT或selects中指定更高的一致性级别,以确保获得最新的数据。

读取时将聚合什么类型的聚合以及聚合多少。它多久阅读一次?您是否考虑过像Spark Streaming那样批量聚合它们?在我的测试环境中,我在几秒钟内编写了200条记录(编写了一个连续发送数据的脚本)。我在每次插入之前都会阅读该行。我每5分钟运行一次这个脚本。但在生产环境中,我希望速度比这个更快。在最坏的情况下,可能会有1000条记录同时出现。“最佳实践”是基于主题之外的意见,内容过于广泛。在尝试提出更多问题之前,请先阅读。即使是我,每小时、每天、每周和每月的报告也会有不同的表格。问题是我有10种不同类型的报告,每种类型的报告都有小时、每日、每周和每月的过滤器。创建这么多表是否明智?每个报告4个非规范化的表对我来说并不是太糟糕。如果您在Cassandra 3.0+上,您可以查看物化视图。