@
目錄
- 1 Kafka 是什麼?
- 1.1 背景
- 1.2 定位
- 1.3 産生的原因
- 1.4 Kafka 有哪些特征
- 消息和批次
- 模式
- 主題和分區
- 生産者和消費者
- broker 和 叢集
- 1.5 Kafka 可以做什麼
- Kafka作為消息系統
- Kafka 作為存儲系統
- Kafka用做流處理
- 批處理
- 2 為什麼選擇 Kafka
- 2.1 多個生産者
- 2.2 多個消費者
- 2.3 磁盤資料存儲
- 2.4 伸縮性
- 2.5 高性能
- 3 怎麼使用 Kafka
- 3.1 安裝 JDK
- 3.2 安裝 zookeeper
- 3.2.1 下載下傳
- 3.2.2 解壓
- 3.2.3 修改配置檔案
- 3.2.4 添加系統變量
- 3.2.5 測試安裝是否成功
- 3.3 安裝 Kafka
- 3.3.1 下載下傳
- 3.3.2 解壓
- 3.3.3 修改配置檔案
- 3.4 測試
- 3.4.1 啟動 zookeeper
- 3.4.2 啟動 Kafka 伺服器
- 3.4.3 建立 topic
- 3.4.4 建立生産者
- 3.4.4 建立消費者
當我在學習一個新技術的時候, 入門階段, 基本上都遵循
是什麼->為什麼->怎麼用
這樣的原則。
Kafka 最初是 LinkedIn 的一個内部基礎設施系統, 後續捐贈給了 Apache, 目前是 Apache 的一個頂級項目。
在官網中, 現定位是分布式流處理平台:
- 可以讓你釋出和訂閱流式的記錄。這一方面與消息隊列或者企業消息系統類似
- 可以儲存流式的記錄,并且有較好的容錯性
- 可以在流式記錄産生時就進行處理
它可以用于兩大類别的應用:
- 構造實時流資料管道,它可以在系統或應用之間可靠地擷取資料。 (相當于message queue)
- 建構實時流式應用程式,對這些流資料進行轉換或者影響。 (就是流處理,通過kafka stream topic和topic之間内部進行變化)
OK, 暫時了解這些就夠了。
Kafka 産生的原因, 與其他類似的系統産生的原因相似。
在日常的程式中, 我們除了需要處理業務邏輯之外, 還需要對我們的程式進行一些額外的工作, 舉個兩類:
- 業務系統和應用程式的性能監控名額資料。
- 使用者操作行為資料。
剛開始, 類似此類情況我們可以讓程式直接連接配接到度量顯示度量名額的應用程式上, 通過此連接配接将相應的資料推送過去, 進行顯示
這是比較基礎的方案。 後面, 随着需求的增長, 需要分析更長時間片段的度量名額, 原先的一個性能監控伺服器滿足不了需求, 我們又增加了一台性能監控伺服器。 在後面, 我們又多了幾個應用, 又陸續增加了很多監控相關的伺服器。 後續由于各種原因, 又增加了很多伺服器。
顯得一團糟糕。 此時, 維護成本就增加了。 是以, 我們決定進行改進, 專門做一個應用程式進行采集, 并給其他系統進行查詢。
此時, 一個釋出與訂閱的系統就建成了。
那這隻是度量名額的一個系統, 公司還有其他的, 比如日志, 使用者行為跟蹤, 如果都使用相同的方式建立這些系統, 則系統就變成這樣
随着公司規模的增長, 需要搭建類似的系統越來越多, 相應又需要付出很多元護成本。同時, 系統之間的無法實作互動。
很顯然, 我們需要對這些系統進行大一統, 同時進行改進。
是以, Kafka 就誕生了。
Kafka 在設計之初的目标:
- 為生産者和消費者提供一套簡單的 API。
- 降低網絡傳輸和磁盤存儲開銷;
- 具有高伸縮架構
很顯然, 這 3 點目标都做到了。
消息: Kafka 的資料單元。 一條消息在 Kafka 中可以看出資料庫中的一條記錄。 消息由位元組數組組成, 對應有一個鍵, 鍵是在消息以可控的方式寫入到分區時需要用到的。
批次: 一組消息, 這些消息屬于同一個主題和分析。 如果每個消息但單獨傳輸, 會大緻大量的網絡開銷, 分批次傳輸可以降低。 但批次越大, 對應機關時間内需要處理的消息越多, 單個消息的傳輸時間越長。
消息在 Kafka 中以位元組數組存儲, 是以, 如果我們以額外的結構來定義這些消息, 就可以讓消息更好的被了解。
如 JSON, XML, 大家都很熟悉, 用起來也不錯。 但在 Kafka 中推薦使用 Apache Avro, 是 Hadoop 的一款序列化的架構。
Kafka 的消息通過主題進行分類。 主題就好比資料庫的表, 或者系統檔案中的檔案夾。
主題可以被分為若幹分區, 一個分區就是一個送出日志。 通過分區, Kafka 可以實作資料的備援和伸縮性。 同時, 分區可以在不同的伺服器上, 達到一個主題跨越多個伺服器。
每個分區都是有序且順序不可變的記錄集,并且不斷地追加到結構化的commit log檔案。分區中的每一個記錄都會配置設定一個id号來表示順序,我們稱之為offset,offset用來唯一的辨別分區中每一條記錄。
在每一個消費者中唯一儲存的中繼資料是offset(偏移量)即消費在log中的位置.偏移量由消費者所控制:通常在讀取記錄後,消費者會以線性的方式增加偏移量,但是實際上,由于這個位置由消費者控制,是以消費者可以采用任何順序來消費記錄
消息以追加的方式寫入分區, 然後以先入先出的順序讀取。 由于分區的存在, 無法保證主題消息的順序, 但可以保證單個分區的順序。
Kafka 的用戶端就是 Kafka 的系統使用者, 可以被分成兩類: 生産者和消費者。
生産者産生消息。 一般情況下, 一個消息會被釋出到一個主題上。 在預設情況下, 生産者會把消息均衡的分布到主題的所有分區中, 不需要關心特定消息具體在哪個區。 但在某些情況下, 生産者會把消息直接寫到指定的分區。 通常是通過分區器和鍵來實作的, 分區器為鍵生成一個散列, 并将其映射到指定的分區上。
消費者訂閱消息。 消費者訂閱一個或多個主題, 并按照消息生成的順序讀取它們。 消費者使用一個消費組 名稱來進行辨別,即會有一個或多個消費者共同讀取一個主題。 群組用來保證每個分區隻能被一個消費者使用(但一個消費者可以消費多個分區)。 消費者和分區的映射, 通常稱之為所有權關系。
broker 是一個獨立的 Kafka 伺服器。 broker 接收來自生産者的消息, 為消息設定偏移量, 并送出到磁盤中儲存。 broker 為消費者提供服務, 對讀取扥去的請求作出響應, 傳回磁盤上的消息。 單個 broker 可以輕松處理數千分區和每秒百萬級的消息量。
broker 是叢集的組成部分。 每個叢集有一個 broker 同時充當了叢集控制器的角色。 負責将分區配置設定給 broker 和監控 broker。 在叢集中, 一個分區從屬于一個broker, 該 broker 被稱為分區的首領。
Kafka 作為一款優秀的消息系統, 具有高吞吐量, 内置的分區, 備份備援分布式等特點。
傳統的消息隊列:在隊列中,消費者池從server讀取資料,每條記錄被池子中的一個消費者消費, 但隊列隊列不是多訂閱者模式的—一旦一個程序讀取了資料,資料就會被丢棄。
釋出-訂閱系統: 記錄被廣播到所有的消費者。 釋出-訂閱系統允許你廣播資料到多個程序,但是無法進行擴充處理,因為每條消息都會發送給所有的訂閱者
Kafka 消息隊列, 在隊列中,消費組允許你将處理過程分發給一系列程序(消費組中的成員)。 在釋出訂閱中,Kafka允許你将消息廣播給多個消費組。
資料寫入Kafka後被寫到磁盤,并且進行備份以便容錯。直到完全備份,Kafka才讓生産者認為完成寫入,即使寫入失敗Kafka也會確定繼續寫入
Kafka使用磁盤結構,具有很好的擴充性—50kb和50TB的資料在server上表現一緻。
可以存儲大量資料,并且可通過用戶端控制它讀取資料的位置,您可認為Kafka是一種高性能、低延遲、具備日志存儲、備份和傳播功能的分布式檔案系統。
Kafka 流處理不僅僅用來讀寫和存儲流式資料,它最終的目的是為了能夠進行實時的流處理。
将 Kafka 已收集的資料提供給其他流式計算架構進行處理。
通過組合存儲和低延遲訂閱,流式應用程式可以以同樣的方式處理過去和未來的資料。 一個單一的應用程式可以處理曆史記錄的資料,并且可以持續不斷地處理以後到達的資料,而不是在到達最後一條記錄時結束程序
Kafka 支援多個生産者, 不管用戶端在使用單個主題還是多個主題。
Kafka 支援多個消費者從一個單獨的流系統上讀取資料。 而且消費者之間互不影響。 多個消費者組成一個群組, 共享一個消息流, 并保證整個群主對每個給定消息隻處理一次。
Kafka 不僅支援多個消費者, 還允許消費者非實時地讀取消息, 這要歸功于 Kafka 的資料保留特性。 每個主題可以單獨設定保留規則, 以便滿足不同消費者的需求。 同時, 消費者可能因為處理速度慢或突發的流量高峰導緻無法及時讀取消息, 持久化可以保證資料不會丢失。
使用者可以開始時隻使用單個 broker, 後續随着資料量的增加, 不斷的增加 broker 的數量。 多個 broker 可以很好的進行容錯,容災處理。
通過進行橫向擴充生産者, 消費者和 broker, Kafka 可以輕松的處理巨大的資料流。
我這次的使用安裝是在 windows 上的(單機版)。
JDK 怎麼安裝就不說了, 網上搜一下就出來了。
網址 http://zookeeper.apache.org/releases.html#download, 從中選擇一個鏡像位址, 下載下傳最新的穩定版本, 我的版本是
zookeeper-3.4.13.tar.gz
解壓到指定的目錄下, 我的 zookeeper 目錄
D:\Program Files\zookeeper-3.4.13
首先, 需要重命名, 打開
zookeeper-3.4.13\conf
将 “zoo_sample.cfg” 重命名為 “zoo.cfg ”。
打開 zoo.cfg, 更改資料目錄
dataDir=D:\Program Files\zookeeper-3.4.13\temp
在系統環境變量中添加 ZOOKEEPER_HOME, 值為 D:\Program Files\zookeeper-3.4.13。
編輯已有的 path 系統變量,添加路徑:%ZOOKEEPER_HOME%\bin
以管理者的權限打開 cmd, 運作 zkServer。
測試成功。
網址 http://kafka.apache.org/downloads, 選擇指定的版本(我的是 kafka_2.12-1.0.0.tgz), 并選擇相應的鏡像進行下載下傳。
D:\Program Files\kafka_2.12-1.0.0
打開
kafka_2.12-1.0.0\config\server.properties
找到以下配置, 并修改
// log 目錄
log.dirs=D:\\Program Files\\kafka_2.12-1.0.0\\kafka-logs
// zookeeper
zookeeper.connect=localhost:2181
不要關閉!!
打卡 cmd 指令視窗, 打開kafka所在安裝目錄。
輸入
.\bin\windows\kafka-server-start.bat .\config\server.properties
啟動成功, 不要關閉
運作
.\bin\windows\kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic hello
.\bin\windows\kafka-console-producer.bat --broker-list localhost:9092 --topic hello
可以随便輸入一些内容
打卡 cmd 指令視窗, 打開kafka所在安裝目錄
.\bin\windows\kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic hello --from-beginning
可以看到之前生産者輸出的東西。
此時, 在生産者處在發送消息, 消費者就可以接收到。
作者:阿進的寫字台
出處:https://www.cnblogs.com/homejim/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。