我正在寻找一种基于事件时间合并两个Kafka主题的方法。
例如,我有两个主题,其结构如下{event-key}:: {event-time-as-value}
topic I - { {1 :: 12:00pm} {2 :: 12:10pm} {3 :: 14:50pm} {4 :: 15:00pm} }
topic II - { {1 :: 13:00pm} {2 :: 13:10pm} {3 :: 15:50pm} {4 :: 16:00pm} }
预期输出应如下所示:
{ {1 :: 12:00pm} {2 :: 12:10pm} {1 :: 13:00pm} {2 :: 13:10pm} {3 :: 14:50pm} {4 :: 15:00pm} {3 :: 15:50pm} {4 :: 16:00pm} }
有没有办法使用Kafka Streams DSL?
注释 :很有可能原始主题未按事件时间排序,这没关系。我希望该算法始终选择当前每个主题开头的两个事件中的最早事件(与merge two sorted arrays算法的工作方式相同)
答案 0 :(得分:3)
Kafka Streams(从2.1.0版开始)实现您描述的确切算法。因此,一个简单的:
StreamsBuilder builder = new StreamsBuilder();
builder
.stream(Arrays.asList("firstInputTopic", "secondInputTopic"))
.to("outputTopidName");
应该做你想要的。请注意,该程序将基于分区合并数据。
还要考虑配置max.task.idle.ms
。
有关更多详细信息,请阅读相应的KIP:https://cwiki.apache.org/confluence/display/KAFKA/KIP-353%3A+Improve+Kafka+Streams+Timestamp+Synchronization
此外,您需要实现并配置一个自定义TimestampExtractor
,该自定义值从值中获取时间戳。