通过使用 Spark 从 Kafka 读取流来保证订单
Order guarantee by reading a stream with Spark from Kafka
我有一个有序的 Kafka 主题,只有一个分区。
我想从 Spark(Spark Streaming 或 Structured Streaming)读取它。
为此,我使用了这段代码:
spark.readStream.format("kafka") ...
写到控制台看看我用过的结果:
myStreamName.writeStream.trigger(Trigger.ProcessingTime("2 seconds")).format("console").outputMode("append").start
我在输出中看到流的所有记录都是有序的。但尽管如此,我已经阅读了其他 post Spark 不保证顺序。
看:
Spark Direct Stream Kafka order of events
我的问题是:
由于我正在使用 Processing-time 并且我从 ordered Kafka 主题 中读取,我可以确定我的输出总是有序的吗?如果不是,是否可以只使用一个Spark分区来保证有序输出(例如应用coalesce()方法)?
Kafka 消费者 保证按 Kafka API 合同订购。
但是,您正在写入的任何外部输出都可能会无序触发。
我真的不认为这对于大多数下游系统来说不是问题...例如,如果您要插入数据库,那么您可以在那里按时间重新排序。如果您有 TSDB,那么您实际上就是 "backfilling" 数据。
由于您正在输出到控制台,这是对您的 IO 的阻塞调用,因此,从一个线程(按顺序)读取一批 Kafka 事件,反序列化,然后在另一个线程上写入控制台(理想情况下,它们是由 Spark 处理的,但在这里调用 SparkSQL 排序 desc($"timestamp")
也没什么坏处)。一旦完成,就可以提交 Kafka 偏移量,然后您继续按顺序从 Kafka 读取(按偏移量顺序)......所有这些事件都不应该有任何这样的竞争条件,它们会出现乱序。
我有一个有序的 Kafka 主题,只有一个分区。 我想从 Spark(Spark Streaming 或 Structured Streaming)读取它。 为此,我使用了这段代码:
spark.readStream.format("kafka") ...
写到控制台看看我用过的结果:
myStreamName.writeStream.trigger(Trigger.ProcessingTime("2 seconds")).format("console").outputMode("append").start
我在输出中看到流的所有记录都是有序的。但尽管如此,我已经阅读了其他 post Spark 不保证顺序。 看: Spark Direct Stream Kafka order of events
我的问题是: 由于我正在使用 Processing-time 并且我从 ordered Kafka 主题 中读取,我可以确定我的输出总是有序的吗?如果不是,是否可以只使用一个Spark分区来保证有序输出(例如应用coalesce()方法)?
Kafka 消费者 保证按 Kafka API 合同订购。
但是,您正在写入的任何外部输出都可能会无序触发。
我真的不认为这对于大多数下游系统来说不是问题...例如,如果您要插入数据库,那么您可以在那里按时间重新排序。如果您有 TSDB,那么您实际上就是 "backfilling" 数据。
由于您正在输出到控制台,这是对您的 IO 的阻塞调用,因此,从一个线程(按顺序)读取一批 Kafka 事件,反序列化,然后在另一个线程上写入控制台(理想情况下,它们是由 Spark 处理的,但在这里调用 SparkSQL 排序 desc($"timestamp")
也没什么坏处)。一旦完成,就可以提交 Kafka 偏移量,然后您继续按顺序从 Kafka 读取(按偏移量顺序)......所有这些事件都不应该有任何这样的竞争条件,它们会出现乱序。