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
未完待續.........