使用多个分区时,在kafka上标记逻辑部分的结尾

时间:2019-12-12 12:16:33

标签: apache-kafka

我想分享我所使用的问题和解决方案,因为如果人们有其他解决方案,请与我分享,这可能对他人有益。

我有一个表,该表包含1,000,000行,我想将其发送到kafka,并将数据分布在20个分区之间。 我想在生产者到达数据结尾时通知消费者,我不想在生产者和消费者之间建立直接联系。

我知道kafka被设计为逻辑无穷的数据流,但是我仍然需要标记特定表的末尾。

2 个答案:

答案 0 :(得分:0)

解决方案1:

我实际上希望每个分区上的最后一条消息表明它是最后一条消息。

我可以提前做一些工作,创建一些随机消息密钥,发送按密钥划分的消息,并测试每条消息的目标分区。由于按键进行分区是确定性的(对于给定的分区数),我想准备一个键与目标分区的映射。例如,密钥:“ xyz”定向到分区#0,密钥“ hjk”定向到分区#1等,最后具有反向映射,因此对于分区0,请使用密钥“ xyz”,对于分区1,请使用密钥'hjk'等。

现在,我可以使用随机分区策略发送整个表格(最后20行除外),因此,对于几乎整个表格,数据分布在各个分区之间。 当我进入最后20行时,我将使用分区键将其发送,并为每个邮件分区键进行设置,以将邮件哈希到另一个分区。这样,20个分区中的每个分区都将获取最后20条消息之一。对于最后20条消息中的每条消息,我将设置一个相关的标头,其中将标明这是最后一条。

解决方案2: 与解决方案1类似,但是将整个表散布到随机分区。现在发送20条元数据消息,我将使用按键分区策略(通过设置适当的键)将其定向到20个分区。

解决方案3: 有其他控制主题。在将表完全发送到数据主题之后,向控制主题发送一条消息,说明表已完成。使用者将需要不时测试控制主题,当它收到“数据结束”消息时,它将知道,如果到达分区的末尾,则实际上到达了该分区的数据末尾。此解决方案不太灵活,建议不要使用,但我也写了它。

答案 1 :(得分:0)

另一种解决方案是使用S3的开源类似物(例如minio.io)。生产者可以上传数据,发送带有对象存储链接的消息。收集后,消费者将从对象存储中删除数据。