开发者社区 > 大数据与机器学习 > 实时计算 Flink > 正文

大佬们请教一个flink 重启生产者的问题,我通过检查点重启作业,但是sink的Kafka ?

大佬们请教一个flink 重启生产者的问题,我通过检查点重启作业,但是sink的Kafka topic换了,就一直报错说生产者尝试使用producer id,但是当前没有给其分配对应的transactional id,这个怎么解决?我通过网上了解到的 producer启动时Kafka会为其分配一个唯一的producer id,这个transactional id是我们自己手动指定的?image.png

展开
收起
真的很搞笑 2023-06-05 18:50:45 127 0
1 条回答
写回答
取消 提交回答
  • 存在即是合理

    在Flink中,Kafka的producer id是由Flink自动分配的,而transactional id需要手动指定。当通过检查点重启作业时,如果Kafka topic已经更改,则需要重新配置Kafka producer以使用新的topic和transactional id。

    以下是一些可能有用的步骤:

    1. 在Flink程序中,确保正确地设置了Kafka producer的topic和transactional id。可以使用以下代码片段来创建一个Kafka producer并设置其topic和transactional id:
    
    Properties props = new Properties();
    props.setProperty("bootstrap.servers", "localhost:9092");
    props.setProperty("group.id", "my-group");
    props.setProperty("enable.auto.commit", "false");
    props.setProperty("transactional.id", "my-txn-id");
    props.setProperty("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
    props.setProperty("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
    
    Producer<String, String> producer = new KafkaProducer<>(props);
    
    
    
    1. 在Flink程序中,确保正确地配置了Kafka sink以使用正确的topic和transactional id。可以使用以下代码片段来创建一个Kafka sink并设置其topic和transactional id:
    
    StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    DataStream<String> stream = env.fromElements("hello", "world");
    stream
        .addSink(new KafkaSinkFunction<>(topic, transactionalId, producer));
    env.execute("My Flink Job");
    
    class KafkaSinkFunction<T> extends RichSinkFunction<T> {
      private final String topic;
      private final String transactionalId;
      private final Producer<String, String> producer;
      
      public KafkaSinkFunction(String topic, String transactionalId, Producer<String, String> producer) {
        this.topic = topic;
        this.transactionalId = transactionalId;
        this.producer = producer;
      }
      
      @Override
      public void open(Configuration parameters) throws Exception {
        super.open(parameters);
      }
      
      @Override
      public void invoke(T value, Context context) throws Exception {
        producer.send(new ProducerRecord<>(topic, value));
      }
    }
    
    
    
    2023-06-08 11:21:52
    赞同 展开评论 打赏

实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。

相关产品

  • 实时计算 Flink版
  • 相关电子书

    更多
    Flink CDC Meetup PPT - 龚中强 立即下载
    Flink CDC Meetup PPT - 王赫 立即下载
    Flink CDC Meetup PPT - 覃立辉 立即下载