Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 将数以百万计的密钥保持在Spark流媒体工作状态两个月是否可行?_Apache Spark_Spark Streaming - Fatal编程技术网

Apache spark 将数以百万计的密钥保持在Spark流媒体工作状态两个月是否可行?

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亿这样的事件,以及数以百万计的独特用户,这是这里的关键 我的问题

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

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

("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"))