Flink的新老KafkaSource算子对比

本文介绍了ApacheFlink中从老版本的FlinkKafkaConsumerAPI升级到新版KafkaSource的过程,包括配置参数调整、新API的使用以及水印策略的设置,以确保消息处理的EOS语义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();

        StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(conf);
        /**
         * 老版本的API FlinkKafkaConsumer
         * 指定三个参数
         *  topic 名称
         *  反序列化 Schema,SimpleStringSchema 指的是读取 Kafka 中的数据反序列化成 String 格式;
         *  Properties 实例
         *  这种方式不能保证eos语义
         */
        Properties prop = new Properties();
        prop.setProperty("bootstrap.servers", "dw1:9092,dw2:9092,dw3:9092");
        prop.setProperty("group.id", "id1");
        prop.setProperty("enable.auto.commit", "true");
        FlinkKafkaConsumer<String> kafkaConsumer = new FlinkKafkaConsumer<>(
                "benge0920",
                new SimpleStringSchema(),
                prop);
        DataStreamSource<String> kafkaStream1 = env.addSource(kafkaConsumer);
        //kafkaStream1.print();
        /**
         * 新版API 使用KafkaSource
         */

        KafkaSource<String> kafkaSource = KafkaSource.<String>builder()
                .setBootstrapServers("dw1:9092,dw2:9092,dw3:902")
                .setTopics("benge0920")
                .setValueOnlyDeserializer(new SimpleStringSchema())
                .setStartingOffsets(OffsetsInitializer.latest())
                .build();
        WatermarkStrategy<String> stringWatermarkStrategy = WatermarkStrategy.<String>forMonotonousTimestamps()
                .withTimestampAssigner(new SerializableTimestampAssigner<String>() {
                    @Override
                    public long extractTimestamp(String s, long l) {
                        String[] words = s.split(",");
                        return Long.parseLong(words[1]);
                    }
                });
        DataStreamSource<String> result = env.fromSource(kafkaSource, stringWatermarkStrategy, "");
        result.print();

        env.execute();
    }

Flink中,使用SQL实现Kafka作为数据源(KafkaSourceKafka作为数据汇(KafkaSink)是非常常见且高效的操作。以下是如何使用Flink SQL实现KafkaSourceKafkaSink的步骤: ### 1. 配置Kafka连接器 首先,需要确保Flink集群中已经包含了Kafka连接器。可以通过以下命令启动Flink集群并加载Kafka连接器: ```shell ./bin/start-cluster.sh ./bin/sql-client.sh embedded -j path/to/flink-sql-connector-kafka.jar ``` ### 2. 创建Kafka源表 使用SQL语句创建一个Kafka源表。假设Kafka的主题名为`input_topic`,并且使用JSON格式的数据: ```sql CREATE TABLE kafka_source ( id INT, name STRING, age INT, proctime AS PROCTIME() ) WITH ( 'connector' = 'kafka', 'topic' = 'input_topic', 'properties.bootstrap.servers' = 'kafka_broker1:9092,kafka_broker2:9092', 'properties.group.id' = 'flink_group', 'format' = 'json', 'scan.startup.mode' = 'earliest-offset' ); ``` ### 3. 创建Kafka汇表 使用SQL语句创建一个Kafka汇表。假设Kafka的主题名为`output_topic`,并且使用JSON格式的数据: ```sql CREATE TABLE kafka_sink ( id INT, name STRING, age INT ) WITH ( 'connector' = 'kafka', 'topic' = 'output_topic', 'properties.bootstrap.servers' = 'kafka_broker1:9092,kafka_broker2:9092', 'format' = 'json' ); ``` ### 4. 编写并执行查询 编写一个简单的查询,将数据从`kafka_source`表读取并写入`kafka_sink`表: ```sql INSERT INTO kafka_sink SELECT id, name, age FROM kafka_source WHERE age > 30; ``` ### 5. 运行查询 执行上述查询语句,Flink将会启动一个流处理作业,将数据从Kafka源表读取并写入Kafka汇表。 ### 总结 通过以上步骤,你可以使用Flink SQL实现Kafka作为数据源汇表的数据流处理。Flink SQL的简洁性强大的流处理能力使得数据处理任务变得更加高效易于维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值