Spark流 - reduceByKeyAndWindow()是否使用常量内存?

时间:2017-06-26 20:34:23

标签: apache-spark streaming spark-streaming

我正在玩长时间运行的聚合(可能是一天的窗口)。我意识到这个网站上的其他解决方案说你应该使用批量处理。

我特别感兴趣的是理解这个功能。听起来它会使用常量空间在窗口上进行聚合,一次一个间隔。如果这是真的,那听起来像是一天的聚合是可行的 - 特别是因为它在失败的情况下使用了检查指向。

有人知道是不是这样吗?

此功能记录为:https://spark.apache.org/docs/2.1.0/streaming-programming-guide.html

  

上述reduceByKeyAndWindow()的更高效版本,其中使用前一窗口的reduce值逐步计算每个窗口的reduce值。这是通过减少进入滑动窗口的新数据和“反向减少”离开窗口的旧数据来完成的。一个例子是当窗口滑动时“添加”和“减去”键的计数。但是,它仅适用于“可逆减少函数”,即那些具有相应“反向减少”函数的减函数(作为参数invFunc)。与reduceByKeyAndWindow类似,reduce任务的数量可通过可选参数进行配置。请注意,必须启用检查点才能使用此操作。

1 个答案:

答案 0 :(得分:0)

在MapR论坛上对此进行研究后,似乎肯定会使用恒定的内存级别,假设您可以在分配的资源中安装一天的数据,那么就可以建立日常窗口。

两个缺点是:

  1. 每日聚合可能只需要20分钟。在一天中执行一个窗口意味着您将永久使用所有这些群集资源,而不是每天只使用20分钟。因此,独立批量聚合的资源效率要高得多。
  2. 当您在一天内完成流式传输时,很难处理延迟数据。如果您的数据标有日期,那么您需要等到所有数据都到达。如果您只是对过去24小时的数据进行分析而不考虑其内容,那么流式传输中的1天窗口将会很好。