Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 卡夫卡流:我们是否应该提前每个键的流时间来测试加窗抑制?_Java_Apache Kafka_Apache Kafka Streams - Fatal编程技术网

Java 卡夫卡流:我们是否应该提前每个键的流时间来测试加窗抑制?

Java 卡夫卡流:我们是否应该提前每个键的流时间来测试加窗抑制?,java,apache-kafka,apache-kafka-streams,Java,Apache Kafka,Apache Kafka Streams,我从和中学到,为了用事件时间语义测试抑制,应该发送虚拟记录来提前流时间。 我一直试图通过这样做来延长时间。但这似乎不起作用,除非为某个特定的密钥提前了时间 我有一个定制的TimestampExtractor,它将我首选的“流时间”与记录相关联。 我的流拓扑伪代码如下(我使用Kafka Streams DSL API): 我的输入格式如下: 1 - {"stream_time":"2019-04-09T11:08:36.000-04:00", id:&

我从和中学到,为了用事件时间语义测试抑制,应该发送虚拟记录来提前流时间。 我一直试图通过这样做来延长时间。但这似乎不起作用,除非为某个特定的密钥提前了时间

我有一个定制的
TimestampExtractor
,它将我首选的“流时间”与记录相关联。 我的流拓扑伪代码如下(我使用Kafka Streams DSL API):

我的输入格式如下:

   1 - {"stream_time":"2019-04-09T11:08:36.000-04:00", id:"1", data:"..."}
   2 - {"stream_time":"2019-04-09T11:09:36.000-04:00", id:"1", data:"..."}
   3 - {"stream_time":"2019-04-09T11:18:36.000-04:00", id:"2", data:"..."}
   4 - {"stream_time":"2019-04-09T11:19:36.000-04:00", id:"2", data:"..."}
    .
    .
现在,根据
stream\u time
1
2
属于一个10分钟的窗口,
3和
4
属于另一个窗口。 在该窗口中,根据
id
聚合记录。 我预计记录
3
将发出流已前进的信号,并导致suppress发出与第一个窗口对应的数据。 但是,直到我发送一个id为
1
的虚拟记录来提前该键的流时间,数据才会发出


我是否错误地理解了测试说明?这是预期的行为吗?虚拟记录的密钥重要吗?

很抱歉给您添麻烦。这确实是一个棘手的问题。我有一些想法,可以添加一些操作来支持这种集成测试,但是如果不破坏基本的流处理时间语义,很难做到这一点

听起来您正在测试一个“真正的”KafkaStreams应用程序,而不是使用TopologyTestDriver进行测试。我的第一个建议是,如果TopologyTestDriver满足您的需要,那么您将有更好的时间使用它验证应用程序语义

在我看来,输入主题(以及应用程序)中可能有多个分区。如果键1转到一个分区,键3转到另一个分区,您将看到您观察到的结果。应用程序的每个分区都独立跟踪流时间。 TopologyTestDriver工作得很好,因为它只使用一个分区,而且还因为它同步处理数据。否则,您将不得不创建您的“虚拟”时间推进消息,使其与您试图清除的密钥位于同一分区

这将特别棘手,因为“flatMap().groupByKey()”将对数据进行重新分区。您必须手工创建虚拟消息,以便在重新分区后它进入正确的分区。或者您可以尝试将虚拟消息直接写入重新分区主题

如果您确实需要使用KafkaStreams而不是TopologyTestDriver进行测试,我想最简单的方法就是按照您在问题中的建议,为每个键编写一条“时间推进”消息。不是因为这是绝对必要的,而是因为这是满足所有这些警告的最简单方法。
我还要提到的是,我们正在对Kafka Streams中的流时间处理进行一些总体改进,这将大大简化情况,但这当然对您目前没有帮助。

谢谢!这是有道理的。如果我理解正确,我也应该能够使用KafkaStreams进行测试,只要我的输入主题中有一个分区?
   1 - {"stream_time":"2019-04-09T11:08:36.000-04:00", id:"1", data:"..."}
   2 - {"stream_time":"2019-04-09T11:09:36.000-04:00", id:"1", data:"..."}
   3 - {"stream_time":"2019-04-09T11:18:36.000-04:00", id:"2", data:"..."}
   4 - {"stream_time":"2019-04-09T11:19:36.000-04:00", id:"2", data:"..."}
    .
    .