Spark结构化流:多个数据接收端

12
  1. 我们正在使用结构化流从Kafka中消费数据,并将处理后的数据集写入S3。

    我们还希望将处理后的数据写入Kafka,是否可以从同一流式查询中执行?(Spark版本为2.1.1)

  2. 在日志中,我看到了流式查询进度输出以及来自日志的示例持续时间JSON,有人可以更清楚地解释addBatchgetBatch之间的区别吗?

  3. TriggerExecution - 是获取数据并写入接收器所需的时间吗?

"durationMs" : {
    "addBatch" : 2263426,
    "getBatch" : 12,
    "getOffset" : 273,
   "queryPlanning" : 13,
    "triggerExecution" : 2264288,
    "walCommit" : 552
},

该段文本是HTML代码,其中包含一个结束列表项标签()和一个结束有序列表标签()。我没有进行任何翻译或修改,只是将其保留为原始HTML代码。
1个回答

13
  1. 是的。

    在 Spark 2.1.1 中,您可以使用 writeStream.foreach 将数据写入 Kafka。此博客中有一个示例:https://databricks.com/blog/2017/04/04/real-time-end-to-end-integration-with-apache-kafka-in-apache-sparks-structured-streaming.html

    或者您可以使用 Spark 2.2.0,它新增了 Kafka sink,支持官方写入 Kafka。

  2. getBatch 用于衡量从源创建 DataFrame 所需的时间。这通常非常快速。addBatch 用于衡量运行 DataFrame 在 sink 中所需的时间。

  3. triggerExecution 表示运行触发器执行所需的时间,通常几乎与 getOffset + getBatch + addBatch 相同。


1
谢谢您的回复,能否请您澄清以下问题 - 当从源主题创建数据集并将其写入S3和KAFKA时,必须分别为这些接收器指定检查点,因此即使使用相同的从该源创建的数据集将数据写入这两个不同的接收器,也可以预期从源主题读取数据两次吗? - user2221654
3
如果您有两个水槽,那么意味着您有两个查询。每个查询都有自己的Kafka消费者,并独立地从Kafka获取数据。 - zsxwing
1
@zsxwing 如果两个 Spark 消费者属于同一消费者组,它们如何从 Kafka 读取相同的消息两次? - RockSolid
“通常几乎与getOffset + getBatch + addBatch相同”:我认为这在大多数情况下并不正确。我开发的大多数应用程序中,triggerExecution的数量级是分钟,而其他应用程序则是毫秒或秒。 - Reza
1
@RockSolid 每个 writeStream 都会创建一个新的流,它们独立运行并从自己的检查点位置选择偏移量。为每个流创建不同的组 ID,就像您正在运行不同的读取 + 写入流一样。 - spats

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接