我不了解窗口过程中的状态。例如;
val sums = levels.
groupBy(window($"time", "5 seconds")).
agg(sum("level")).show()
并且通过加水印,是否在每次分组操作中都删除了旧状态?
答案 0 :(得分:1)
- 根据上面的代码,Spark是否仅在最近5秒钟内保持状态?
这取决于您使用哪种语义:如果您正在使用处理时间,是的。如果您使用的是事件时间,则水印将在其结束时间戳记过去时退出处于活动状态的窗口,因此,如果您允许延迟7天的事件发生,则处于活动状态的窗口将在7天后退出。
- 每个开窗操作中是否都删除了旧状态?
每批将发生逐出(状态为删除窗口)
- 窗口状态保存在哪里?记忆吗?
对于Apache Spark,执行程序中的哈希表保存状态的键/值对。实际上,Spark拥有状态的多个版本(批处理),因此您可能需要考虑占用更大的内存。在最坏的情况下,理论上它可以比状态版本占用100倍的内存。 (在Spark 2.4.0中将对此进行补救。)
Databricks声明其产品利用了RocksDB,从而避免了将它们全部保留在堆内存中。
并且通过加水印,是否在每次分组操作中都删除了旧状态?
有状态操作会发生驱逐,而不管语义是什么:处理时间与事件时间。
希望这会有所帮助。