Flink消費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

 

未完待續.........

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章