Avro Records - >卡夫卡 - > Kafka Connect Sink - >亚马逊S3存储。幂等?

时间:2016-06-07 16:56:42

标签: amazon-s3 apache-kafka idempotent

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

的路径结构

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

是否有关于如何做到这一点的参考或最佳实践?

我的一个问题是幂等性:我如何提供写入幂等性,其中记录可以不止一次发送到我的接收器编写器,但只能存储在S3上一次。

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

3 个答案:

答案 0 :(得分:4)

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

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

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

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

您必须决定在Cassandra中保存数据的时间长短 - 基于您的管道如何工作以及如何"旧"你传入的事件可能是。

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

我很想知道其他人如何解决类似的问题!

答案 1 :(得分:2)

为什么不使用像secor这样的东西?它也可以在一次交付时提供一些保证。

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

答案 2 :(得分:0)

从描述中看,它看起来像你正在寻找的是 1)Avro数据写入S3

2)要在S3中分区的数据

3)写作时一次性支持。

Qubole StreamX支持丰富多样的格式转换,avro是其中之一,还有数据分区。 而且,我们的管道中恰好有一次即将推出。

虽然secor已被弃用(在谷歌小组的一个回复中提及),但它也不支持avro。

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