Kafka Connect | 無縫結合Kafka構建高效ETL方案

點擊上方 藍色字體 ,選擇“ 設爲星標
回覆”資源“獲取更多資源

很多同學可能沒有接觸過 Kafka Connect,大家要注意不是Connector。

Kafka Connect 是一款可擴展並且可靠地在 Apache Kafka 和其他系統之間進行數據傳輸的工具。

背景

Kafka connect是Confluent公司(當時開發出Apache Kafka的核心團隊成員出來創立的新公司)開發的confluent platform的核心功能。可以很簡單的快速定義 connectors 將大量數據從 Kafka 移入和移出. Kafka Connect 可以攝取數據庫數據或者收集應用程序的 metrics 存儲到 Kafka topics,使得數據可以用於低延遲的流處理。一個導出的 job 可以將來自 Kafka topic 的數據傳輸到二級存儲,用於系統查詢或者批量進行離線分析。

大家都知道現在數據的ETL過程經常會選擇kafka作爲消息中間件應用在離線和實時的使用場景中,而kafka的數據上游和下游一直沒有一個。無縫銜接的pipeline來實現統一,比如會選擇flume 或者 logstash 採集數據到kafka,然後kafka又通過其他方式pull或者push數據到目標存儲。而kafka connect旨在圍繞kafka構建一個可伸縮的,可靠的數據流通道,通過 Kafka connect可以快速實現大量數據進出kafka從而和其他源數據源或者目標數據源進行交互構造一個低延遲的數據pipeline.給個圖更直觀點,大家感受下。

Kafka Connect 功能包括:

  • Kafka connectors 通用框架:- Kafka Connect 將其他數據系統和Kafka集成標準化,簡化了 connector 的開發,部署和管理

  • 分佈式和單機模式 - 可以擴展成一個集中式的管理服務,也可以單機方便的開發,測試和生產環境小型的部署。

  • REST 接口 - 通過易於使用的REST API提交和管理connectors到您的Kafka Connect集羣

  • offset 自動管理 - 只需要connectors 的一些信息,Kafka Connect 可以自動管理offset 提交的過程,因此開發人員無需擔心開發中offset提交出錯的這部分。

  • 分佈式的並且可擴展 - Kafka Connect 構建在現有的 group 管理協議上。Kafka Connect 集羣可以擴展添加更多的workers。

  • 整合流處理/批處理 - 利用 Kafka 已有的功能,Kafka Connect 是一個橋接stream 和批處理系統理想的方式。

Kafka Connect的適用場景

連接器和普通的生產者消費者模式有什麼區別呢?似乎兩種方式都可以達到目的。可能第一次接觸connect的人都會由此疑問。在《kafka權威指南》這本書裏,作者給出了建議:

如果你是開發人員,你會使用 Kafka 客戶端將應用程序連接到Kafka ,井修改應用程序的代碼,將數據推送到 Kafka 或者從 Kafka 讀取數據。如果要將 Kafka 連接到數據存儲系統,可以使用 Connect,因爲這些系統不是你開發的,構建數據管道 I 10s你無能或者也不想修改它們的代碼。Connect 可以用於從外部數據存儲系統讀取數據, 或者將數據推送到外部存儲系統。如果數據存儲系統提供了相應的連接器,那麼非開發人員就可以通過配置連接器的方式來使用 Connect。

如果你要連接的數據存儲系統沒有相應的連接器,那麼可以考慮使用客戶端 API 或 Connect API 開發一個應用程序。我們建議首選 Connect,因爲它提供了一些開箱即用的特性,比如配置管理、偏移量存儲、井行處理、錯誤處理,而且支持多種數據類型和標準的 REST 管理 API。開發一個連接 Kafka 和外部數據存儲系統的小應用程序看起來很簡單,但其實還有很多細節需要處理,比如數據類型和配置選項,這些無疑加大了開發的複雜性一Connect 處理了大部分細節,讓你可以專注於數據的傳輸。

Kafka Connect架構和組件

Kafka connect的幾個重要的概念包括:connectors、tasks、workers、converters和transformers。

  • Connectors-通過管理任務來細條數據流的高級抽象

  • Tasks- 數據寫入kafka和數據從kafka讀出的實現

  • Workers-運行connectors和tasks的進程

  • Converters- kafka connect和其他存儲系統直接發送或者接受數據之間轉換數據

1) Connectors:在kafka connect中,connector決定了數據應該從哪裏複製過來以及數據應該寫入到哪裏去,一個connector實例是一個需要負責在kafka和其他系統之間複製數據的邏輯作業,connector plugin是jar文件,實現了kafka定義的一些接口來完成特定的任務。

2) Tasks:task是kafka connect數據模型的主角,每一個connector都會協調一系列的task去執行任務,connector可以把一項工作分割成許多的task,然後再把task分發到各個worker中去執行(分佈式模式下),task不自己保存自己的狀態信息,而是交給特定的kafka 主題去保存(config.storage.topic 和status.storage.topic)。在分佈式模式下有一個概念叫做任務再平衡(Task Rebalancing),當一個connector第一次提交到集羣時,所有的worker都會做一個task rebalancing從而保證每一個worker都運行了差不多數量的工作,而不是所有的工作壓力都集中在某個worker進程中,而當某個進程掛了之後也會執行task rebalance。

3) Workers:connectors和tasks都是邏輯工作單位,必須安排在進程中執行,而在kafka connect中,這些進程就是workers,分別有兩種worker:standalone和distributed。這裏不對standalone進行介紹,具體的可以查看官方文檔。我個人覺得distributed worker很棒,因爲它提供了可擴展性以及自動容錯的功能,你可以使用一個group.ip來啓動很多worker進程,在有效的worker進程中它們會自動的去協調執行connector和task,如果你新加了一個worker或者掛了一個worker,其他的worker會檢測到然後在重新分配connector和task。

4) Converters:converter會把bytes數據轉換成kafka connect內部的格式,也可以把kafka connect內部存儲格式的數據轉變成bytes,converter對connector來說是解耦的,所以其他的connector都可以重用,例如,使用了avro converter,那麼jdbc connector可以寫avro格式的數據到kafka,當然,hdfs connector也可以從kafka中讀出avro格式的數據。

5) Connector可以配置轉換,以便對單個消息進行簡單且輕量的修改。這對於小數據的調整和事件路由十分方便,且可以在connector配置中將多個轉換鏈接在一起。然而,應用於多個消息的更復雜的轉換最好使用KSQL和Kafka Stream實現。轉換是一個簡單的函數,輸入一條記錄,並輸出一條修改過的記錄。Kafka Connect提供許多轉換,它們都執行簡單但有用的修改。可以使用自己的邏輯定製實現轉換接口,將它們打包爲Kafka Connect插件,將它們與connector一起使用。當轉換與source connector一起使用時,Kafka Connect通過第一個轉換傳遞connector生成的每條源記錄,第一個轉換對其進行修改並輸出一個新的源記錄。將更新後的源記錄傳遞到鏈中的下一個轉換,該轉換再生成一個新的修改後的源記錄。最後更新的源記錄會被轉換爲二進制格式寫入到kafka。轉換也可以與sink connector一起使用。

安裝和初體驗

Kafka Connect 當前支持兩種執行方式,單機(單個進程)和分佈式。

1、單機模式

./connect-standalone.sh ../config/connect-file.properties ../config/connect-file-source.properties ../config/connect-file-sink.properties

2、分佈式

  • 下載相應的第三方Connect後打包編譯。

  • 將jar丟到Kafka的libs目錄下。

  • 啓動connector。

  • 使用Rest API提交connector配置。

./connect-distributed.sh ../config/connect-distributed.properties

由於Kafka Connect 旨在作爲服務運行,它還提供了一個用於管理 connectors 的REST API。默認情況下,此服務在端口8083上運行,支持的一些接口列表如圖:

下面我們按照官網的步驟來實現Kafka Connect官方案例,使用Kafka Connect把Source(test.txt)轉爲流數據再寫入到Destination(test.sink.txt)中。如下圖所示:

本例使用到了兩個Connector:

  • FileStreamSource:從test.txt中讀取併發布到Broker中

  • FileStreamSink:從Broker中讀取數據並寫入到test.sink.txt文件中

其中的Source使用到的配置文件是${KAFKA_HOME}/config/connect-file-source.properties

name=local-file-source
connector.class=FileStreamSource
tasks.max=1
file=test.txt
topic=connect-test

其中的Sink使用到的配置文件是${KAFKA_HOME}/config/connect-file-sink.properties

name=local-file-sink
connector.class=FileStreamSink
tasks.max=1
file=test.sink.txt
topics=connect-test

Broker使用到的配置文件是${KAFKA_HOME}/config/connect-standalone.properties

bootstrap.servers=localhost:9092key.converter=org.apache.kafka.connect.json.JsonConverter
value.converter=org.apache.kafka.connect.json.JsonConverter
key.converter.schemas.enable=true
value.converter.schemas.enable=trueinternal.key.converter=org.apache.kafka.connect.json.JsonConverter
internal.value.converter=org.apache.kafka.connect.json.JsonConverter
internal.key.converter.schemas.enable=false
internal.value.converter.schemas.enable=false
offset.storage.file.filename=/tmp/connect.offsets
offset.flush.interval.ms=10000

然後我們分別啓動Source Connector和Sink Connector:

./bin/connect-standalone.sh 

config/connect-standalone.properties 

config/connect-file-source.properties 

config/connect-file-sink.properties

然後我們向文件寫入一些數據:

echo 'hello flink01' >> test.txt 

echo 'hello flink02' >> test.txt

然後我們就可以在目標文件中看到:

cat test.sink.txt

hello flink01
hello flink02

我們在下篇文章中將更爲詳細的介紹Kafka Connect在實際生產中的應用以及在各大公司的使用情況。



騰訊阿里頭條翻牌子|ClickHouse表引擎到底怎麼選

騰訊阿里頭條翻牌子 | ClickHouse中SQL執行過程



歡迎點贊+收藏+轉發朋友圈素質三連

文章不錯?點個【在看】吧! 

本文分享自微信公衆號 - 大數據技術與架構(import_bigdata)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

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