Spark结构化流中的窗口操作

时间:2018-10-27 12:48:03

标签: apache-spark spark-structured-streaming

我不了解窗口过程中的状态。例如;

val sums = levels.
  groupBy(window($"time", "5 seconds")).
  agg(sum("level")).show()
  1. 根据上面的代码,Spark是否仅在最近5秒钟内保持状态?
  2. 每个开窗操作中是否都删除了旧状态?
  3. 窗口状态保存在哪里?记忆?

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

1 个答案:

答案 0 :(得分:1)

  
      
  1. 根据上面的代码,Spark是否仅在最近5秒钟内保持状态?
  2.   

这取决于您使用哪种语义:如果您正在使用处理时间,是的。如果您使用的是事件时间,则水印将在其结束时间戳记过去时退出处于活动状态的窗口,因此,如果您允许延迟7天的事件发生,则处于活动状态的窗口将在7天后退出。

  
      
  1. 每个开窗操作中是否都删除了旧状态?
  2.   

每批将发生逐出(状态为删除窗口)

  
      
  1. 窗口状态保存在哪里?记忆吗?
  2.   

对于Apache Spark,执行程序中的哈希表保存状态的键/值对。实际上,Spark拥有状态的多个版本(批处理),因此您可能需要考虑占用更大的内存。在最坏的情况下,理论上它可以比状态版本占用100倍的内存。 (在Spark 2.4.0中将对此进行补救。)

Databricks声明其产品利用了RocksDB,从而避免了将它们全部保留在堆内存中。

  

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

有状态操作会发生驱逐,而不管语义是什么:处理时间与事件时间。

希望这会有所帮助。