【问题标题】:Kafka S3 Sink Connector - how to mark a partition as completeKafka S3 Sink Connector - 如何将分区标记为完整
【发布时间】:2021-02-02 23:27:24
【问题描述】:

我正在使用 Kafka 接收器连接器将数据从 Kafka 写入 s3。输出数据被划分为每小时存储桶 - year=yyyy/month=MM/day=dd/hour=hh。此数据由下游的批处理作业使用。因此,在开始下游作业之前,我需要确保在该分区的处理开始后,不会有额外的数据到达该分区。

设计这个的最佳方式是什么?如何将分区标记为完整?即,一旦标记为完成,将不会向其写入任何其他数据。

编辑:我使用 RecordField 作为 timestamp.extractor。我的 kafka 消息保证按分区字段在分区内排序

【问题讨论】:

    标签: apache-spark apache-kafka batch-processing hadoop-partitioning system-design


    【解决方案1】:

    取决于您在 Sink 配置中使用的时间戳提取器。

    您必须保证没有记录的时间戳可以早于您使用它的时间。

    AFAIK,唯一可行的方法是使用 WallClock Timestamp Extractor。否则,您将使用 Kafka Record 时间戳,或每条消息中的某个时间戳。两者都可以在过去的某个事件的 Producer 端被覆盖

    【讨论】:

    • 我使用RecordField 作为timestamp.extractor。我的 kafka 消息保证在 kafka 分区中按此字段排序。
    • 你们如何保证?如果明天有人在他们的记录中将该字段设置为 -1 时间戳,那将是一个问题,对吧?如果您可以完全控制生成的时间戳,那么除了处理消费者延迟之外,分区肯定没有问题
    • kafka 消息对应来自 postgres 的 CDC 数据。因此,源时间戳严格增加。所以数据以预先排序的方式出现。然后我使用这个字段来创建分区。
    • 有道理。尽管如此,连接器中的 S3 前缀的“完成”没有语义,因为它没有数据来源的上下文
    • 我想这会行得通,假设集群是正常运行的......我们也有一个类似的过程来处理 S3 数据,我认为数据分析师只是假设数据会在那里。其他人喜欢检查最近写入文件的偏移量的时间戳(它在文件名中)
    猜你喜欢
    • 2020-06-03
    • 2021-03-16
    • 2020-12-11
    • 1970-01-01
    • 2021-09-17
    • 2022-07-12
    • 2017-09-13
    • 2019-12-02
    • 2021-10-01
    相关资源
    最近更新 更多