pyspark 2.4.x结构化流式处理foreachBatch未运行

pyspark 2.4.x结构化流式处理foreachBatch未运行,pyspark,spark-structured-streaming,Pyspark,Spark Structured Streaming,我正在使用spark 2.4.0和python 3.6。我正在开发一个pyspark结构化流式操作的python程序。程序从两个套接字运行两个readstream读取,然后将这两个流数据帧合并。我尝试了spark 2.4.0和2.4.3,但没有任何改变。 然后我执行一个惟一的writestream,以便只写入一个输出流数据帧。这很有效。 但是,由于我还需要为所有微批处理编写一个非流数据集,因此我在writestream中编写了一个foreachBatch调用。那不行 我将spark.schedu

我正在使用spark 2.4.0和python 3.6。我正在开发一个pyspark结构化流式操作的python程序。程序从两个套接字运行两个readstream读取,然后将这两个流数据帧合并。我尝试了spark 2.4.0和2.4.3,但没有任何改变。 然后我执行一个惟一的writestream,以便只写入一个输出流数据帧。这很有效。 但是,由于我还需要为所有微批处理编写一个非流数据集,因此我在writestream中编写了一个foreachBatch调用。那不行

我将spark.scheduler.mode=FAIR放在spark.defaults.conf中。我正在运行spark submit,但即使我直接尝试使用python3,它也根本不起作用。看起来它没有执行foreachBatch中引用的splitStream函数。我尝试在splitStream函数中添加一些打印,但没有任何效果

我做了很多尝试,但没有任何改变,我通过spark提交和python提交。我正在spark单机集群上工作

inDF_1 = spark \
    .readStream \
    .format('socket') \
    .option('host', host_1) \
    .option('port', port_1) \
    .option("maxFilesPerTrigger", 1) \
    .load()

inDF_2 = spark \
    .readStream \
    .format('socket') \
    .option('host', host_2) \
    .option('port', port_2) \
    .option("maxFilesPerTrigger", 1) \
    .load() \
    .coalesce(1)

inDF = inDF_1.union(inDF_2)

#--------------------------------------------------#
#  write streaming raw dataser R-01 plateMeasures  #
#--------------------------------------------------#

def splitStream(df, epoch_id):
    df \
        .write \
        .format('text') \
        .outputMode('append') \
        .start(path = outDir0)

    listDF = df.collect()
    print(listDF)
    pass

stageDir = dLocation.getLocationDir('R-00')
outDir0 = dLocation.getLocationDir(outList[0])
chkDir = dLocation.getLocationDir('CK-00')
query0 = programName + '_q0'
q0 = inDF_1 \
        .writeStream \
        .foreachBatch(splitStream) \
        .format('text') \
        .outputMode('append') \
        .queryName(query0) \
        .start(path = stageDir
                    , checkpointLocation = chkDir)
我使用foreachBatch是因为我需要为每个输入微批次编写几个接收器。
非常感谢所有能帮助我的人。

我已经在我的本地机器上试用过,并且适用于Spark>2.4

df.writeStream
  .foreachBatch((microBatchDF, microBatchId) => {     
    microBatchDF
      .withColumnRenamed("value", "body")
      .write
      .format("console")
      .option("checkpointLocation","checkPoint")
      .save()
  })
  .start()
  .awaitTermination()

回答得很好。你能解释一下遗漏了什么吗?@f.khantsis我想知道,是否有像start(path,checkpoint)这样的重载方法。我不确定派斯帕克的情况。我们不需要为外部的流查询指定开始和检查点。我们正在做的任何操作都在forEachBatch中。