Kafka Stream Reducer不减少记​​录

时间:2018-09-26 19:53:02

标签: apache-kafka apache-kafka-streams

下面是一些示例代码,我们试图根据一些记录值(在本例中为id)删除重复项。当我发布具有相同ID的2条记录时,我收到了两个打印语句。我期待1.我是流媒体新手,所以我确定我误会了一些东西。

 kstream.groupBy((key, value) -> value.getId())
                    .reduce((aggValue, newValue) -> aggValue)
                    .toStream()
                    .foreach((key,value) -> {
                        System.out.println(value);
                    })

1 个答案:

答案 0 :(得分:2)

reduce操作根据定义的加法器产生一个ktable。

KTable<Interger, String> aggregatedStream = kstream.groupBy((key, value) -> value.getId())
                    .reduce((aggValue, newValue) -> aggValue)

SO kTable将具有任何ID(来自value.getID()中的键)的最新值。

Kafka流支持逐事件处理。如果记录缓存被禁用,它将触发每个事件的操作。因此,该方法针对2条记录被调用两次,并且print语句将返回该记录的最新值。

聚合计算输入的记录值总和(按键分组)并返回KTable。

示例:

不进行缓存::将为键A发出一系列输出记录,这些记录表示结果汇总表中的更改。括号(())表示更改,左边的数字是新的聚合值,右边的数字是旧的聚合值:<A, (1, null)>, <A, (21, 1)>, <A, (321, 21)>.

具有缓存::将为密钥A发出单个输出记录,该记录可能会在缓存中压缩,从而导致单个输出记录<A, (321, null)>。该记录将写入聚合的内部状态存储中,并转发给任何下游操作。

通过cache.max.bytes.buffering参数指定缓存大小,该参数是每个处理拓扑的全局设置。您可以这样设置属性:

// Enable record cache of size 10 MB.
Properties streamsConfiguration = new Properties();
streamsConfiguration.put(StreamsConfig.CACHE_MAX_BYTES_BUFFERING_CONFIG, 10 * 1024 * 1024L);