Apache flink 如何在ApacheKafka连接器中实现一次语义

Apache flink 如何在ApacheKafka连接器中实现一次语义,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我使用的是flink 1.8.0版。我的应用程序从kafka->transform->publish to kafka读取数据。为了避免重新启动期间出现任何重复,我想使用kafka producer的精确一次语义,请在此处阅读: 我的卡夫卡版本是1.1 return new FlinkKafkaProducer<String>( topic, new KeyedSerializationSchema<String>() {

我使用的是flink 1.8.0版。我的应用程序从kafka->transform->publish to kafka读取数据。为了避免重新启动期间出现任何重复,我想使用kafka producer的精确一次语义,请在此处阅读:

我的卡夫卡版本是1.1

        return new FlinkKafkaProducer<String>( topic,  new KeyedSerializationSchema<String>() {


            public byte[] serializeKey(String element) {
                // TODO Auto-generated method stub
                return element.getBytes();
            }


            public byte[] serializeValue(String element) {
                // TODO Auto-generated method stub
                return element.getBytes();
            }


            public String getTargetTopic(String element) {
                // TODO Auto-generated method stub
                return topic;
            }
        },prop, opt, FlinkKafkaProducer.Semantic.EXACTLY_ONCE, 1);
如果我在kafka producer中只添加一次语义,我的flink消费者不会读取任何新数据

任何人都可以用一次语义共享任何示例代码/应用程序吗

请在此处找到完整的代码:

谢谢

任何人都可以用一次语义共享任何示例代码/应用程序吗

一个仅一次的示例隐藏在。由于它使用了一些方便的功能,如果不检查整个回购协议,可能很难遵循

如果我在卡夫卡制作人,我的flink消费者中添加一次语义 没有读取任何新数据。 [...] 请在此处找到完整的代码:

我检查了您的代码并发现了问题(必须修复整个设置/代码才能真正运行)。接收器实际上无法正确配置事务。如中所述,您需要在Kafka broker中将
transaction.timeout.ms
调整为1小时,或在应用程序中将其调整为15分钟:

    prop.setProperty("transaction.timeout.ms", "900000");
有关摘录如下:

默认情况下,Kafka代理将transaction.max.timeout.ms设置为15分钟。此属性不允许为大于其值的生产者设置事务超时。默认情况下,FlinkKafkaProducer011将producer config中的transaction.timeout.ms属性设置为1小时,因此在使用Semantic.unce模式之前,应增加transaction.max.timeout.ms


在此处添加了代码:。在同一个代码中,如果我至少使用一次,它工作得很好。感谢Arvid向我解释这个问题。在您提到的评论中,您必须修复整个设置/代码才能真正运行它。如果您能解释除了transaction.timeout.ms config之外,还需要更改哪些内容,这将非常有用?如果你也能分享完整的代码,那就更有帮助了。提前感谢我在您的回购协议中添加了一个拉取请求。
    prop.setProperty("transaction.timeout.ms", "900000");