Flink消费0.10版本kafka

1.Flink 消费者精确到一次语义

      a.setStartFromGroupOffsets()【默认消费策略】

      默认读取上次保存的offset信息

      如果是应用第一次启动,读取不到上次的offset信息,则会根据这个参数auto.offset.reset的值来进行消费数据

      b.setStartFromEarliest()

      从最早的数据开始进行消费,忽略存储的offset信息

      c.setStartFromLatest()

      从最新的数据进行消费,忽略存储的offset信息

      setStartFromSpecificOffsets(Map<KafkaTopicPartition, Long>)

2.flink消费kafka的启动类

new FlinkKafkaConsumer010<>( parameterTool.getRequired("topicOrder"),  new SimpleStringSchema(), parameterTool.getProperties());

    参数说明:

                  Topic:kafka主题名或者list<topic>

                  DeserializationSchema: 反序列化shema

                  Properties:kafka连接配置

主要讲第二个参数:DeserializationSchema

FlinkKafkaConsumer需要知道如何将Kafka中的二进制数据转换成Java/Scala对象,DeserializationSchema定义了该转换模式,通过T deserialize(byte[] message)

FlinkKafkaConsumer从kafka获取的每条消息都会通过DeserializationSchema的T deserialize(byte[] message)反序列化处理

反序列化Schema类型(接口):

1.DeserializationSchema(只反序列化value)

2.KeyedDeserializationSchema

DeserializationSchemaT deserialize(byte[] message) throws IOException;

为了方便使用Flink提供一些已经实现DeserializationSchema接口的类。

1.TypeInformationSerializationSchema (andTypeInformationKeyValueSerializationSchema)

他们会基于Flink的TypeInformation来创建schema。这对于那些从Flink写入,又从Flink读出的数据是很有用的。这种Flink-specific的反序列化会比其他通用的序列化方式带来更高的性能。

2.JSONKeyValueDeserializationSchema

可以把序列化后的Json反序列化成ObjectNode,ObjectNode可以通过objectNode.get(“field”).as(Int/String/…)() 来访问指定的字段。

3. SimpleStringSchema

可以将消息反序列化为字符串。当我们接收到消息并且反序列化失败的时候,会出现以下两种情况: 1) Flink从deserialize(..)方法中抛出异常,这会导致job的失败,然后job会重启;2) 在deserialize(..) 方法出现失败的时候返回null,这会让Flink Kafka consumer默默的忽略这条消息。请注意,如果配置了checkpoint 为enable,由于consumer的失败容忍机制,失败的消息会被继续消费,因此还会继续失败,这就会导致job被不断自动重启。

3.kafka参数解析

properties.put("bootstrap.servers", "localhost:9092");
properties.put("group.id", "test4444");
properties.put("enable.auto.commit", "true");

properties.put("auto.offset.reset", "earliest");
properties.put("auto.commit.interval.ms", "1000");
properties.put("session.timeout.ms", "30000");
properties.put("topicOrder", "spider_maoyan_box_dashboard");

1.enable.auto.commit 是否自动提交偏移量

false :不自动提交偏移量

同一个消费者消费了消息之后,不自动提交消费之后的offset,需要我们手动提交,如果我们不手动提交offset的位置是不改变的即从头开始消费kafka数据。

true : 自动提交偏移量

同一个消费者消费了消息之后,不自动提交消费之后的offset,需要我们手动提交,如果我们不手动提交offset的位置是不改变的即从头开始消费kafka数据。

设置为true 表示offset自动托管到kafka内部的一个特定名称为__consumer_offsets的topic

2.auto.offset.reset

在这里要注意: 如果kafka只接收数据,从来没来消费过,程序一开始不要用latest,不然以前的数据就接收不到了。应当先earliest,然后二都可以 。

注意:

Kafka内部有两个offset

一个是producer  offset

一个是consumer  offset

上面说的是否有提交的offset是指consumer offset

kafka查看是否有提交的偏移量参考文档:

https://www.cnblogs.com/AcAc-t/p/kafka_topic_consumer_group_command.html

java代码:

 public static void main(String[] args) throws Exception {
        // set up the streaming execution environment
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        //默认情况下,检查点被禁用。要启用检查点,请在StreamExecutionEnvironment上调用enableCheckpointing(n)方法,
        // 其中n是以毫秒为单位的检查点间隔。每隔5000 ms进行启动一个检查点,则下一个检查点将在上一个检查点完成后5秒钟内启动

        env.enableCheckpointing(500);

        env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);

        Properties properties = new Properties();
        //kafka的节点的IP或者hostName,多个使用逗号分隔
        properties.setProperty("bootstrap.servers", "hdp-dn-01:9092,hdp-dn-02:9092,hdp-dn-03:9092");
        //zookeeper的节点的IP或者hostName,多个使用逗号进行分隔
        properties.setProperty("group.id", "test");
        System.out.println("11111111111");
//此处三个参数上面已经讲过,这里用的是SimpleStringSchema这种方式反序列化,后用fastJson转成json进行处理
        FlinkKafkaConsumer010<String> myConsumer = new FlinkKafkaConsumer010<String>("test",
                new SimpleStringSchema(), properties);


        DataStream<String> keyedStream = env.addSource(myConsumer);


        keyedStream.map(new MapFunction<String, Map<String,Object>>() {
            @Override
            public Map<String, Object> map(String json) throws Exception {
                Map<String, Object> stringObjectHashMap = new HashMap<>();
                JSONObject jsonObject = JSON.parseObject(json);
                stringObjectHashMap.put("name",jsonObject.getString("name"));
                stringObjectHashMap.put("age",jsonObject.getInteger("age"));
                stringObjectHashMap.put("school",jsonObject.getString("school"));
                stringObjectHashMap.put("subject",jsonObject.getString("subject"));
                return stringObjectHashMap;
            }
        }).print();


        env.execute("Flink Streaming Java API Skeleton");
    }

github地址:https://github.com/mys-mx/Flink-study

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值