所以我的雇主让Avro的消息通过Kafka。我们希望将所有邮件存档到Amazon S3。理想情况下,它们将在白天存储在类似S3的目录中,并使用类似于:
的路径结构S3://my-bucket/data/day=2016-03-04/data.avro
是否有关于如何做到这一点的参考或最佳实践?
我的一个问题是幂等性:我如何提供写入幂等性,其中记录可以不止一次发送到我的接收器编写器,但只能存储在S3上一次。
我是否正确我需要幂等性?如果我实现一个简单的追加(非幂等),Kafka Connect可能会发送两次相同的记录,它们可能会被冗余存储?
答案 0 :(得分:4)
AFAIK,你不能附加到S3对象(文件):https://news.ycombinator.com/item?id=10746969 - 除非最近发生了某些变化....
您也不希望将每个事件单独编写到S3中,而是分批编写 - 出于明显的性能原因。
所以,我们采用的方式是使用Cassandra作为中间存储来收集事件一段时间(时间片) - 按 事件 次存储它们,而不是处理时间 - 然后定期写入触及S3的那些时间片。一个时间片将被存储到一个S3对象中 - 时间片信息是文件名的一部分。
如果/当更多事件发生在过去的时间片段时 - 它被添加到Cassandra中的那个时间片表中,并且[最终]被重新写入S3 - 这将再次获得该时间片的所有事件并写入S3使用相同的文件名,有效地覆盖现有文件。
您必须决定在Cassandra中保存数据的时间长短 - 基于您的管道如何工作以及如何"旧"你传入的事件可能是。
这就是我们实现幂等性的方式。它可能不是最有效的方式 - 但它适用于我们,因为我们有非常高的事件处理量和速率,Cassandra非常适合快速写入。
我很想知道其他人如何解决类似的问题!
答案 1 :(得分:2)
答案 2 :(得分:0)
从描述中看,它看起来像你正在寻找的是 1)Avro数据写入S3
2)要在S3中分区的数据
3)写作时一次性支持。
Qubole StreamX支持丰富多样的格式转换,avro是其中之一,还有数据分区。 而且,我们的管道中恰好有一次即将推出。
虽然secor已被弃用(在谷歌小组的一个回复中提及),但它也不支持avro。
所以你可以使用qubole streamx开始。