【FLink消费Kafka之FlinkConsumer到KafkaSource的转变】


前言

上篇介绍了flink的入门程序wordcount,在项目开发过程中,最常接触的还是跟各种源头系统打交道,其中消费接收kafka中的数据是最常见的情况,而flink在1.15版本后连接kafka的依赖包发生了变化,之前的flink版本使用的依赖包是flink-connector-kafka_2.1x(后面的数字代表kafka环境的scala版本),从flink1.15版本开始引用的依赖包变为flink-connector-kafka,具体的maven配置信息如下:


提示:以下为flink1.14及以下版本maven配置:

bash 复制代码
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-connector-kafka_2.12</artifactId>
            <version>${flink.vesrion}</version>
        </dependency> 

提示:以下为flink1.15及以上版本maven配置:

bash 复制代码
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-connector-kafka</artifactId>
            <version>${flink.vesrion}</version>
        </dependency> 

一、FlinkConsumer消费kafka

FlinkConsumer使用起来感觉和普通的kafka consumer java api差不多

bash 复制代码
import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer;
import java.util.Properties;

public class FlinkConsumerTest {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        Properties properties = new Properties();
        properties.setProperty("bootstrap.servers","cdp1:9092");
        properties.setProperty("group.id","tes");
        properties.setProperty("key.deserializer","org.apache.kafka.common.serialization.StringDeserializer");
        properties.setProperty("value.deserializer","org.apache.kafka.common.serialization.StringDeserializer");
        properties.setProperty("auto.offset.rest","latest");

        FlinkKafkaConsumer consumer = new FlinkKafkaConsumer<>("event_topic",new SimpleStringSchema(),properties);
        consumer.setStartFromLatest();
        DataStream<String> stream = env.addSource(consumer);
        stream.print();
        env.execute();
    }
}

二、KafkaSource消费kafka

FlinkConsumer在flink1.15版本后,已经被弃用,推出了新的消费kafka的KafkaSource,文档地址为https://nightlies.apache.org/flink/flink-docs-release-1.17/docs/connectors/datastream/kafka/

c 复制代码
import org.apache.flink.api.common.eventtime.WatermarkStrategy;
import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.connector.kafka.source.KafkaSource;
import org.apache.flink.connector.kafka.source.enumerator.initializer.OffsetsInitializer;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

public class KafkaSourceTest {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        KafkaSource<String> source = KafkaSource.<String>builder()
                .setBootstrapServers("cdp1:9092")
                .setGroupId("my_group")
                .setTopics("event_topic")
                .setStartingOffsets(OffsetsInitializer.latest())
                .setValueOnlyDeserializer(new SimpleStringSchema())
                .build();
        DataStreamSource<String> kafkaDS = env.fromSource(source, WatermarkStrategy.noWatermarks(), "kafka source");
        kafkaDS.print();
        env.execute();
    }
}

总结

改用了FLink新版本的KafkaSource后,感觉代码比之前更加简洁清晰了,但具体使用原理都差不多的,在不同版本消费kafka数据时,需要注意的是,容易出现版本不兼容的问题,最常见的错误:java.lang.NoSuchMethodError: org.apache.kafka.clients.consumer.KafkaConsumer.poll,(可通过清理maven依赖、检查端口是否能连接,以及重启等等),今天只是简单聊了下kafkasource,其实新版本的flink中还提供了kafkasink,可以直接将接收的数据流sink到指定的位置,比如hdfs或者另外一个kafka集群,由于篇幅有限,这里就不具体展开了,后续会结合实际场景持续更新。

相关推荐
武汉唯众智创13 分钟前
高职院校大数据软件教学实训室建设方案
大数据·大数据实训室·大数据实验室·大数据软件教学实训室·大数据教学实训室
Elastic 中国社区官方博客15 分钟前
Elasticsearch:如何为 Elastic Stack 部署 E5 模型 - 下载及隔离环境
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
qqxhb1 小时前
系统架构设计师备考第68天——大数据处理架构
大数据·hadoop·flink·spark·系统架构·lambda·kappa
思通数科多模态大模型1 小时前
扑灭斗殴的火苗:AI智能守护如何为校园安全保驾护航
大数据·人工智能·深度学习·安全·目标检测·计算机视觉·数据挖掘
high20111 小时前
【Git】-- Rebase 减少 Commit 次数指南
大数据·git·elasticsearch
Ace_31750887762 小时前
淘宝店铺全量商品接口实战:分类穿透采集与增量同步的技术方案
大数据·数据库·python
盈飞无限3 小时前
质量智能革命:SPC软件助力中国制造驶入高质量发展快车道
大数据·人工智能·制造
老蒋新思维4 小时前
2025 创客匠人全球创始人 IP + AI 万人高峰论坛:破局创业困境,拥抱无限未来
大数据·网络·人工智能·网络协议·tcp/ip·创客匠人·知识变现
陈果然DeepVersion5 小时前
Java大厂面试真题:从Spring Boot到AI微服务的三轮技术拷问(一)
java·spring boot·redis·微服务·kafka·面试题·oauth2
api_180079054606 小时前
【技术教程】Python/Node.js 调用拼多多商品详情 API 示例详解
大数据·开发语言·python·数据挖掘·node.js