【问题标题】:Order guarantee by reading a stream with Spark from Kafka通过使用来自 Kafka 的 Spark 读取流来保证订单
【发布时间】:2019-06-30 09:36:20
【问题描述】:

我有一个只有一个分区的有序 Kafka 主题。 我想从 Spark(Spark Streaming 或 Structured Streaming)中读取它。 为此,我使用了以下代码:

spark.readStream.format("kafka") ...

在控制台中写入以查看我使用的结果:

myStreamName.writeStream.trigger(Trigger.ProcessingTime("2 seconds")).format("console").outputMode("append").start

我在输出中看到流的所有记录都是有序的。但尽管如此,我在其他帖子中读过 Spark 并不能保证顺序。 看: Spark Direct Stream Kafka order of events

我的问题是: 由于我使用的是 Processing-time 并且我从 有序的 Kafka 主题 中读取数据,我可以确定我的输出始终是有序的吗?如果不是,是否可以仅使用一个 Spark 分区来保证有序输出(例如应用 coalesce() 方法)?

【问题讨论】:

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


    【解决方案1】:

    根据 Kafka API 合同,保证订购 Kafka 消费者

    但是,您正在写入的任何外部输出都可能会乱序触发。

    我真的不认为这对大多数下游系统来说不是问题...例如,如果您要插入数据库,那么您可以在那里按时间重新排序。如果您有 TSDB,那么您实际上是在“回填”数据。

    由于您要输出到控制台,这就是对您的 IO 的阻塞调用,因此,从一个线程(按顺序)读取一批 Kafka 事件,反序列化,然后在另一个线程上写入控制台(理想情况下在为了它们由 Spark 处理,但在这里调用 SparkSQL 排序 desc($"timestamp") 不会有什么坏处)。一旦完成,就可以提交 Kafka 偏移量,然后您继续从 Kafka 顺序读取(按偏移量顺序)......所有这些事件都不应该有任何这样的竞争条件,它们会出现故障。

    【讨论】:

    • 对于有关时间戳、水印、重新排序等的流处理主题,不妨看看这本书 - streamingsystems.net
    • cricket_007,很好的答案。在我的用例中,我不能使用带有事件时间、时间戳和水印的方法。我在 kafka 中拥有的数据来自 MySQL(通过链数据捕获获得),我已经意识到如果我执行一些插入...(例如)操作是如此之快,以至于我有时会获得重复的时间戳。我使用 ForeachWriter 将数据从 Spark 写入 Phoenix(jdbc 连接)以将其存储在 HBase 中。我注意到我正在按顺序存储所有交易。但我需要完全确定一切都井井有条。你认为在这种情况下会吗?
    • 一旦你得到多个分区,所有的赌注都没有了......执行写入的网络调用仍然会阻塞,但我没有每个目标系统的经验...... CDC 数据(Debezium?)带有时间戳。我不确定我是否遵循...如果您真的关心交货顺序,我只知道 Kafka Connect 提供了开箱即用的功能(并且确实存在 Hbase 社区,请不要将 JDBC 与凤凰)
    • 是的,我正在使用 Debezium。是的,它带有时间戳,但它对我没有用,因为正如我所说,一些查询是如此之快以至于时间戳被重复(两个不同的查询一个接一个地出现相同的时间戳值)。我使用 jdbc 是因为我采用了确切的原始查询(debezium 带有该选项),我对其进行解析(以避免将“插入”字转换为“upsert”)并将其写入 Phoenix。这是一个大学期末项目,它是展示从 SQL 到 NoSQL 转换的一个很好的例子。
    • Phoenix 对我的评价很差。 Hbase Thrift 连接似乎工作正常,但无论如何都不重要。但是,如果两个 Kafka 事件具有完全相同的时间戳,那么在给定随机机会的情况下,很难说哪个事件真正“首先”发生在您的源数据库上。因此,如果源无法确定绝对顺序,那么我不确定管道的其余部分能否弥补这一点
    猜你喜欢
    • 2018-01-09
    • 2019-08-26
    • 1970-01-01
    • 2021-11-23
    • 2017-11-23
    • 2016-11-28
    • 2021-01-30
    • 2021-09-30
    • 1970-01-01
    相关资源
    最近更新 更多