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

时间:2019-06-15 09:49:53

标签: pyspark spark-structured-streaming

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

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

我做了很多尝试,但是没有改变,我通过spark-submit和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,因为我需要为每个输入微型批次编写多个shink。 非常感谢大家可以尝试帮助我-

1 个答案:

答案 0 :(得分:1)

我已经在本地计算机上尝试过此方法,并且适用于Spark> 2.4。

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