1

我的系统中有数百万用户 {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 而被删除时,我无法自动更新计数器。

任何反馈将不胜感激。

4

1 回答 1

1

从您的描述看来,您不需要实时获取此信息,因为您已经有一个单独的过程可以产生您想要的结果。鉴于此,我认为拥有一个外部聚合器(可能是SparkStorm 之类的东西)来生成统计数据并将它们写回 Cassandra可能是有意义的。您也可以使用 Hadoop MapReduce 作业来执行此操作。

于 2013-10-15T17:51:54.357 回答