Apache Spark Streaming:在内存中积累数据并在很久以后才输出

Posted

技术标签:

【中文标题】Apache Spark Streaming:在内存中积累数据并在很久以后才输出【英文标题】:Apache Spark Streaming: accumulate data in memory and output it only much later 【发布时间】:2015-07-07 08:53:50 【问题描述】:

如果我理解正确的话,Spark Streaming 是用于通过一组转换传输 RDD 批次,并在转换后进行输出操作。这是针对每个批次执行的,因此输出操作也针对每个批次执行。但是由于每次输出的成本太高,我想处理批次并累积结果,并且仅在某些事件(例如在一定时间段后)写出累积的结果并结束程序。

我知道我可以积累数据,例如使用 updateStateByKey,但我不知道如何告诉 Spark 使用输出操作(例如 saveAsTextFiles),直到很久以后,当某些条件到达时。

这可能吗?

在 flink 中可以吗?

【问题讨论】:

【参考方案1】:

免责声明:我是 Apache Flink 的贡献者。

由于丰富的窗口语义,应该可以用 Flink 做到这一点:http://ci.apache.org/projects/flink/flink-docs-master/apis/streaming_guide.html#window-operators Flink 有一堆预定义的窗口。此外,您可以根据需要实施自己的窗口策略来获得自定义行为。

【讨论】:

但这怎么可能呢? 你点击链接了吗?它解释了它在 Flink 中是如何工作的。或者,请指定一个更详细的问题。 我同意 Matthias 的观点,听起来你想要做的是运行一段时间的计算(一段时间或一些元素),然后对结果采取行动。在流上运行计算“一段时间”正是窗口化。剩下的问题是:之后你想对数据做什么?每次都写入一个新文件?将其附加到现有的? 我不明白你所说的“减少传入数据”和“用 updateStateByKey 记住它”是什么意思? - 你假设元组的数量太大而无法适应集群的分布式主内存? - 你认为“减少批次”适合分布式主内存? - 你假设进一步将“减少的批次”聚合成一个状态?如果这是您的假设,您可以使用两个连续的窗口。第一个“减少您的批次”(-> 元组固定大小的窗口),第二个聚合您的 stateByKey 并在一段时间后发出状态。 如果我使用 windows,它们会变得很大。我想我可以减少每个批次并使用 updateStateByKey 提交更少量的数据到状态,然后在最后处理状态的内容。但这似乎不起作用。 (我这里假设 RDD 必须适合集群 RAM。这是真的吗?或者 RDD 的最大大小是多少?)

以上是关于Apache Spark Streaming:在内存中积累数据并在很久以后才输出的主要内容,如果未能解决你的问题,请参考以下文章

Spark Streaming带状态更新

Spark Streaming源代码学习总结

Spark Streaming快速入门之WordCount

Spark 学习笔记之 Streaming Window

java.lang.NoClassDefFoundError: org/apache/spark/streaming/twitter/TwitterUtils$ 同时运行 TwitterPopular

spark streaming是怎么接受socket数据