【问题标题】:Window operation in Spark Structured StreamingSpark Structured Streaming 中的窗口操作
【发布时间】:2018-10-30 14:05:35
【问题描述】:

我不明白窗口进程中的状态。例如;

val sums = levels.
  groupBy(window($"time", "5 seconds")).
  agg(sum("level")).show()
  1. 根据上面的代码,Spark 是否只保留最后 5 秒的状态?
  2. 是否在每个窗口操作中删除旧状态?
  3. 窗口状态在哪里举行?记忆?

并且,通过水印,是否在每个分组操作中删除旧状态?

【问题讨论】:

    标签: apache-spark spark-structured-streaming


    【解决方案1】:
    1. 根据上面的代码,Spark 是否只保留最后 5 秒的状态?

    这取决于您使用的语义:如果您使用的是处理时间,是的。如果您使用事件时间,则状态窗口将在水印经过其结束时间戳时被驱逐,因此如果您允许 7 天延迟事件,状态窗口将在 7 天后被驱逐。

    1. 是否在每个窗口操作中删除旧状态?

    每批都会发生驱逐(删除处于状态的窗口)。

    1. 窗口状态在哪里举行?内存?

    对于 Apache Spark,executor 中的 hashmap 保存状态的键/值对。事实上,Spark 拥有多个版本(批次)的状态,因此您可能需要考虑占用更大的内存大小。在最坏的情况下,理论上它可以比一个状态版本占用 100 倍的内存。 (这将在 Spark 2.4.0 中得到解决。)

    Databricks 表示他们的产品利用了 RocksDB,从而避免将它们全部保存在堆内存中。

    并且,使用水印,是否在每个分组操作中删除旧状态?

    驱逐发生在有状态的操作上,无论语义如何:处理时间与事件时间。

    希望这会有所帮助。

    【讨论】:

    • 非常感谢。很多情况下,是否有根据事件时间做的水印操作?
    • 我不确定我的理解是否正确,但“withWatermark” 带有时间戳列,然后是带有时间戳列的窗口函数。就是这样。
    • 太棒了!乐于助人。
    猜你喜欢
    • 1970-01-01
    • 2019-10-21
    • 2018-08-08
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 2018-05-12
    相关资源
    最近更新 更多