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

时间:2015-04-14 19:19:07

标签: apache-spark 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"))

事件应保持 2个月。在此期间,此类活动可能会出现 500mion ,而数以百万计的独特用户是关键所在。

我的问题是:

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

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

  • 使用Cassandra进行状态
  • 使用Trident状态(可能是Cassandra)
  • 使用Samza及其州管理。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

您可以在Rajaraman, Anand, and Jeffrey David Ullman. Mining of massive datasets. Cambridge University Press, 2011.中阅读有关它们的信息,请参阅第4.7节,特别是第4.7.3节了解实施细节。