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
DeserializationSchema:T 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("auto.offset.reset", "earliest"); |
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代码:
|