我们使用Logstash,我们想从Oracle数据库中读取一张表,并将这些消息(如下所示)发送给Kafka:
Topic1: message1: {"name":"name-1", "id":"fbd89256-12gh-10og-etdgn1234njF", "site":"site-1", "time":"2019-07-30"}
message2: {"name":"name-2", "id":"fbd89256-12gh-10og-etdgn1234njG", "site":"site-1", "time":"2019-07-30"}
message3: {"name":"name-3", "id":"fbd89256-12gh-10og-etdgn1234njS", "site":"site-1", "time":"2019-07-30"}
message4: {"name":"name-4", "id":"fbd89256-12gh-10og-etdgn1234njF", "site":"site-1", "time":"2019-07-30"}
请注意,message1
和message4
与same ID number
重复。
现在,我们希望确保所有消息都是唯一的,那么如何过滤topic1
并唯一化所有消息然后发送到topic2
?
我们想要的最终结果:
Topic2: message1: {"name":"name-1", "id":"fbd89256-12gh-10og-etdgn1234njF", "site":"site-1", "time":"2019-07-30"}
message2: {"name":"name-2", "id":"fbd89256-12gh-10og-etdgn1234njG", "site":"site-1", "time":"2019-07-30"}
message3: {"name":"name-3", "id":"fbd89256-12gh-10og-etdgn1234njS", "site":"site-1", "time":"
答案 0 :(得分:0)
这称为一次精确处理。
您可能会对Kafka FAQ的第一部分感兴趣,该部分描述了有关如何避免在数据生产中重复的一些方法(例如,在生产者方面):
语义一度只有两个部分:避免在数据期间重复 生产,并避免在数据消耗期间重复。
有两种方法可以在数据期间精确获取一次语义 生产:
- 每个分区以及每次访问网络时都使用一个写入器 错误检查该分区中的最后一条消息,以查看您的最后一条消息 写成功
- 在主目录中包含主键(UUID或其他内容) 消息并在消费者上进行重复数据删除。
如果您执行以下任一操作,则Kafka托管的日志将为 无重复。但是,没有重复的阅读取决于 也来自消费者的合作。如果消费者定期 检查它的位置,然后如果它失败并重新启动它将 从检查点位置重新启动。因此,如果数据输出和 检查点不是原子写的,将有可能得到 在这里也重复。此问题特定于您的存储 系统。例如,如果您使用的是数据库,则可以提交 这些一起进行交易。 HDFS加载程序Camus LinkedIn 对于Hadoop负载,Write做了类似的事情。另一种选择 不需要交易的是将偏移量与 使用主题/分区/偏移量加载和删除重复数据 组合。
我认为有两项改进可以使这变得容易得多:
- 生产商幂等可以自动完成,而且成本更低 通过有选择地在服务器上集成对此的支持。
- 现有 高水平的消费者不会暴露很多更细粒度的 控制偏移量(例如重置您的位置)。我们将努力 不久之后
另一个选择(并非完全符合您的要求)是日志压缩。假设重复的消息具有相同的密钥,则日志压缩策略有效时,日志压缩最终将删除重复项。