将数百万个密钥保持在Spark Streaming工作状态两个月是否可行



我试图解决Spark Streaming中的一个(此处简化)问题:假设我有一个用户创建的事件日志,其中每个事件都是一个元组(用户名、活动、时间),例如:

("user1", "view", "2015-04-14T21:04Z")
("user1", "click", "2015-04-14T21:05Z")

现在,我想按用户收集事件,对其进行一些分析。假设输出是一些分析:

("user1", List(("view", "2015-04-14T21:04Z"),("click", "2015-04-14T21:05Z"))

事件应保存两个月。在此期间,可能会有大约5亿个此类事件,以及数百万个独特的用户,这是这里的关键。

我的问题是:

  • 当我存储了数百万个密钥时,在DStream上用updateStateByKey做这样的事情可行吗
  • 当我有两个月的窗口,想要几秒钟的幻灯片时,DStream.window在这里没有用,我说得对吗

p.S。我发现,每张幻灯片上的所有键都会调用updateStateByKey,这意味着它每隔几秒钟就会被调用数百万次。这让我对这个设计产生了怀疑,我正在考虑其他解决方案,比如:

  • 使用Cassandra作为state
  • 使用三叉戟状态(可能是卡桑德拉)
  • 使用Samza进行国家管理

我认为这取决于将来如何查询数据。我也有类似的情况。我刚刚通过mapPartitions和reduceByKey进行了转换,并将数据存储在Cassandra中。

看起来您需要一个指数衰减窗口

你可以在Rajaraman、Anand和Jeffrey David Ullman上读到关于他们的文章。挖掘海量数据集。剑桥大学出版社,2011年,查看第4.7节,特别是第4.7.3节了解实施细节。

最新更新