【Flink消费Fkafa】

Flink对kafka消费的主代码

import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer;
import org.apache.kafka.clients.consumer.ConsumerConfig;

import java.util.Properties;

/**
 * @program: flink_一鲸落万物起
 * @description: kafka的消费代码
 * @author: Mr.一鲸落万物起
 * @create: 2022-01-21 18:05
 **/
public class KafkaConsumer {
    public static void main(String[] args) throws Exception {

        StreamExecutionEnvironment env = EnvUtil.getEnv();

        // 此处的配置信息properties是引用的java的
        Properties props = new Properties();

        //链接kafka的信息参数,地址就是部分broker的信息地址,可以写多个。
        //bootstrap.servers这个参数是用来配置发现Kafka集群信息
        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, KafkaConf.ADDRESS);

        // 需指定group.id,值是管理端的app
        props.put(ConsumerConfig.GROUP_ID_CONFIG, KafkaConf.APP);

        //需要指定client.id 值是管理端的APP
        props.put(ConsumerConfig.CLIENT_ID_CONFIG, KafkaConf.APP);

        props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");
        props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");
        props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");

        //创建一个消费者的实例
        FlinkKafkaConsumer consumerInstance = new FlinkKafkaConsumer(KafkaConf.TOPIC, new SimpleStringSchema(), props);


        // TODO: 2022/1/22  因为FLink消费kafka的数据需要区分是否进行了checkpoint功能。
        /**
         *
         * 如果没有开启checkpoint,需要开启自动提交功能,要依赖于 kafka 客户端的 auto commit。
         * 需设置 enable.auto.commit,auto.commit.interval.ms 参数到 consumerproperties,
         * 就会按固定的时间间隔定期 auto commit offset 到 kafka。
         */

        /**
         * 如果开启了checkpoint 这时候的这个时候作业消费的 offset 是 Flink 在 state 中自己管理和容错。
         *此时提交 offset 到 kafka,一般都是作为外部进度的监控,想实时知道作业消费的位置和 lag 情况。
         *此时需要 setCommitOffsetsOnCheckpoints 为 true 来设置当 checkpoint 成功时提交 offset 到 kafka。
         *此时 commit offset 的间隔就取决于 checkpoint 的间隔,所以此时从 kafka 一侧看到的 lag 可能并非完全实时,
         *如果 checkpoint 间隔比较长 lag 曲线可能会是一个锯齿状。
         * */
        consumerInstance.setCommitOffsetsOnCheckpoints(true);

        // TODO: 2022/1/22 为啥设置name函数 
        // name 是算子名称  为什么需要起名字/源码的注释。也可以设置uid
        //visualization 直观的意思
        /**
         * Sets the name of the current data stream. This name is used by the visualization and logging
         * during runtime.
         *
         * @return The named operator.
         */
        SingleOutputStreamOperator source = env.addSource(consumerInstance).name("jingluohuanwanwu");

        source.addSink(new SinkString())
                .name("SinkStr");

        env.execute("jingluohuanwanwu");


    }
}

EnvUtil工具类

import org.apache.flink.streaming.api.CheckpointingMode;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

/**
 * @program: flink_一鲸落万物起
 * @description: Flink执行环境的工具
 * @author: Mr.一鲸落万物起
 * @create: 2022-01-21 17:57
 **/
public class EnvUtil {
    public static StreamExecutionEnvironment getEnv() {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        // 设置checkpoint 间隔和模式
        env.enableCheckpointing(300_000, CheckpointingMode.EXACTLY_ONCE);
        // 设置checkpoint的超时时间
        env.getCheckpointConfig().setCheckpointTimeout(600_000);
        return env;
    }
}

SinkString下沉组件类

import lombok.extern.slf4j.Slf4j;
import org.apache.flink.streaming.api.functions.sink.SinkFunction;

/**
 * @program: flink_一鲸落万物起
 * @description: Flink的sink组件
 * @author: Mr.一鲸落万物起
 * @create: 2022-01-22 20:30
 **/

/**
 * 通过注解的方式进行log的使用。不需要每次都进行private 的log变量了。需要引用lombok
 * */

@Slf4j
public class SinkString implements SinkFunction<String> {

    @Override
    public void invoke(String value, Context context) throws Exception {
        log.info("sink print:" + value);
    }
}

KafkaConf工具类

/**
 * @program: flink_一鲸落万物起
 * @description:
 * @author: Mr.一鲸落万物起
 * @create: 2022-01-21 18:23
 **/
public class KafkaConf {
    public final static String TOPIC = "xxx";
    public final static String APP = "xxx";
    public final static String ADDRESS = "test-nameserver:50088";
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值