栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【Flink】Flink读写Kafka,及遇到的问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Flink】Flink读写Kafka,及遇到的问题

前言

最近在学习Flink 如何读写Kakfa,在使用精确一次语义时遇到一些报错,这里整理并记录一下。

  • flink 1.15
  • kafka 2.7
pom

相关pom.xml 内容如下:


    org.apache.flink
    flink-java
    ${flink.version}


    org.apache.flink
    flink-streaming-java
    ${flink.version}


    org.apache.flink
    flink-clients
    ${flink.version}


    org.apache.flink
    flink-runtime-web
    ${flink.version}


    org.apache.flink
    flink-test-utils
    ${flink.version}
    test


    org.apache.flink
    flink-connector-kafka
    1.15.0

生产端
public class kafkaSinkDemo {

    public static void main(String[] args) throws Exception {

        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        DataStreamSource stream = env.socketTextStream("59.110.32.152", 1234);

        // 设置transaction 超时时间,不然程序会报错
        Properties properties = new Properties();
        properties.setProperty("transaction.timeout.ms", "10000");

        KafkaSink sink = KafkaSink.builder()
                .setBootstrapServers("59.110.32.152:9092")
                .setRecordSerializer(KafkaRecordSerializationSchema.builder()
                        .setTopic("test")
                        .setValueSerializationSchema(new SimpleStringSchema())
                        .build()
                )
                // 设置 ts 的id前缀
                .setTransactionalIdPrefix("ts")
                // 精确一次生产
                .setDeliverGuarantee(DeliveryGuarantee.EXACTLY_ONCE)
                .setKafkaProducerConfig(properties)
                .build();

        stream.sinkTo(sink);

        env.execute();

    }
}

注意:如果要使用精确一次的语义,这里需要指定transaction.timeout.ms 配置,不然程序会报The transaction timeout is larger than the maximum value allowed by the broker。
请参考官方文档:https://nightlies.apache.org/flink/flink-docs-release-1.15/docs/connectors/datastream/kafka/#consumer-offset-committing

消费端
public class KafkaSourceDemo {

    public static void main(String[] args) throws Exception {

        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        KafkaSource source = KafkaSource.builder()
                .setBootstrapServers("59.110.32.152:9092")
                .setTopics("test")
                .setGroupId("my-group")
                .setStartingOffsets(OffsetsInitializer.earliest())
                .setDeserializer(KafkaRecordDeserializationSchema.valueOnly(StringDeserializer.class))
                // 动态分区发现
                .setProperty("partition.discovery.interval.ms", "10000")
                .build();

        DataStreamSource kafka_source = env.fromSource(source, WatermarkStrategy.noWatermarks(), "Kafka Source");

        kafka_source.print();

        env.execute();

    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1006225.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号