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
Apache kafka 为什么在Kafka Streams中使用SessionWindows时聚合可以工作?_Apache Kafka_Apache Kafka Streams_Spring Cloud Stream - Fatal编程技术网

Apache kafka 为什么在Kafka Streams中使用SessionWindows时聚合可以工作?

Apache kafka 为什么在Kafka Streams中使用SessionWindows时聚合可以工作?,apache-kafka,apache-kafka-streams,spring-cloud-stream,Apache Kafka,Apache Kafka Streams,Spring Cloud Stream,我已经在Kafka Streams中使用SessionWindows测试了简单代码。 (Spring云流版本:Elmhurst.SR1,卡夫卡版本:1.0.1。) 我读过这篇文章,但我不知道为什么计数值为空,窗口的开始时间和结束时间重叠。 我做错什么了吗 请帮助我。如果合并了两个会话窗口,首先会创建一个新的合并窗口,然后删除旧的两个窗口。您看到的nulls是那些删除 更新: 从Kafka 2.1.0开始,可以使用suppress()操作符来抑制中间更新,并且每个窗口只发出一个最终结果。提示:在

我已经在Kafka Streams中使用SessionWindows测试了简单代码。
(Spring云流版本:Elmhurst.SR1,卡夫卡版本:1.0.1。)

我读过这篇文章,但我不知道为什么计数值为空,窗口的开始时间和结束时间重叠。 我做错什么了吗


请帮助我。

如果合并了两个会话窗口,首先会创建一个新的合并窗口,然后删除旧的两个窗口。您看到的
null
s是那些删除

更新:


从Kafka 2.1.0开始,可以使用
suppress()
操作符来抑制中间更新,并且每个窗口只发出一个最终结果。提示:在2.1.0中,
suppress()
有一些错误,建议使用
2.3.1
release for
suppress()
以确保其正常工作:)

我不知道这是否可能。。。有没有办法只看到最终合并的窗口?没有。Kafka Streams处理模式是连续更新,以提供最小的延迟。但是,如果你知道数据的最大“延迟”,你可以等到这个时间过去,并考虑现有的Windows“结束时间戳-差距-当前时间-最大延迟”,因为那些将不再被更新,因此是最终的.@ Matthasj.SAX,我相信我们可以使用Supress()。方法避免发出中间结果。如果我错了,请纠正我。是的,听起来正确。我假设我在将
suppress()
添加到Kafka Streams:)之前放置了此答案
@EnableBinding(StreamTestChanel.class)
public class MyKafkaStreamsTest {
   private final Logger logger = LoggerFactory.getLogger(getClass());

   @Value("${window.session.gapSeconds:5}")
   private long gapSeconds;
   @Value("${window.session.durationSeconds:20}")
   private long durationSeconds;

   private SessionWindows sessionWindows = SessionWindows.with(TimeUnit.SECONDS.toMillis(gapSeconds)).until(TimeUnit.SECONDS.toMillis(durationSeconds));

   @StreamListener(StreamTestChanel.CHANEL_INPUT)
   public void process(KStream<String, MyLog> input) {

       input
            .groupByKey()
            .windowedBy(sessionWindows)
            .count() // aggregation
            .toStream() // KTable to KStream
            .foreach((key, count) -> {
                logger.debug("## start --> window time : [{}] - [{}], key : {}({})", DateFormatUtils.format(key.window().start(), "yyyy-MM-dd HH:mm:ss.SSS"), DateFormatUtils.format(key.window().end(), "yyyy-MM-dd HH:mm:ss.SSS"), key.key(), count);
            });
   }
}
2018-11-14 17:22:29 [DEBUG](MyKafkaStreamsTest.java:52) ## start --> window time : [2018-11-14 17:22:24.396] - [2018-11-14 17:22:28.866], key : test15(75)
2018-11-14 17:22:34 [DEBUG](MyKafkaStreamsTest.java:52) ## start --> window time : [2018-11-14 17:22:24.396] - [2018-11-14 17:22:28.866], key : test15(null)
2018-11-14 17:22:44 [DEBUG](MyKafkaStreamsTest.java:52) ## start --> window time : [2018-11-14 17:22:24.421] - [2018-11-14 17:22:38.979], key : test06(null)
2018-11-14 17:22:44 [DEBUG](MyKafkaStreamsTest.java:52) ## start --> window time : [2018-11-14 17:22:24.421] - [2018-11-14 17:22:40.103], key : test06(165)
2018-11-14 17:22:44 [DEBUG](MyKafkaStreamsTest.java:52) ## start --> window time : [2018-11-14 17:22:24.438] - [2018-11-14 17:22:38.992], key : test01(null)
2018-11-14 17:22:45 [DEBUG](MyKafkaStreamsTest.java:52) ## start --> window time : [2018-11-14 17:22:24.438] - [2018-11-14 17:22:42.256], key : test01(165)