所以我的雇主有通过Kafka传递的avro信息。我们要将所有消息归档到amazons3。理想情况下,它们每天都会存储在类似s3的目录中,并使用如下路径结构:
s3://my bucket/data/day=2016-03-04/data.avro
如何做好这一点,有没有参考或最佳实践?
我的一个问题是幂等性:如何提供写幂等性,即一个记录可以多次发送到我的sink writer,但只能存储在s3上一次。
我需要幂等性,对吗?如果我实现一个简单的append(非幂等),kafka connect可能会发送两次相同的记录,它们可能会被冗余存储?
3条答案
按热度按时间cx6n0qe31#
为什么不用像secor这样的东西呢?它还可以保证一次交货。
您还可以考虑基于“kafka connect”的实现,比如streamx。
chhqkbe12#
好的,您不能附加到s3对象(文件):https://news.ycombinator.com/item?id=10746969 -除非最近有什么变化。。。。
您也不希望继续将每个事件单独写入s3,而是分批执行—这显然是出于性能原因。
因此,我们这样做的方法是——使用cassandra作为中间存储来收集某个时间段的事件(时间片)——按事件时间而不是处理时间分组存储它们——然后周期性地将这些时间片写入s3。一个时间片将存储到一个s3对象中,时间片信息是文件名的一部分。
如果/当过去的某个时间片出现更多事件时-它被添加到cassandra中的该时间片表中,并[最终]触发对s3的重新写入-这将再次获取该时间片的所有事件并以相同的文件名写入s3,有效地覆盖现有文件(如果有的话)。
您必须根据管道的工作方式和传入事件的“旧”程度来决定在cassandra中保留数据的时间。
这就是我们实现幂等性的方法。这可能不是最有效的方法,但对我们来说效果很好,因为我们有非常高的事件处理量和速率,而且cassandra非常适合快速写入。
我很想听别人如何解决类似的问题!
3gtaxfhh3#
从描述上看,您要查找的似乎是1)avro数据写入s3
2) s3中要分区的数据
3) 写的时候正好支持一次。
qubole streamx支持多种格式转换,avro就是其中之一,还支持数据分区。而且,正好有一次是在我们的管道,这将很快出来。
然而,secor正在遭到抨击(在googlegroup上的一个回复中提到),它也不支持avro。
因此,您可以使用qubole streamx开始。