Kafka 入門三問


@

當我在學習一個新技術的時候, 入門階段, 基本上都遵循

是什么->為什么->怎么用

這樣的原則。

1 Kafka 是什么?

1.1 背景

Kafka 最初是 LinkedIn 的一個內部基礎設施系統, 后續捐贈給了 Apache, 目前是 Apache 的一個頂級項目。

1.2 定位

在官網中, 現定位是分布式流處理平台

  1. 可以讓你發布和訂閱流式的記錄。這一方面與消息隊列或者企業消息系統類似
  2. 可以儲存流式的記錄,並且有較好的容錯性
  3. 可以在流式記錄產生時就進行處理

它可以用於兩大類別的應用:

  1. 構造實時流數據管道,它可以在系統或應用之間可靠地獲取數據。 (相當於message queue)
  2. 構建實時流式應用程序,對這些流數據進行轉換或者影響。 (就是流處理,通過kafka stream topic和topic之間內部進行變化)

OK, 暫時了解這些就夠了。

1.3 產生的原因

Kafka 產生的原因, 與其他類似的系統產生的原因相似。

在日常的程序中, 我們除了需要處理業務邏輯之外, 還需要對我們的程序進行一些額外的工作, 舉個兩類:

  1. 業務系統和應用程序的性能監控指標數據。
  2. 用戶操作行為數據。

剛開始, 類似此類情況我們可以讓程序直接連接到度量顯示度量指標的應用程序上, 通過此連接將相應的數據推送過去, 進行顯示

基礎監控

這是比較基礎的方案。 后面, 隨着需求的增長, 需要分析更長時間片段的度量指標, 原先的一個性能監控服務器滿足不了需求, 我們又增加了一台性能監控服務器。 在后面, 我們又多了幾個應用, 又陸續增加了很多監控相關的服務器。 后續由於各種原因, 又增加了很多服務器。
多數據監控

顯得一團糟糕。 此時, 維護成本就增加了。 因此, 我們決定進行改進, 專門做一個應用程序進行采集, 並給其他系統進行查詢。
簡單的發布與訂閱系統

此時, 一個發布與訂閱的系統就建成了。

那這只是度量指標的一個系統, 公司還有其他的, 比如日志, 用戶行為跟蹤, 如果都使用相同的方式創建這些系統, 則系統就變成這樣

多發布與訂閱系統

隨着公司規模的增長, 需要搭建類似的系統越來越多, 相應又需要付出很多維護成本。同時, 系統之間的無法實現交互。

很顯然, 我們需要對這些系統進行大一統, 同時進行改進。

因此, Kafka 就誕生了。

Kafka 在設計之初的目標:

  1. 為生產者和消費者提供一套簡單的 API。
  2. 降低網絡傳輸和磁盤存儲開銷;
  3. 具有高伸縮架構

很顯然, 這 3 點目標都做到了。

Kafka

1.4 Kafka 有哪些特征

消息和批次

消息: Kafka 的數據單元。 一條消息在 Kafka 中可以看出數據庫中的一條記錄。 消息由字節數組組成, 對應有一個鍵, 鍵是在消息以可控的方式寫入到分區時需要用到的。

批次: 一組消息, 這些消息屬於同一個主題和分析。 如果每個消息但單獨傳輸, 會大致大量的網絡開銷, 分批次傳輸可以降低。 但批次越大, 對應單位時間內需要處理的消息越多, 單個消息的傳輸時間越長。

模式

消息在 Kafka 中以字節數組存儲, 因此, 如果我們以額外的結構來定義這些消息, 就可以讓消息更好的被理解。

如 JSON, XML, 大家都很熟悉, 用起來也不錯。 但在 Kafka 中推薦使用 Apache Avro, 是 Hadoop 的一款序列化的框架。

主題和分區

Kafka 的消息通過主題進行分類。 主題就好比數據庫的表, 或者系統文件中的文件夾。

主題可以被分為若干分區, 一個分區就是一個提交日志。 通過分區, Kafka 可以實現數據的冗余和伸縮性。 同時, 分區可以在不同的服務器上, 達到一個主題跨越多個服務器。

分區

每個分區都是有序且順序不可變的記錄集,並且不斷地追加到結構化的commit log文件。分區中的每一個記錄都會分配一個id號來表示順序,我們稱之為offset,offset用來唯一的標識分區中每一條記錄。

在每一個消費者中唯一保存的元數據是offset(偏移量)即消費在log中的位置.偏移量由消費者所控制:通常在讀取記錄后,消費者會以線性的方式增加偏移量,但是實際上,由於這個位置由消費者控制,所以消費者可以采用任何順序來消費記錄

消費者offset

消息以追加的方式寫入分區, 然后以先入先出的順序讀取。 由於分區的存在, 無法保證主題消息的順序, 但可以保證單個分區的順序。

生產者和消費者

Kafka 的客戶端就是 Kafka 的系統用戶, 可以被分成兩類: 生產者和消費者。

生產者產生消息。 一般情況下, 一個消息會被發布到一個主題上。 在默認情況下, 生產者會把消息均衡的分布到主題的所有分區中, 不需要關心特定消息具體在哪個區。 但在某些情況下, 生產者會把消息直接寫到指定的分區。 通常是通過分區器和鍵來實現的, 分區器為鍵生成一個散列, 並將其映射到指定的分區上。

消費者訂閱消息。 消費者訂閱一個或多個主題, 並按照消息生成的順序讀取它們。 消費者使用一個消費組 名稱來進行標識,即會有一個或多個消費者共同讀取一個主題。 群組用來保證每個分區只能被一個消費者使用(但一個消費者可以消費多個分區)。 消費者和分區的映射, 通常稱之為所有權關系。

broker 和 集群

broker 是一個獨立的 Kafka 服務器。 broker 接收來自生產者的消息, 為消息設置偏移量, 並提交到磁盤中保存。 broker 為消費者提供服務, 對讀取扥去的請求作出響應, 返回磁盤上的消息。 單個 broker 可以輕松處理數千分區和每秒百萬級的消息量。

broker 是集群的組成部分。 每個集群有一個 broker 同時充當了集群控制器的角色。 負責將分區分配給 broker 和監控 broker。 在集群中, 一個分區從屬於一個broker, 該 broker 被稱為分區的首領。

1.5 Kafka 可以做什么

Kafka作為消息系統

Kafka 作為一款優秀的消息系統, 具有高吞吐量, 內置的分區, 備份冗余分布式等特點。

傳統的消息隊列:在隊列中,消費者池從server讀取數據,每條記錄被池子中的一個消費者消費, 但隊列隊列不是多訂閱者模式的—一旦一個進程讀取了數據,數據就會被丟棄。

發布-訂閱系統: 記錄被廣播到所有的消費者。 發布-訂閱系統允許你廣播數據到多個進程,但是無法進行擴展處理,因為每條消息都會發送給所有的訂閱者

Kafka 消息隊列, 在隊列中,消費組允許你將處理過程分發給一系列進程(消費組中的成員)。 在發布訂閱中,Kafka允許你將消息廣播給多個消費組。

Kafka 作為存儲系統

數據寫入Kafka后被寫到磁盤,並且進行備份以便容錯。直到完全備份,Kafka才讓生產者認為完成寫入,即使寫入失敗Kafka也會確保繼續寫入

Kafka使用磁盤結構,具有很好的擴展性—50kb和50TB的數據在server上表現一致。

可以存儲大量數據,並且可通過客戶端控制它讀取數據的位置,您可認為Kafka是一種高性能、低延遲、具備日志存儲、備份和傳播功能的分布式文件系統。

Kafka用做流處理

Kafka 流處理不僅僅用來讀寫和存儲流式數據,它最終的目的是為了能夠進行實時的流處理。

將 Kafka 已收集的數據提供給其他流式計算框架進行處理。

批處理

通過組合存儲和低延遲訂閱,流式應用程序可以以同樣的方式處理過去和未來的數據。 一個單一的應用程序可以處理歷史記錄的數據,並且可以持續不斷地處理以后到達的數據,而不是在到達最后一條記錄時結束進程

2 為什么選擇 Kafka

2.1 多個生產者

Kafka 支持多個生產者, 不管客戶端在使用單個主題還是多個主題。

2.2 多個消費者

Kafka 支持多個消費者從一個單獨的流系統上讀取數據。 而且消費者之間互不影響。 多個消費者組成一個群組, 共享一個消息流, 並保證整個群主對每個給定消息只處理一次。

2.3 磁盤數據存儲

Kafka 不僅支持多個消費者, 還允許消費者非實時地讀取消息, 這要歸功於 Kafka 的數據保留特性。 每個主題可以單獨設置保留規則, 以便滿足不同消費者的需求。 同時, 消費者可能因為處理速度慢或突發的流量高峰導致無法及時讀取消息, 持久化可以保證數據不會丟失。

2.4 伸縮性

用戶可以開始時只使用單個 broker, 后續隨着數據量的增加, 不斷的增加 broker 的數量。 多個 broker 可以很好的進行容錯,容災處理。

2.5 高性能

通過進行橫向擴展生產者, 消費者和 broker, Kafka 可以輕松的處理巨大的數據流。

3 怎么使用 Kafka

我這次的使用安裝是在 windows 上的(單機版)。

3.1 安裝 JDK

JDK 怎么安裝就不說了, 網上搜一下就出來了。

3.2 安裝 zookeeper

3.2.1 下載

網址 http://zookeeper.apache.org/releases.html#download, 從中選擇一個鏡像地址, 下載最新的穩定版本, 我的版本是

zookeeper-3.4.13.tar.gz

3.2.2 解壓

解壓到指定的目錄下, 我的 zookeeper 目錄

D:\Program Files\zookeeper-3.4.13

3.2.3 修改配置文件

首先, 需要重命名, 打開

zookeeper-3.4.13\conf

將 “zoo_sample.cfg” 重命名為 “zoo.cfg ”。

打開 zoo.cfg, 更改數據目錄

dataDir=D:\Program Files\zookeeper-3.4.13\temp

3.2.4 添加系統變量

在系統環境變量中添加 ZOOKEEPER_HOME, 值為 D:\Program Files\zookeeper-3.4.13

編輯已有的 path 系統變量,添加路徑:%ZOOKEEPER_HOME%\bin

3.2.5 測試安裝是否成功

管理員的權限打開 cmd, 運行 zkServer

zookeeper運行

測試成功。

3.3 安裝 Kafka

3.3.1 下載

網址 http://kafka.apache.org/downloads, 選擇指定的版本(我的是 kafka_2.12-1.0.0.tgz), 並選擇相應的鏡像進行下載。

3.3.2 解壓

解壓到指定的目錄下, 我的 zookeeper 目錄

D:\Program Files\kafka_2.12-1.0.0

3.3.3 修改配置文件

打開

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

3.4 測試

3.4.1 啟動 zookeeper

管理員的權限打開 cmd, 運行 zkServer
zookeeper運行

不要關閉!!

3.4.2 啟動 Kafka 服務器

打卡 cmd 命令窗口, 打開kafka所在安裝目錄。

D:\Program Files\kafka_2.12-1.0.0
打開kafka所在安裝目錄

輸入

.\bin\windows\kafka-server-start.bat .\config\server.properties

啟動成功, 不要關閉

3.4.3 創建 topic

打卡 cmd 命令窗口, 打開kafka所在安裝目錄。

運行

.\bin\windows\kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic hello

創建hello話題

3.4.4 創建生產者

打卡 cmd 命令窗口, 打開kafka所在安裝目錄。

運行

.\bin\windows\kafka-console-producer.bat --broker-list localhost:9092 --topic hello

創建生產者

可以隨便輸入一些內容

3.4.4 創建消費者

打卡 cmd 命令窗口, 打開kafka所在安裝目錄

運行

.\bin\windows\kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic hello --from-beginning

創建消費者

可以看到之前生產者輸出的東西。

此時, 在生產者處在發送消息, 消費者就可以接收到。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM