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 KTable不使用相同的密钥对传入记录进行重复数据消除_Apache Kafka_Spring Kafka_Spring Cloud Stream_Spring Cloud Stream Binder Kafka - Fatal编程技术网

Apache kafka KTable不使用相同的密钥对传入记录进行重复数据消除

Apache kafka KTable不使用相同的密钥对传入记录进行重复数据消除,apache-kafka,spring-kafka,spring-cloud-stream,spring-cloud-stream-binder-kafka,Apache Kafka,Spring Kafka,Spring Cloud Stream,Spring Cloud Stream Binder Kafka,我正在尝试使用输入主题作为KTable来消除记录的重复,并将它们放入输出主题。但是KTable仍然将重复记录下沉到输出主题。我不知道我哪里出错了 这是我的申请表 spring: cloud: stream: function: bindings: process-in-0: input.topic process-out-0: output.topic definition: process

我正在尝试使用输入主题作为KTable来消除记录的重复,并将它们放入输出主题。但是KTable仍然将重复记录下沉到输出主题。我不知道我哪里出错了

这是我的申请表

spring:
  cloud:
    stream:
      function:
        bindings:
          process-in-0: input.topic
          process-out-0: output.topic
        definition: process
      kafka:
        streams:
          bindings:
            process-in-0:
              consumer:
                materializedAs: incoming-store
          binder:
            application-id: spring-cloud-uppercase-app
            brokers: localhost:9092
            configuration:
              commit:
                interval:
                  ms: 1000
                state.dir: state-store
              default:
                key:
                  serde: org.apache.kafka.common.serialization.Serdes$StringSerde
                value:
                  serde: org.apache.kafka.common.serialization.Serdes$StringSerde
根据spring cloud stream kafka stream about state store,我添加了上面的物化视图,作为
incoming store

process()bean函数将输入主题作为KTable,并将其放入输出主题


@豆子
公共职能流程(){
返回表格->表格
.toStream()
.peek((k,v)->log.info(“接收的键={},值={}”,k,v));
}
对于4条记录的给定输入

key=111, value="a"
key=111, value="a"
key=222, value="b"
key=111, value="a"
我只希望得到2张唱片

key=111, value="a"
key=222, value="b"

但是要拿到所有的4张唱片。任何帮助都将不胜感激

我认为你要解决的问题,通过这里的主题会很好地解决。 一旦将具有相同密钥的数据交付到压缩主题,并且在代理级别上启用了压缩(默认情况下启用),每个代理将启动一个压缩管理器线程和多个压缩线程。他们负责执行压实任务。 压缩只会保留每个键的最新值,并清除旧的(脏的)条目


有关更多详细信息,请参阅卡夫卡文档。

您可以按键分组并聚合事件。虽然在聚合过程中没有连接字符串,但是
aggregate
转换将仅用于发出您正在按键
111
222
分组的值。您的用例只是一个独特的聚合。每次聚合时,您将收到
(键、值、聚合)
,然后您只保留将成为最新值的

@Slf4j
@Configuration
@EnableAutoConfiguration
public class KafkaAggFunctionalService {

    @Bean
    public Function<KTable<String, String>, KStream<String, String>> aggregate() {
        return table -> table
                .toStream()
                .groupBy((key, value) -> key, Grouped.with(Serdes.String(), Serdes.String()))
                .aggregate(() -> "", (key, value, aggregate) ->
                                value,
                        Materialized.<String, String, KeyValueStore<Bytes, byte[]>>as("test-events-snapshots").withKeySerde(Serdes.String()).withValueSerde(Serdes.String())
                )
                .toStream()
                .peek((k, v) -> log.info("Received key={}, value={}", k, v));
    }
}
@Slf4j
@配置
@启用自动配置
公共类Kafkaagg功能服务{
@豆子
公共职能汇总(){
返回表格->表格
.toStream()
.groupBy((键,值)->key,Grouped.with(Serdes.String(),Serdes.String()))
.聚合(()->“”,(键、值、聚合)->
价值
具体化.as(“测试事件快照”)。withKeySerde(Serdes.String())。withValueSerde(Serdes.String())
)
.toStream()
.peek((k,v)->log.info(“接收的键={},值={}”,k,v));
}
}

这有很多例子。我使用的是SpringCloudStream,它抽象了KTable table=streamBuilder.toTable(“input.topic”);进入函数您验证了输出主题的配置了吗,它是一个压缩主题吗?我在输入主题的流应用程序中使用KTable这个抽象,并将其转换为KStream,将结果放入输出主题,因此我不希望将输出主题配置为使用任何配置(如--config)进行日志压缩“cleanup.policy=compact“。问题是关于云kafka活页夹不接受ktable输入。我会通过基于
聚合事件来解决这个问题,并且基于您的输入设置一个时间窗口,我不确定您正在尝试做什么。”。您是否正在尝试压缩事件而不使用
KStream
转换它们?我正在尝试仅保留给定事件的最新更新。因此,如果我得到key=111的相同记录,那么我需要保留最新的记录。我可以通过将流转换为类似于