Pyspark Kafka结构化流:写出时出错

时间:2018-10-07 08:13:00

标签: apache-spark pyspark apache-kafka spark-structured-streaming

我能够在PySpark中通过两个不同的步骤从Kafka主题读取流,并将(转换后的)数据写回到另一个Kafka主题。这样做的代码如下:

# Define Stream:
df = spark \
     .readStream \
     .format("kafka") \
     .option("kafka.bootstrap.servers", "localhost:9092") \
     .option("subscribe", "instream") \
     .load()

# Transform
matchdata = df.select(from_json(F.col("value").cast("string"),schema).alias("value"))\
          .select(F.col('value').cast("string"))

# Stream the data, from a Kafka topic to a Spark in-memory table
query = matchdata \
       .writeStream \
       .format("memory") \
       .queryName("PositionTable") \
       .outputMode("append") \
       .start()

query.awaitTermination(5)

# Create a new dataframe after stream completes:
tmp_df=spark.sql("select * from PositionTable")

# Write data to a different Kafka topic
tmp_df \
     .write \
     .format("kafka") \
     .option("kafka.bootstrap.servers", "localhost:9092") \
     .option("topic", "outstream") \
     .save()

上面的代码按预期工作:在PySpark中读取Kafka主题“ instream”中的数据,然后PySpark可以将数据写出到Kafka主题“ outstream”。

但是,我想读入流并立即将转换后的数据写回(流将是无限的,并且我们希望在数据滚入时立即获得见解)。在the documentation之后,我将以下查询替换为以下内容:

query = matchdata \
       .writeStream \
       .format("kafka") \
       .option("kafka.bootstrap.servers", "localhost:9092") \
       .option("topic", "outstream") \
       .option("checkpointLocation", "/path/to/HDFS/dir") \
       .start()

这似乎不起作用。 没有错误信息,所以我不知道出了什么问题。我也尝试过在Windows中进行窗口化和聚合,但这也不起作用。任何建议将被认真考虑!

1 个答案:

答案 0 :(得分:0)

好的,我发现了问题。主要原因是子目录“ path / to / HDFS / dir”必须存在。创建该目录后,代码按预期运行。如果错误消息指出了这些内容,那就太好了。