结构化流式多个水印

时间:2019-09-03 10:25:02

标签: apache-spark spark-structured-streaming

如果需要的话,我会使用Spark 2.3.0。

根据结构化流文档,它处理late data using watermarks。还提到了通过使用水印来限制存储enter link description here中间状态的数量也可以实现流重复数据删除。

所以,我的问题是这些水印可以具有不同的值,还是仅指定一次水印?我之所以这样问,是因为我将在聚合后对值进行重复数据删除,因此处理最新数据的容忍度有所不同。

1 个答案:

答案 0 :(得分:2)

来自Policy for handling multiple watermarks

  

一个流查询可以具有多个输入流,这些输入流被合并或连接在一起。每个输入流都可以具有不同的阈值阈值,以进行有状态操作。您可以在每个输入流上使用withWatermarks(“ eventTime”,delay)指定这些阈值。

     

执行查询时,结构化流分别跟踪每个输入流中出现的最大事件时间,根据相应的延迟计算水印,并选择单个全局水印用于有状态操作。默认情况下,选择最小值作为全局水印,因为如果其中一个流落后于其他流(例如,其中一个流由于上游故障而停止接收数据),它可以确保没有数据被丢弃为时已晚。换句话说,全局水印将安全地以最慢的流速度移动,并且查询输出将相应地延迟。

     

从Spark 2.4开始,您可以通过将SQL配置spark.sql.streaming.multipleWatermarkPolicy设置为max(默认值为min),来设置多重水印策略以选择最大值作为全局水印。

实际上,这也适用于任何对水印敏感的运算符。