我有一个只有一个分区的有序Kafka主题。 我想从Spark(火花流或结构化流)中读取它。 为此,我使用了以下代码:
spark.readStream.format("kafka") ...
要在控制台中书写以查看我使用过的结果:
myStreamName.writeStream.trigger(Trigger.ProcessingTime("2 seconds")).format("console").outputMode("append").start
我已经在输出中看到流的所有记录都是有序的。但是,尽管如此,我在其他文章中也读过Spark无法保证订单。 看到: Spark Direct Stream Kafka order of events
我的问题是: 由于我使用的是处理时间,并且是从订购的Kafka主题中读取的,因此可以确定我的输出将始终被订购吗?如果不是,是否可以仅使用一个Spark分区来保证有序输出(例如,应用coalesce()方法)?
答案 0 :(得分:1)
Kafka使用者根据Kafka API合同得到保证。
但是,您正在写入的任何外部输出可能会触发故障。
对于大多数下游系统,我并不认为这不是问题。例如,如果您要插入数据库,则可以按时间在该数据库中重新排序。如果您有TSDB,则实际上是在“回填”数据。
由于要输出到控制台,所以这是对IO的阻塞调用,因此,从一个线程读取一批Kafka事件(按顺序),反序列化,然后在另一个线程上写入控制台(理想情况是在顺序由Spark处理,但在此处调用SparkSQL排序desc($"timestamp")
不会造成任何伤害。一旦完成,就可以降低Kafka偏移量,然后继续按顺序从Kafka读取(按偏移量顺序)...所有这些事件都不应具有会导致故障的任何竞争条件。