使用foreachBatch后如何设置kafka writeStream?

时间:2019-07-25 13:33:11

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

我目前正在使用结构化流脚本,其中包含一个充当R模型包装器的函数,该函数的示例如下所示:

图A

0 def create_predictions(df):
1     save_df_to_avro_cache(df)
2     run_r_code()
3     df = load_scored_df()
4     return df

在使用python软件包“ kafka”时,此方法效果很好,但是我正在尝试将我们的基础架构迁移到Spark Streaming上下文中。

主要区别在于,我现在通过以下内容消耗了我们的Kafka主题:

图B

0 df = spark \
1         .readStream \
2         .format("kafka") \
3         .load() \

这将导致无法将其持久化到目录中并无法从R脚本读取的Dataset对象(图A:第1行)。

我可以使用以下代码复制以前的功能:

图C:

0 streaming_companies_query_console = df.writeStream \
1         .foreachBatch(create_predictions) \
2         .start()
3 streaming_companies_query_console.awaitTermination()

但是,我现在陷入了一个问题,即如果没有手动执行接收器,便无法提交给kafka。

理想情况下,我想要的是这样的东西:

图D:

0 streaming_r_runner_query = df.writeStream \
1         .foreachBatch(create_predictions)
2         .format("kafka") \
3         .option("kafka.bootstrap.servers", "k1,k2,k3") \
4         .option("topic", "my_topic") \
5         .start()
6 
7 streaming_r_runner_query.awaitTermination()

问题1:这种类型的模式在结构化流媒体中是否不可能?

问题2:如果有可能,是否有办法将foreachBatch函数移回蒸汽环境中?

0 个答案:

没有答案