每个微批处理的流查询的结构化流计划逻辑计划如何?

时间:2019-10-31 09:13:23

标签: apache-spark spark-structured-streaming

我在笔记本电脑上进行了以下测试:

我用一个1000条消息创建了一个Kafka主题,其中每条消息包含几行,每行约100列。

在List [Column]中创建300个非常复杂的Spark列。没有聚合。

在设置来自Kafka的流时,我设置了.option(“ maxOffsetsPerTrigger”,1),因此每个迷你批处理中仅处理一条消息。

然后我将这些列应用于仅包含一条消息的迷你批处理。

val testStream = myStream
  .select(manyTestCols :_*)
  .writeStream
  .format("console")
  .outputMode("append")
  .start()
  .awaitTermination()

火花大约需要10秒钟来处理每条消息。

然后我将maxOffsetsPerTrigger更改为.option(“ maxOffsetsPerTrigger”,1000),以便在每个迷你批处理中处理1000条消息。

火花需要大约11秒的时间来处理每个微型批处理中的所有1000条消息。

因此,似乎Spark会执行某种“设置工作”,然后一旦开始处理每个小批处理就相当快。

此“设置工作”是否是针对每个微型批处理从查询计划一直到物理计划?

如果是这样,Spark在每个微型批处理中都这样做是否有意义?

还是其他事情正在完全发生?我正在查看Spark源代码,但希望获得已经通过本练习的人的反馈。

Tx以获取任何见解。

1 个答案:

答案 0 :(得分:1)

  

此“设置工作”是否是针对每个微型批处理从查询计划一直到物理计划?

对于在运行时按如下方式填写的流查询的查询计划的执行特定部分,部分为是(带有指向相应代码部分的链接):

  1. Proper relations for data sources(例如,LocalRelation用于无数据源)
  2. Event-time watermark
  3. Current (micro-batch) time
  

如果是这样,Spark在每个微型批处理中都这样做是否有意义?

绝对。结构化流中没有其他方法可以短路无数据源,跟踪当前时间和水印。

这也是extra no-data micro-batch for stateful operators(例如,水印更改)的原因。

  

我正在查看Spark源代码,但希望已经通过此练习的人提供反馈。

请参见MicroBatchExecutionIncrementalExecution