使用Cassandra根据时间窗口计算事件

时间:2013-10-15 15:35:49

标签: cassandra

我的系统中有数百万用户{U1,U2,...},并且在任何时刻都可能有与任何用户关联的事件E(U,t):E(Ui,ti) 。我将事件信息存储在列族中。

 UserId1:
       TimeUUID:""
       TimeUUID:""
 UserId2:
       TimeUUID:""
       TimeUUID:""
 etc ...

鉴于当前时间T,我想找到两个用户:在一小时和两小时内事件计数最高。基本上,我想知道最有意义的用户提供了一定的时间限制。

我的解决方案将涉及创建两个列系列,一个名为Tminus1,另一个名为Tminus2。这些列族具有相同的数据写入,但TTL(生存时间)不同:一个是1小时,另一个是2小时。

三是一个一直运行的作业,并为两个表中的每一行计数列,并将结果写入一个名为“EventStats”的新表,该表只有两行:

max1hour:
     5609837: user376484, TTL = 1 hour
     4577374: user293760, TTL = 1 hour
     .... 
max2hour:
     4837301: user933734, TTL = 2 hour
     0043746: user948348, TTL = 2 hour
     ....

(这里的列名是计数。这里的问题是如果两个用户具有相同的计数会发生什么......)

当服务想知道获胜用户时,它只读取相应行中的第一列。

我对这个解决方案的问题(即使它是可行的)是它太麻烦了。也许我不熟悉其他一些Cassandra工具,它们可以以更优雅的方式解决这个问题。另外,我希望能够在12小时,5小时等内动态引入和更改更多统计度量,例如最高偶数计数器......这将需要创建类似于Tminus1等的新列系列。

我打算使用标准的Cassandra计数器来避免编写计数作业,但我认为当由于TTL而删除某些列时我不能自动更新计数器。

非常感谢任何反馈。

1 个答案:

答案 0 :(得分:1)

从您的描述中可以看出,您实时不需要此信息,因为您已经有一个单独的过程可以产生您想要的结果。鉴于此,我认为有一个外部聚合器(可能类似SparkStorm)可能会生成您的统计信息并将其写回Cassandra。您也可以使用Hadoop MapReduce作业来完成此任务。