Apache spark 将数以百万计的密钥保持在Spark流媒体工作状态两个月是否可行?
我正在尝试解决Spark Streaming中的一个(此处简化)问题:假设我有一个用户创建的事件日志,其中每个事件都是一个元组(用户名、活动、时间),例如: 现在我想按用户收集事件,对其进行一些分析。假设输出是对以下各项的一些分析:Apache spark 将数以百万计的密钥保持在Spark流媒体工作状态两个月是否可行?,apache-spark,spark-streaming,Apache Spark,Spark Streaming,我正在尝试解决Spark Streaming中的一个(此处简化)问题:假设我有一个用户创建的事件日志,其中每个事件都是一个元组(用户名、活动、时间),例如: 现在我想按用户收集事件,对其进行一些分析。假设输出是对以下各项的一些分析: ("user1", List(("view", "2015-04-14T21:04Z"),("click", "2015-04-14T21:05Z")) 事件应保存两个月。在这段时间内,可能会有大约5亿这样的事件,以及数以百万计的独特用户,这是这里的关键 我的问题
("user1", List(("view", "2015-04-14T21:04Z"),("click", "2015-04-14T21:05Z"))
事件应保存两个月。在这段时间内,可能会有大约5亿这样的事件,以及数以百万计的独特用户,这是这里的关键
我的问题是:
- 当我存储了数百万个密钥时,在DStream上使用
做这样的事情可行吗updateStateByKey
- 当我有2个月的时间窗口,并且想要几秒钟的幻灯片时,
在这里没有用,我说得对吗DStream.window
updateStateByKey
在每张幻灯片上的所有键上都被调用,这意味着每隔几秒钟就会调用数百万次。这让我对这种设计产生了怀疑,我正在考虑其他解决方案,如:
- 使用Cassandra进行状态分析
- 使用三叉戟状态(可能与卡桑德拉一起使用)
- 使用Samza及其状态管理
- 看起来你需要一个指数衰减的窗口
您可以在中阅读,查看第4.7节,特别是第4.7.3节以了解实施细节。我认为这取决于您将来如何查询数据。我有类似的情况。我只是通过mapPartitions和reduceByKey进行了转换,并将数据存储在Cassandra中 关于这一点,我有一个非常确切的问题,只是做了一个快速的研究,得到了一些要点1)spark改进了他更新状态的方法2)看起来它更适合您的用例如果您使用samza,那么您如何实现它?由于这个问题已经很老了,我假设您最终得到了一个解决方案。您能提供一些代码或文档链接来支持您的答案吗?KafkaUtils.createDirectStream[String,String,StringDecoder,StringDecoder](ssc,Map(“auto.offset.reset”->“max”,“auto.commit.enable”->“false”,“metadata.broker.list”->“?”,Set(“?”).mapPartitions(partition=>{partition.map(tuple=>{//your transformation})}).reduceByKey((value1,value2)=>{//allocate timestamp to the data and store to C*})在查询数据时,可以按时间戳范围进行搜索
("user1", List(("view", "2015-04-14T21:04Z"),("click", "2015-04-14T21:05Z"))