Flink流連接器之Kafka

一.簡介

Flink提供了特殊的Kafka連接器,用於在Kafka主題之間讀寫數據。Flink Kafka Consumer與Flink的檢查點機制集成在一起,以提供一次精確的處理語義。爲了實現這一目標,Flink不僅依賴於Kafka的消費者組偏移量跟蹤,而且在內部也跟蹤並檢查這些偏移量。

對於大多數用戶來說,FlinkKafkaConsumer08【08代表Kafka的版本】是合適的。
具體如下:
在這裏插入圖片描述

二.安裝Apache Kafka

參考博客:Kafka分佈式安裝
備註:

  • 按照Kafka快速入門中的說明下載代碼並啓動服務器(每次啓動該應用程序之前,都需要啓動Zookeeper和Kafka服務器)。
  • 如果Kafka和Zookeeper服務器在遠程計算機上運行,​​則文件中的advertised.host.name設置config/server.properties必須設置爲計算機的IP地址。

三.Kafka 1.0.0+連接器

從Flink 1.7開始,有一個新的通用Kafka連接器,它不跟蹤特定的Kafka主版本。而是在Flink發佈時跟蹤Kafka的最新版本。

如果Kafka broker 版本是1.0.0或更高版本,則應使用此Kafka連接器。如果使用Kafka的舊版本(0.11、0.10、0.9或0.8),則應使用與代理版本相對應的連接器。
兼容性
通用的Kafka連接器通過Kafka客戶端API和代理的兼容性保證舊的和新的Kafka代理兼容。它與代理版本0.11.0或更高版本兼容,具體取決於所使用的功能。
將Kafka連接器從0.11遷移到通用
須知:

  • 在整個過程中使用Flink 1.9或更高版本。
  • 不要同時升級Flink和操作。
  • 確保作業中使用的Kafka Consumer和Kafka Producer分配了唯一的標識符(uid)。
  • 使用帶有保存點功能的CLI命令停止功能來獲取保存點(例如,通過使用stop --withSavepoint)。

四.Kafka消費者

Flink的Kafka使用者被稱爲FlinkKafkaConsumer09(對於Kafka 0.10.0.x版本,則稱爲010,11與此類似;FlinkKafkaConsumer對於Kafka> = 1.0.0版本)。它提供對一個或多個Kafka主題的訪問。

構造函數接受以下參數:

  1. 主題名稱/主題名稱列表。

  2. DeserializationSchema / KafkaDeserializationSchema用於反序列化來自Kafka的數據。

  3. Kafka消費者的屬性。需要以下屬性:

    “ bootstrap.servers”(以逗號分隔的Kafka broker列表)
    “ zookeeper.connect”(Zookeeper服務器的逗號分隔列表)
    “ group.id”消費者組的ID

代碼案例:

val properties = new Properties()
properties.setProperty("bootstrap.servers" , "master:9092,slave01:9092,slave02:9092")
properties.setProperty("zookeeper.connect" , "master:2181,slave01:2181,slave02:2181")
properties.setProperty("group.id" , "spark")
properties.setProperty("enable.auto.commit" , "true")
properties.setProperty("auto.commit.interval.ms" ,"5000")

/**
 * 配置下次重新消費的話,從哪裏開始消費:
 * latest:從上一次提交的offset位置開始的
 * earlist:從頭開始進行(重複消費數據)
 */
properties.setProperty("auto.offset.reset" , "latest")
// 配置序列化和反序列化
properties.setProperty("key.serializer" , "org.apache.kafka.common.serialization.StringSerializer")
properties.setProperty("key.deserializer" , "org.apache.kafka.common.serialization.StringDeserializer")

//獲取數據源 kafka
val consumer : FlinkKafkaConsumer09[String] = new FlinkKafkaConsumer09[String](
"spark", new SimpleStringSchema(), properties
)

五.DeserializationSchema

Flink Kafka使用者需要了解如何將Kafka中的二進制數據轉換爲Java / Scala對象。在 DeserializationSchema允許用戶指定這樣的一個架構。T deserialize(byte[] message) 每條Kafka消息都會調用該方法,並傳遞Kafka中的值。

從AbstractDeserializationSchema開始通常會很有幫助,該過程將產生的Java / Scala類型描述爲Flink的類型系統。實現DeserializationSchema需要自己實現getProducedType(…)方法。

爲了訪問Kafka消息的鍵,值和元數據,KafkaDeserializationSchema具有以下反序列化方法T deserialize(ConsumerRecord<byte[], byte[]> record)。

爲了方便起見,Flink提供以下架構:

  • TypeInformationSerializationSchema(和TypeInformationKeyValueSerializationSchema)基於Flink的創建架構TypeInformation。如果數據由Flink寫入和讀取,這將很有用。該模式是其他通用序列化方法的高性能Flink特定替代方案。
  • JsonDeserializationSchema(和JSONKeyValueDeserializationSchema)將序列化的JSON轉換爲ObjectNode對象,可以使用objectNode.get(“field”).as(Int/String/…)()從中訪問字段。KeyValue objectNode包含一個“鍵”和“值”字段,其中包含所有字段,以及一個可選的“元數據”字段,用於顯示此消息的偏移量/分區/主題。
  • AvroDeserializationSchema它使用靜態提供的架構讀取以Avro格式序列化的數據。它可以從Avro生成的類(AvroDeserializationSchema.forSpecific(…))推斷模式,也可以GenericRecords 與手動提供的模式(AvroDeserializationSchema.forGeneric(…))一起使用。該反序列化模式期望序列化的記錄不包含嵌入式模式。
    該模式還有一個可用的版本,可以在Confluent Schema Registry中查找作者的模式(用於寫入記錄的模式)。使用這些反序列化模式記錄,將讀取從Schema Registry檢索並轉換爲靜態提供(通過 ConfluentRegistryAvroDeserializationSchema.forGeneric(…)或ConfluentRegistryAvroDeserializationSchema.forSpecific(…))的模式。

遇到由於某種原因而無法反序列化的損壞消息時,有兩種選擇-從deserialize(…)方法中引發異常,這將導致作業失敗並重新啓動,或者返回null以允許Flink Kafka使用者靜默跳過損壞的消息。請注意,由於消費者的容錯能力,如果在損壞的消息上執行失敗的工作,消費者將嘗試再次反序列化消息。因此,如果反序列化仍然失敗,則消費者將陷入該錯誤消息的不間斷重啓和失敗循環中。

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