我正在使用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。 非常感谢大家可以尝试帮助我-
答案 0 :(得分:1)
我已经在本地计算机上尝试过此方法,并且适用于Spark> 2.4。
df.writeStream
.foreachBatch((microBatchDF, microBatchId) => {
microBatchDF
.withColumnRenamed("value", "body")
.write
.format("console")
.option("checkpointLocation","checkPoint")
.save()
})
.start()
.awaitTermination()