1.概述
最近,有同學留言諮詢Kafka聯結器的相關內容,今天筆者給大家分享一下Kafka聯結器建立資料管道的相關內容。
2.內容
Kafka聯結器是一種用於Kafka系統和其他系統之間進行功能擴充套件、資料傳輸的工具。通過Kafka聯結器能夠簡單、快速的將大量資料集移入到Kafka系統,或者從Kafka系統中移出,例如Kafka聯結器可以低延時的將資料庫或者應用伺服器中的指標資料收集到Kafka系統主題中。
另外,Kafka聯結器可以通過作業匯出的方式,將Kafka系統主題傳輸到二次儲存和查詢系統中,或者傳輸到批處理系統中進行離線分析。
2.1 使用場景
Kafka聯結器通常用來構建資料管道,一般來說有兩種使用場景。
1. 開始和結束的端點
第一種,將Kafka系統作為資料管道的開始和結束的端點。例如,將Kafka系統主題中的資料移出到HBase資料庫,或者把Oracle資料庫中的資料移入到Kafka系統。
2. 資料傳輸的中間介質
第二種,把Kafka系統作為一箇中間傳輸介質。例如,為了把海量日誌資料儲存到ElasticSearch中,可以先把這些日誌資料傳輸到Kafka系統中,然後再從Kafka系統中將這些資料移出到ElasticSearch進行儲存。
ElasticSearch是一個基於Lucene(Lucene是一款高效能、可擴充套件的資訊檢索工具庫)實現的儲存介質。它提供了一個分散式多使用者能力的全文搜尋引擎,基RESTful(一種軟體架構風格、設計風格,但是並非標準,只是提供了一組設計原則和約束條件)介面實現。
Kafka聯結器的存在,給資料管道帶來很重要的價值。例如,Kafka聯結器可以作為資料管道各個資料階段的緩衝區,有效的將消費者例項和生產者例項進行解耦。
Kafka系統解除耦合的能力、系統的安全性、資料處理的效率等方面均表現不俗,因而使用Kafka聯結器來構建資料管道是一個最佳的選舉。
2.2 特性和優勢
Kafka聯結器包含一些重要的特性,並且給資料管道提供了一個成熟穩定的框架。同時,Kafka聯結器還提供了一些簡單易用的工具庫,大大降低的開發人員的研發成本。
1. 特性
Kafka聯結器具體包含的特性如下。
- 通用框架:Kafka聯結器制定了一種標準,用來約束Kafka系統與其他系統整合,簡化了Kafka聯結器的開發、部署和管理;
- 單機模式和分散式模式:Kafka聯結器支援兩種模式,既能擴充套件到支援大型叢集的服務管理,也可以縮小到開發、測試等小規模的叢集;
- REST介面:使用REST API來提交請求並管理Kafka叢集;
- 自動管理偏移量:通過聯結器的少量資訊,Kafka聯結器可以自動管理偏移量;
- 分散式和可擴充套件:Kafka聯結器是建立在現有的組管理協議上,通過新增更多的聯結器例項來水平擴充套件,實現分散式服務;
- 資料流和批量整合:利用Kafka系統已有的能力,Kafka聯結器是橋接資料流和批處理系統的一種理想的解決方案。
2. 優勢
在Kafka聯結器中有兩個核心的概念,它們分別是Source和Sink。其中Source負責將資料匯入到Kafka系統,而Sink則負責將資料從Kafka系統中進行匯出。
Source和Sink在實現資料匯入和匯出的過程被稱之聯結器,即Source聯結器和Sink聯結器。這兩種聯結器提供了對業務層面資料讀取和寫入的抽象介面,簡化了生命週期的管理工作。
在處理資料時,Source聯結器和Sink聯結器會初始化各自的任務,並將資料結構進行標準化的封裝。在實際應用場景中,不同的業務中的資料格式是不一樣的,因此,Kafka聯結器通過註冊資料結構,來解決資料格式驗證和相容性問題。
當資料來源發生變化時,Kafka聯結器會生成新的資料結構,通過不同的處理策略來完成對資料格式的相容。
2.3 核心概念
在Kafka聯結器中存在幾個核心的概念,它們分別是聯結器例項(Connectors)、任務數(Tasks)、事件執行緒數(Workers)、轉換器(Converters)。
1. 連機器例項
在Kafka聯結器中,聯結器例項決定了訊息資料的流向,即訊息資料從何處複製,以及將複製的訊息資料寫入到何處。
一個聯結器例項負責Kafka系統與其他系統之間的邏輯處理,聯結器例項通常以JAR包的形式存在,通過實現Kafka系統應用介面來完成。
2. 任務數
在分散式模式下,每一個聯結器例項可以將一個作業切分成多個任務(Task),然後再將任務分發到各個事件執行緒(Worker)中去執行。任務不會儲存當前的狀態資訊,通常由特定的Kafka主題來儲存,例如指定具體屬性offset.storage.topic和status.storage.topic的值來儲存。
在分散式模式中,會存在任務均衡的概念。當一個聯結器例項首次提交到Kafka叢集,所有的事件執行緒都會做一個任務均衡的操作,來保證每一個事件執行緒都執行差不多數量的任務,避免所有任務集中到某一個事件執行緒。
3. 事件執行緒
在Kafka系統中,聯結器例項和任務數都是邏輯層面的,需要有具體的執行緒來執行。在Kafka聯結器中,事件執行緒就是用來執行具體的任務,事件執行緒包含兩種,分別是單機模式和分散式模式。
4. 轉換器
轉換器會將位元組資料轉換成Kafka聯結器內部的格式,同時,也能將Kafka聯結器內部儲存的資料格式轉換成位元組資料。
3.操作聯結器
聯結器作為Kafka的一部分,隨著Kafka系統一起釋出,所以無需獨立安裝。在大資料應用場景下,建議在每臺物理機上安裝一個Kafka。根據實際需求,可以在一部分物理機上啟動Kafka例項(即代理節點Broker),在另一部分物理機上啟動聯結器。
在Kafka系統中,Kafka聯結器最終是以一個常駐程式的形式執行在後臺服務中,它提供了一個用來管理聯結器例項的REST API。預設情況下,服務埠地址是8083。
提示:
Representational State Transfer,簡稱REST,即表現層狀態轉移。REST是所有Web應用程式都應用遵守的一種規範。符合REST設計規範的應用介面,即REST API。
在Kafka聯結器中,REST API支援獲取、寫入、建立等介面,具體內容如下圖所示:
在Kafka系統中,Kafka聯結器目前支援兩種執行模式,它們分別是單機模式和分散式模式。
3.1 單擊模式匯入
在單機模式下,所有的事件執行緒都在一個單程式中執行。單機模式使用起來更加簡單,特別是在開發和定位分析問題的時候,使用單機模式會比較適合。
(1)編輯單機模式配置檔案。
在單機模式下,主題的偏移量是儲存在/tmp/connect.offsets目錄下,在$KAFKA_HOME/config目錄下有一個connect-standalone.properties檔案,通過設定offset.storage.file.filename屬性值來改變儲存路徑。
每次Kafka聯結器啟動時,通過載入$KAFKA_HOME/config/connect-file-source.properties配置檔案中的name屬性來獲取主題的偏移量,然後執行後續的讀寫操作。
# 設定聯結器名稱 name=local-file-source # 指定聯結器類 connector.class=FileStreamSource # 設定最大任務數 tasks.max=1 # 指定讀取的檔案 file=/tmp/test.txt # 指定主題名 topic=connect_test
(2)在即將讀取的檔案中,新增資料,具體操作命令如下。
# 新建一個test.txt檔案並新增資料
[hadoop@dn1 ~]$ vi /tmp/test.txt
# 新增內容如下 kafka hadoop kafka-connect # 儲存並退出
在使用Kafka檔案聯結器時,聯結器例項會監聽配置的資料檔案,如果檔案中有資料更新,例如:追加新的訊息資料。聯結器例項會及時處理新增的訊息資料。
(3)啟動Kafka聯結器單機模式的命令與啟動Kafka代理節點類似,具體操作命令如下。
# 啟動一個單機模式的聯結器 [hadoop@dn1 bin]$ ./connect-standalone.sh ../config/connect-standalone.properties\ ../config/connect-file-source.properties
(4)使用Kafka系統命令檢視匯入到主題(connect_test)中的資料,具體操作命令如下。
# 使用Kafka命令檢視 [hadoop@dn1 bin]$ ./kafka-console-consumer.sh --zookeeper dn1:2181 --topic connect_test\ --from-beginning
3.2 分散式模式匯入
在分散式模式中,Kafka聯結器會自動均衡每個事件執行緒所處理的任務數。允許使用者動態的增加或者減少,在執行任務、修改配置、以及提交偏移量時能夠得到容錯保障。
在分散式模式中,Kafka聯結器會在主題中儲存偏移量、配置、以及任務狀態。建議手動建立儲存偏移量的主題,可以按需設定主題分割槽數和副本數。
需要注意的是,除了配置一些通用的屬性之外,還需要配置以下幾個重要的屬性。
- group.id(預設值connect-cluster):聯結器組唯一名稱,切記不能和消費者組名稱衝突;
- config.storage.topic(預設值connect-configs):用來儲存聯結器例項和任務配置,需要注意的是,該主題應該以單分割槽多副本的形式存在,建議手動建立,如果自動建立可能會存在多個分割槽;
- offset.storage.topic(預設值connect-offsets):用來儲存偏移量,該主題應該以多分割槽多副本的形式存在;
- status.storage.topic(預設值connect-status):用來儲存任務狀態,該主題建議以多分割槽多副本的形式存在。
在分散式模式中,Kafka聯結器配置檔案不能使用命令列,需要使用REST API來執行建立、修改和銷燬Kafka聯結器操作。
(1)編輯分散式模式配置檔案(connect-distributed.properties)
# 設定Kafka叢集地址 bootstrap.servers=dn1:9092,dn2:9092,dn3:9092 # 設定聯結器唯一組名稱 group.id=connect-cluster # 指定鍵值對JSON轉換器類 key.converter=org.apache.kafka.connect.json.JsonConverter value.converter=org.apache.kafka.connect.json.JsonConverter # 啟用鍵值對轉換器 key.converter.schemas.enable=true value.converter.schemas.enable=true # 設定內部鍵值對轉換器, 例如偏移量、配置等 internal.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.topic=connect_offsets # 設定配置儲存主題 config.storage.topic=connect_configs # 設定任務狀態儲存主題 status.storage.topic=connect_status # 設定偏移量持久化時間間隔 offset.flush.interval.ms=10000
(2)建立偏移量、配置、以及任務狀態主題,具體操作命令如下。
# 建立配置主題 kafka-topics.sh --create --zookeeper dn1:2181 --replication-factor 3 --partitions 1\ --topic connect_configs # 建立偏移量主題 kafka-topics.sh --create --zookeeper dn1:2181 --replication-factor 3 --partitions 6\ --topic connect_offsets # 建立任務狀態主題 kafka-topics.sh --create --zookeeper dn1:2181 --replication-factor 3 --partitions 6\ --topic connect_status
(3)啟動分散式模式聯結器,具體操作命令如下。
# 啟動分散式模式聯結器 [hadoop@dn1 bin]$ ./connect-distributed.sh ../config/connect-distributed.properties
(4)執行REST API命令檢視當前Kafka聯結器的版本號,具體操作命令如下。
# 檢視聯結器版本號 [hadoop@dn1 ~]$ curl http://dn1:8083/
(5)檢視當前已安裝的聯結器外掛,通過瀏覽器訪問http://dn1:8083/connector-plugins地址來檢視
(6)建立一個新的聯結器例項,具體操作命令如下。
# 建立一個新的聯結器例項 [hadoop@dn1 ~]$ curl 'http://dn1:8083/connectors' -X POST -i –H\ "Content-Type:application/json" -d '{"name":"distributed-console-source","config":\ {"connector.class":"org.apache.kafka.connect.file.FileStreamSourceConnector",\ "tasks.max":"1","topic":"distributed_connect_test",\ "file":"/tmp/distributed_test.txt"}}'
然後在瀏覽器訪問http://dn1:8083/connectors地址檢視當前成功建立的聯結器例項名稱,如下圖所示:
(7)檢視使用分散式模式匯入到主題(distributed_connect_test)中的資料,具體操作命令如下。
# 在檔案/tmp/distributed_test.txt中新增訊息資料 [hadoop@dn1 ~]$ vi /tmp/distributed_test.txt # 新增如下內容(這條註釋不要寫入到distributed_test.txt檔案中) distributed_kafka kafka_connection kafka hadoop # 然後儲存並退出(這條註釋不要寫入到distributed_test.txt檔案中) # 使用Kafka系統命令,檢視主題distributed_connect_test中的資料 [hadoop@dn1 ~]$ kafka-console-consumer.sh --zookeeper dn1:2181 –topic\ distributed_connect_test --from-beginning
4.總結
Kafka 聯結器可以從DB儲存或應用程式伺服器收集資料到Topic,使資料可用於低延遲的流處理。匯出作業可以將資料從Topic傳輸到二次儲存和查詢系統,或者傳遞到批處理系統以便進行離線分析。
5.結束語
這篇部落格就和大家分享到這裡,如果大家在研究學習的過程當中有什麼問題,可以加群進行討論或傳送郵件給我,我會盡我所能為您解答,與君共勉!
另外,博主出書了《Kafka並不難學》和《Hadoop大資料探勘從入門到進階實戰》,喜歡的朋友或同學, 可以在公告欄那裡點選購買連結購買博主的書進行學習,在此感謝大家的支援。關注下面公眾號,根據提示,可免費獲取書籍的教學視訊。