使用Kafka Streams DSL的两个Kafka主题的事件时间合并

时间:2019-09-04 11:45:02

标签: apache-kafka apache-kafka-streams

我正在寻找一种基于事件时间合并两个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算法的工作方式相同)

1 个答案:

答案 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,该自定义值从值中获取时间戳。