2016-06-07 78 views
1

因此,我的雇主通过卡夫卡的Avro消息。我们希望将所有邮件归档到Amazon S3。理想情况下,他们将一天被存储在S3样目录,并使用通路结构是这样的:Avro Records - > Kafka - > Kafka Connect Sink - > Amazon S3 Storage。幂等?

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

如何做到这一点有没有参考或最佳实践?

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

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

回答

4

AFAIK,你不能追加到S3对象(文件):https://news.ycombinator.com/item?id=10746969 - 除非有非常最近改变了....

你也不想保留单独写每个事件到S3,而是做批量 - 出于明显的性能原因。

所以,我们做事的方式 - 是使用卡桑德拉作为中间存储来收集一些时间(时间片)事件 - 储存他们被事件分组倍,不处理时间 - 然后写那些定期触及到S3的时间片。一个时间片将被存储到一个S3对象中 - 时间片信息是文件名的一部分。

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

您必须决定您想要在卡桑德拉保留数据多长时间 - 根据您的管道工作方式以及传入事件的“旧”情况。

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

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

2

为什么不使用类似secor的东西?它也为一次交付提供了一些保证。

你也可以考虑基于“kafka connect”的实现,如streamx

0

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

2)数据同时写入到S3

3分区)恰好一次支持。

Qubole StreamX支持丰富多样的格式转换,其中包括数据分区和其中之一。 而且,我们正在准备一次即将推出的产品。

secor正在被弃用(在他们对谷歌组的反应之一中提到),它也不支持avro。

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

相关问题