我们如何强制融合kafka连接s3接收器冲洗

时间:2018-06-08 13:42:12

标签: amazon-s3 apache-kafka apache-kafka-connect confluent

我设置了kafka connect s3接收器,持续时间设置为1小时,而且我设置了一个相当大的刷新计数,比如10,000。现在,如果kafka通道中的消息不多,s3接收器将尝试在内存中缓冲它们,并等待它累积到刷新计数,然后将它们一起上传并将偏移量提交给它自己的消费者组。

但想想这种情况。如果在频道中,我只发送5,000条消息。然后没有s3水槽冲洗。然后很长一段时间后,由于保留时间,最终将从kafka驱逐5,000条消息。但是这些消息仍然在s3 sink的内存中,而不是在s3中。这是非常危险的,例如,如果我们重新启动s3接收器或运行s3接收器的机器崩溃。然后我们丢失了这5000条消息。我们无法再从kafka找到它们,因为它已被删除。

这会发生在s3下沉吗?或者有一些设置会在一段时间后强制它冲洗?

1 个答案:

答案 0 :(得分:1)

如果从Kafka到S3的流没有恒定的记录流,您可以使用属性

rotate.schedule.interval.ms

按计划的时间间隔刷新记录。

注意,在重新处理下游系统的情况下,如果使用此选项,则应该能够处理重复项。这是因为如果连接器被安排从Kafka重新导出记录,则根据挂钟刷新这些记录可能会导致重复出现在不同的文件中。

作为旁注,如果您使用属性:

rotate.interval.ms

使用Wallclock时间戳提取程序(timestamp.extractor=Wallclock),您的记录将在不设置rotate.schedule.interval.ms的情况下刷新。但这意味着您的分区依赖于挂钟,因此您应该能够考虑重复记录。

连接器能够在具有确定性分区器的恒定记录流上提供一次性传递,并具有各种时间戳提取器,例如取决于记录的时间戳(Record)或字段时间戳(RecordField)。

分区here

的配置属性