【问题标题】:Avro Records -> Kafka -> Kafka Connect Sink -> Amazon S3 Storage. Idempotency?Avro 记录 -> Kafka -> Kafka Connect Sink -> Amazon S3 存储。幂等性?
【发布时间】:2017-11-16 16:14:39
【问题描述】:

所以我的雇主有通过 Kafka 的 Avro 消息。我们希望将所有消息存档到 Amazon S3。理想情况下,它们将按天存储在类似 S3 的目录中,并使用类似以下的路径结构:

s3://my-bucket/data/day=2016-03-04/data.avro

是否有关于如何做好这件事的参考或最佳实践?

我的一个问题是幂等性:我如何提供写入幂等性,在这种情况下,一条记录可以多次发送到我的接收器写入器,但只能在 S3 上存储一次。

我需要幂等性是否正确?如果我实现一个简单的追加(非幂等),Kafka Connect 可能会发送两次相同的记录,并且它们可能会被冗余存储?

【问题讨论】:

    标签: amazon-s3 apache-kafka idempotent


    【解决方案1】:

    AFAIK,您不能附加到 S3 对象(文件):https://news.ycombinator.com/item?id=10746969 - 除非最近发生了变化......

    您也不希望将每个事件单独写入 S3,而是分批进行 - 出于明显的性能原因。

    所以,我们这样做的方式 - 使用 Cassandra 作为中间存储来收集一段时间内的事件(时间片) - 按事件次分组存储它们,而不是处理时间 - 然后将那些定期接触到 S3 的时间片写入。一个时间片将存储到一个 S3 对象中 - 时间片信息是文件名的一部分。

    如果/当更多事件发生在过去的某个时间片中 - 它被添加到 Cassandra 中的时间片表中,并且 [最终] 触发了对 S3 的重新写入 - 这将再次获取该时间片的所有事件并写入 S3具有相同的文件名,有效地覆盖现有文件(如果有)。

    您必须决定要将数据在 Cassandra 中保留多长时间 - 基于管道的工作方式以及传入事件的“旧”时间。

    这就是我们实现幂等性的方式。这可能不是最有效的方式 - 但它对我们很有效,因为我们的事件处理量和速率非常高,而 Cassandra 非常适合快速写入。

    我很想听听其他人如何解决类似问题!

    【讨论】:

      【解决方案2】:

      为什么不使用secor 之类的东西?它也有一些保证一次性交付。

      您还可以考虑基于“kafka connect”的实现,例如 streamx。

      【讨论】:

        【解决方案3】:

        从描述看来,您正在寻找的是 1) Avro 数据写入 S3

        2) S3中要分区的数据

        3) 编写时支持 Exactly-once。

        Qubole StreamX 支持多种格式转换,avro 就是其中之一,还有数据分区。 而且,只有一次在我们的管道中,很快就会出来。

        虽然 secor 已被弃用(在他们对 google 组的回复中提到),它也不支持 avro。

        所以你可以使用 qubole streamx 开始。

        【讨论】:

        • 我听说 StreamX 也被弃用了,或者至少没有维护或更新
        猜你喜欢
        • 2017-06-08
        • 2019-12-02
        • 2021-09-08
        • 2018-06-16
        • 2020-06-15
        • 2019-05-12
        • 2018-10-20
        • 2020-05-28
        • 2017-06-23
        相关资源
        最近更新 更多