Kafka能做什麼?十分鐘構建你的實時資料流管道

皮皮魯的AI星球發表於2019-12-07

本文將對Kafka做一個入門簡介,並展示如何使用Kafka構建一個文字資料流管道,通過本文,讀者可以瞭解一個流處理資料管道(Pipeline)的大致結構:資料生產者源源不斷地生成資料流,資料流通過訊息佇列投遞,資料消費者非同步地對資料流進行處理。

公眾號

Kafka簡介

2010年,LinkedIn開始了其內部流資料處理平臺的開發,2011年將該系統捐獻給了Apache基金會,取名Apache Kafka(以下簡稱Kafka)。Kafka的創始人Jay Kreps覺得這個系統主要用於優化讀寫,應該用一個作家的名字來命名,加上他很喜歡作家卡夫卡的文學作品,覺得這個名字對於一個開源專案來說很酷,因此取名Kafka。

Kafka是一種面向大資料領域的訊息系統。在大資料生態圈中,Hadoop的HDFS或Amazon S3提供資料儲存服務,Hadoop MapReduce、Spark和Flink負責計算,Kafka是被用來連線這些系統和應用的訊息系統。

Kafka可以連線多個元件和系統

訊息系統的功能

訊息系統一般使用“生產者-消費者(Producer-Consumer)”模型來解決問題。如下圖所示,生產者生成資料,將資料傳送到一個快取區域,消費者從快取區域中消費資料。

生產者消費者模型

訊息系統可以解決以下問題:

  1. 系統解耦。很多企業內部有眾多系統,即使一個APP也包含眾多模組,如果將所有的系統和模組都放在一起作為一個龐大的系統來開發,未來很難維護和擴充套件。如果將各個模組獨立出來,模組之間通過訊息系統來通訊,未來可以輕鬆擴充套件每個獨立模組。另外,假設沒有訊息佇列,M個生產者和N個消費者通訊,會產生M*N個資料管道,訊息佇列將這個複雜度降到了M+N。
  2. 非同步處理。同步是指如果模組A向模組B傳送訊息,必須等待返回結果後才能執行接下來的業務邏輯。非同步是訊息傳送方模組A無需等待返回結果即可繼續執行,只需要向訊息佇列中傳送訊息,至於誰去處理這些訊息,訊息等待多長時間才能被處理等一系列問題,都是消費者負責的事情。非同步處理更像是釋出通知,傳送方不用去關心誰去接收通知,如何對通知做出響應等問題。
  3. 流量削峰。電商促銷、搶票等場景會對系統產生巨大的壓力,瞬時請求暴漲,訊息系統的快取就像一個蓄水池,以很低的成本將上游的洪峰快取起來,下游的服務按照自身處理能力從快取中拉取資料,避免服務崩潰。
  4. 資料冗餘。很多情況下,下游的資料處理模組可能發生故障,訊息系統將資料快取起來,直到資料被處理,一定程度上避免了資料丟失風險。

Kafka作為一個訊息系統,主要提供三種核心能力:

  1. 為資料的生產者提供釋出功能,為資料的消費者提供訂閱功能,即傳統的訊息佇列的能力。
  2. 將資料流快取在快取區,為資料提供容錯性,有一定的資料儲存能力。
  3. 提供了一些輕量級流處理能力。

可見Kafka不僅僅是一個訊息佇列,也有資料儲存和流處理的功能,確切地說,Kafka是一個流處理系統。

Kafka的一些核心概念

Topic

Kafka按照Topic來區分不同的資料。以淘寶這樣的電商平臺為例,某個Topic釋出買家使用者在電商平臺的行為日誌,比如搜尋、點選、聊天、購買等行為;另外一個Topic釋出賣家使用者在電商平臺上的行為日誌,比如上新、發貨、退貨等行為。

Producer

多個Producer將某種資料釋出到某個Topic下。比如電商平臺多臺線上伺服器將買家行為日誌傳送到名為user_behavior的Topic下。

Consumer

多個Consumer被分為一組,名為Cosumer Group,一組Consumer Group訂閱一個Topic下的資料。通常我們可以使用Flink編寫的程式作為Kafka的Consumer來對一個資料流做處理。

使用Kafka構建一個文字資料流

下載和安裝

絕大多數的大資料框架基於Java,因此在進行開發之前要先搭建Java程式設計環境,主要是下載和配置JDK(Java Development Kit)。網路上針對不同作業系統安裝JDK的相關教程已經很多,這裡不再贅述。

接下來我們從Kafka官網(kafka.apache.org/downloads)下…

$ tar -xzf kafka_2.12-2.3.0.tgz
$ cd kafka_2.12-2.3.0
複製程式碼

注意,$符號表示該行命令在類Unix作業系統(Linux和macOS)命令列中執行,而不是在Python互動命令或其他任何互動介面中。Windows的命令列提示符是大於號>。

注意,bin目錄預設為Linux和macOS設計,本文基於macOS,直接了使用bin目錄中的檔案。Windows使用者要進入bin\windows\來啟動相應指令碼,且指令碼檔案字尾要改為.bat

啟動服務

Kafka使用ZooKeeper來管理叢集,因此需要先啟動ZooKeeper。剛剛下載的Kafka包裡已經包含了ZooKeeper的啟動指令碼,可以使用這個指令碼快速啟動一個ZooKeeper服務。

$ bin/zookeeper-server-start.sh config/zookeeper.properties
複製程式碼

啟動成功後將有對應日誌列印到螢幕上。

接下來在新開啟一個命令列會話,啟動Kafka:

$ bin/kafka-server-start.sh config/server.properties
複製程式碼

以上兩個操作均使用config資料夾下的預設配置檔案,需要注意配置檔案的路徑是否寫錯。生產環境下的配置檔案比預設配置檔案複雜得多。

建立Topic

新開啟一個命令列會話,建立一個名為Shakespeare的Topic:

$ bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic Shakespeare
複製程式碼

也可以使用命令檢視已有的Topic:

$ bin/kafka-topics.sh --list --bootstrap-server localhost:9092
Shakespeare
複製程式碼

傳送訊息

接下來我們模擬Producer,假設這個Producer是莎士比亞本人,它不斷向Shakespeare這個Topic下傳送自己的最新作品:

$ bin/kafka-console-producer.sh --broker-list localhost:9092 --topic Shakespeare
>To be, or not to be, that is the question:
複製程式碼

每一行作為一條訊息事件,被髮送到了Kafka叢集上,雖然這個叢集只有本機這一臺伺服器。

消費資料

另外一些人想了解莎士比亞向Kafka傳送過哪些新作,所以需要使用一個Consumer來消費剛剛傳送的資料。我們啟動一個命令列會話來模擬Consumer:

$ bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic Shakespeare --from-beginning
To be, or not to be, that is the question:
複製程式碼

Producer端和Consumer端在不同的命令列會話中,我們可以在Producer的命令列會話裡不斷輸入一些文字,切換到Consumer端後,可以看到相應的文字被髮送了過來。

至此,模擬了一個實時資料流資料管道:不同人可以建立屬於自己的Topic,釋出屬於自己的內容,其他人可以訂閱一到多個Topic,根據自身需求設計後續處理邏輯。

小結

Kafka是一種訊息系統,提供了資料流“釋出/訂閱”功能,保證了資料冗餘。

相關文章