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

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

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

这可能吗?

在 flink 中可以吗?

【问题讨论】:

    标签: apache-spark spark-streaming pyspark apache-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 的最大大小是多少?)
    猜你喜欢
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多