我设置了kafka connect s3接收器,持续时间设置为1小时,而且我设置了一个相当大的刷新计数,比如10,000。现在,如果kafka通道中的消息不多,s3接收器将尝试在内存中缓冲它们,并等待它累积到刷新计数,然后将它们一起上传并将偏移量提交给它自己的消费者组。
但想想这种情况。如果在频道中,我只发送5,000条消息。然后没有s3水槽冲洗。然后很长一段时间后,由于保留时间,最终将从kafka驱逐5,000条消息。但是这些消息仍然在s3 sink的内存中,而不是在s3中。这是非常危险的,例如,如果我们重新启动s3接收器或运行s3接收器的机器崩溃。然后我们丢失了这5000条消息。我们无法再从kafka找到它们,因为它已被删除。
这会发生在s3下沉吗?或者有一些设置会在一段时间后强制它冲洗?
答案 0 :(得分:1)
如果从Kafka到S3的流没有恒定的记录流,您可以使用属性
按计划的时间间隔刷新记录。
注意,在重新处理下游系统的情况下,如果使用此选项,则应该能够处理重复项。这是因为如果连接器被安排从Kafka重新导出记录,则根据挂钟刷新这些记录可能会导致重复出现在不同的文件中。
作为旁注,如果您使用属性:
使用Wallclock
时间戳提取程序(timestamp.extractor=Wallclock
),您的记录将在不设置rotate.schedule.interval.ms
的情况下刷新。但这意味着您的分区依赖于挂钟,因此您应该能够考虑重复记录。
连接器能够在具有确定性分区器的恒定记录流上提供一次性传递,并具有各种时间戳提取器,例如取决于记录的时间戳(Record
)或字段时间戳(RecordField
)。
分区here
的配置属性