【问题标题】:Why does Complete output mode require aggregation?为什么完整输出模式需要聚合?
【发布时间】:2018-01-27 03:51:33
【问题描述】:

我在 Apache Spark 2.2 中使用最新的结构化流式处理并遇到以下异常:

org.apache.spark.sql.AnalysisException: 未完成输出模式 当流媒体上没有流媒体聚合时支持 数据帧/数据集;;

为什么完整输出模式需要流式聚合?如果 Spark 在流式查询中允许不聚合的完整输出模式会发生什么?

scala> spark.version
res0: String = 2.2.0

import org.apache.spark.sql.execution.streaming.MemoryStream
import org.apache.spark.sql.SQLContext
implicit val sqlContext: SQLContext = spark.sqlContext
val source = MemoryStream[(Int, Int)]
val ids = source.toDS.toDF("time", "id").
  withColumn("time", $"time" cast "timestamp"). // <-- convert time column from Int to Timestamp
  dropDuplicates("id").
  withColumn("time", $"time" cast "long")  // <-- convert time column back from Timestamp to Int

import org.apache.spark.sql.streaming.{OutputMode, Trigger}
import scala.concurrent.duration._
scala> val q = ids.
     |   writeStream.
     |   format("memory").
     |   queryName("dups").
     |   outputMode(OutputMode.Complete).  // <-- memory sink supports checkpointing for Complete output mode only
     |   trigger(Trigger.ProcessingTime(30.seconds)).
     |   option("checkpointLocation", "checkpoint-dir"). // <-- use checkpointing to save state between restarts
     |   start
org.apache.spark.sql.AnalysisException: Complete output mode not supported when there are no streaming aggregations on streaming DataFrames/Datasets;;
Project [cast(time#10 as bigint) AS time#15L, id#6]
+- Deduplicate [id#6], true
   +- Project [cast(time#5 as timestamp) AS time#10, id#6]
      +- Project [_1#2 AS time#5, _2#3 AS id#6]
         +- StreamingExecutionRelation MemoryStream[_1#2,_2#3], [_1#2, _2#3]

  at org.apache.spark.sql.catalyst.analysis.UnsupportedOperationChecker$.org$apache$spark$sql$catalyst$analysis$UnsupportedOperationChecker$$throwError(UnsupportedOperationChecker.scala:297)
  at org.apache.spark.sql.catalyst.analysis.UnsupportedOperationChecker$.checkForStreaming(UnsupportedOperationChecker.scala:115)
  at org.apache.spark.sql.streaming.StreamingQueryManager.createQuery(StreamingQueryManager.scala:232)
  at org.apache.spark.sql.streaming.StreamingQueryManager.startQuery(StreamingQueryManager.scala:278)
  at org.apache.spark.sql.streaming.DataStreamWriter.start(DataStreamWriter.scala:247)
  ... 57 elided

【问题讨论】:

    标签: apache-spark spark-structured-streaming


    【解决方案1】:

    来自Structured Streaming Programming Guide - 其他查询(不包括聚合、mapGroupsWithState 和 flatMapGroupsWithState):

    不支持完整模式,因为在结果表中保留所有未聚合的数据是不可行的。

    回答问题:

    如果 Spark 允许在流式查询中使用没有聚合的完整输出模式会发生什么?

    可能OOM。

    令人费解的部分是为什么dropDuplicates("id") 没有被标记为聚合。

    【讨论】:

      【解决方案2】:

      我认为问题在于输出模式。不要使用 OutputMode.Complete,而是使用 OutputMode.Append,如下所示。

      scala> val q = ids
          .writeStream
          .format("memory")
          .queryName("dups")
          .outputMode(OutputMode.Append)
          .trigger(Trigger.ProcessingTime(30.seconds))
          .option("checkpointLocation", "checkpoint-dir")
          .start
      

      【讨论】:

      • 谢谢你帮了我。应该在文档中提到
      • 但是OutputMode.Append 与OutputMode.Complete 做不同的事情
      • 这个答案如何获得支持?追加和完成是完全不同的模式
      猜你喜欢
      • 1970-01-01
      • 2018-03-07
      • 1970-01-01
      • 2019-01-07
      • 1970-01-01
      • 2022-11-18
      • 2020-07-04
      • 2023-02-05
      • 2015-11-25
      相关资源
      最近更新 更多