2022更文挑战1-如何将kafka作为flink数据源及输出节点

301 阅读2分钟

「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战」。

如何将kafka作为flink数据源及输出节点

前文

本文为对于kafka学习过程中经验的总结,难免有不足之处,还请见谅。

环境准备

本文采用的开发环境为flink,版本1.10,同时需要预先准备好java8开发环境,此处不再进行赘述。由于需要与卡夫卡进行通信,因此需要再项目中引入卡夫卡连接的依赖包。考虑到版本适配关系,flink采用了2.12的版本,因此卡夫卡连接配置也需要采用2.12版本。因此在pom中引入如下依赖。

<dependency>
  <groupId>org.apache.flink</groupId>
  <artifactId>flink-connector-kafka_2.12</artifactId>
  <version>1.9.1</version>
</dependency>

代码及分析

具体的代码如下所示,通过代码逐行进行一下解析。

    public static void main(String[] args) throws Exception {
    //        声明运行环境
            StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    //        设置程序并行度
            env.setParallelism(8);
    //        声明数据源
            Properties properties = new Properties();
            properties.setProperty("bootstrap.servers", "127.0.0.1:9092");
            properties.setProperty("group.id", "test111");
            properties.setProperty("auto.offset.reset", "earliest");
            FlinkKafkaConsumer<String> myConsumer = new FlinkKafkaConsumer<>("kafka_in", new SimpleStringSchema(), properties);
            DataStreamSource<String> dataStream = env.addSource(myConsumer);
            SingleOutputStreamOperator<Object> process = dataStream.process(new ProcessFunction<String, Object>() {
                @Override
                public void processElement(String s, Context context, Collector<Object> collector) throws Exception {
                    System.out.println(s);
                    System.out.println(context.timerService().currentProcessingTime());
                    collector.collect(s);
                }
            });
            SinkFunction<Object> producer = new FlinkKafkaProducer("kafka_out",
                new KafkaSerializationSchema<String>() {
                    @Override
                    public ProducerRecord<byte[], byte[]> serialize(String o, @org.jetbrains.annotations.Nullable Long aLong) {
                        ProducerRecord<byte[], byte[]> producerRecord = new ProducerRecord<byte[], byte[]>("kafka_out",o.getBytes(StandardCharsets.UTF_8));
                        return producerRecord;
                    }
                },
                properties, FlinkKafkaProducer.Semantic.EXACTLY_ONCE);

            process.addSink(producer);
    //        执行flink程序
            env.execute("kafka.test");
        }
  • 首先需要声明一个flink的运行环境,将并行度设置为8。
  • 接下来要对数据源进行配置,由于本文采用卡夫卡作为数据源,因此在此处配置好卡夫卡相关的连接信息,以及消费者组和偏移量等相关卡夫卡信息。
  • 指定卡夫卡作为flink的数据源,并设置消费主题,同时利用SimpleStringSchema作为解码器。
  • 指定卡夫卡作为flink的输出节点,与数据源的配置类似,并指定输出主题。
  • 最后,执行程序即可。 以上,即为同时采用卡夫卡作为数据源及输出节点的方案。通过这样设置,就可以从卡夫卡的指定主题读取消息数据,然后再对消息进行处理,最后输出到新的主题中。

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。