为什么流式数据集失败并且“当流式数据框/数据集上有流式聚合时,不支持完整输出模式......”?

时间:2017-11-13 07:24:22

标签: scala apache-spark spark-structured-streaming

我使用Spark 2.2.0并在Windows上使用Spark Structured Streaming出现以下错误:

  

streaming aggregations streaming DataFrames/DataSets没有watermark时,不支持完整输出模式。

1 个答案:

答案 0 :(得分:1)

  

在没有水印的流数据框/数据集上有流聚合时,不支持完整输出模式

流式聚合要求您告诉Spark Structured Streaming引擎何时输出聚合(按照所谓的输出模式),因为可能是聚合的一部分的数据可能会延迟并且仅可用过了一段时间。

“某个时间”部分是事件迟到,并被描述为从当前时间开始水印的时间。

这就是为什么你必须指定水印让Spark掉落/忽略任何后期事件并停止积累可能最终导致OutOfMemoryError或类似事件的状态。

话虽如此,您应该在流数据集上使用withWatermark运算符。

  

withWatermark 为此数据集定义事件时间水印。水印跟踪一个时间点,在此之前我们假设不再有后期数据到达。

引用...

  

Spark会将此水印用于多种用途:

     
      
  • 了解何时可以最终确定给定的时间窗口聚合,因此在使用不允许更新的输出模式时可以发出。
  •   
  • 为了最小化我们需要为正在进行的聚合保留的状态量,mapGroupsWithState和dropDuplicates运算符。
  •   
     

通过查看查询中所有分区上看到的MAX(eventTime)减去用户指定的delayThreshold来计算当前水印。由于跨分区协调该值的成本,所使用的实际水印仅保证在实际事件时间之后至少为delayThreshold。在某些情况下,我们仍然可以处理超过delayThreshold的记录。

查看Spark Structured Streaming的Handling Late Data and Watermarking