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

zar*_*zyk 6 apache-spark spark-streaming

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

("user1", "view", "2015-04-14T21:04Z")
("user1", "click", "2015-04-14T21:05Z")
Run Code Online (Sandbox Code Playgroud)

现在我想收集用户的事件来做一些分析.假设输出是对以下内容的一些分析:

("user1", List(("view", "2015-04-14T21:04Z"),("click", "2015-04-14T21:05Z"))
Run Code Online (Sandbox Code Playgroud)

这些事件应该保存2个月.在此期间,可能会有大约500万这样的事件,以及数以百万计的独特用户,这些都是这里的关键.

我的问题是:

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

PS我发现,updateStateByKey每个幻灯片上的所有键都会调用它,这意味着每隔几秒就会调用数百万个时间.这让我对这个设计产生了怀疑,我宁愿考虑以下替代解决方案:

  • 使用卡桑德拉为州
  • 使用Trident状态(可能使用Cassandra)
  • 使用Samza进行国家管理.

小智 0

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

您可以在Rajaraman、Anand 和 Jeffrey David Ullman 的著作中读到有关他们的内容。海量数据集的挖掘。剑桥大学出版社,2011 年。请参阅第 4.7 节,特别是第 4.7.3 节以了解实施细节。