一、Kafka 簡介
1.基本概念
Kafka 是一個分散式的基於釋出/訂閱訊息系統,主要應用於大資料實時處理領域,其官網是:http://kafka.apache.org/。Kafka 是一個分散式、支援分割槽的(Partition)、多副本的(Replica),基於 ZooKeeper 協調的釋出/訂閱訊息系統。
Kafka 有以下三個基本概念:
- Kafka 作為一個叢集執行在一個或多個伺服器上;
- Kafka 叢集儲存的訊息是以 Topic 為類別記錄的;
- 每個訊息是由一個 Key,一個 Value 和時間戳構成。
2.基本架構
Kafka 的基本架構圖如下:
- Producer:生產者,就是向 Broker 發訊息的客戶端;
- Consumer:消費者,就是從 Broker 取訊息的客戶端;
- Consumer Group:消費者組,由多個消費者組成。組內每個消費者負責消費不同分割槽的資料,一個分割槽的資料只能由一個組內的消費者進行消費,組內消費者之間互不影響;
- Broker:一個 Kafka 伺服器就是一個 Broker,一個叢集由多個 Broker 組成;
- Topic:主題,可以理解為佇列,生成者和消費者都是用的同一個佇列;
- Partition:分割槽,為實現擴充套件性,一個大的 Topic 可以分散到多個 Broker 上,一個 Topic 可以分為多個 Partition;
- Replica:副本,保證叢集中某個節點發生故障時,該節點上的資料不丟失。
二、Ubuntu 下安裝 Kafka
1.安裝 Java
更新軟體包
sudo apt-get update
安裝 openjdk-8-jdk
sudo apt-get install openjdk-8-jdk
檢視 Java 版本,檢查是否安裝成功
2.安裝 ZooKeeper
1)安裝
下載 ZooKeeper:http://mirrors.hust.edu.cn/apache/zookeeper/。
下載好之後解壓(注意:3.5.5之後的版本應該下載檔名中帶“bin”的壓縮包),再執行如下命令:
sudo mv apache-zookeeper-3.5.8-bin /usr/local/zookeeper
cd /usr/local/zookeeper
cp conf/zoo_sample.cfg conf/zoo.cfg
其中有一些配置引數:
- tickTime:Zookeeper 使用的基本時間單元,預設值2000;
- initLimit:Zookeeper 中連線同步的最大時間,預設值為10;
- syncLimit:Zookeeper 中進行心跳檢測的最大時間,預設值為5;
- dataDir:資料庫更新事物儲存的目錄;
- clientPort:Zookeeper 服務監聽的埠,預設值為2181。
2)配置
修改 /etc/profile 檔案,增加如下內容:
export ZOOKEEPER_HOME=/usr/local/zookeeper/
export PATH=$PATH:$ZOOKEEPER_HOME/bin
更新環境變數
source /etc/profile
3)測試
首先進入 bin 目錄,開啟服務:
再啟動 CLI 連線服務:
3.安裝 Kafka
1)安裝
下載 Kafka:http://kafka.apache.org/downloads。
下載好之後解壓,再執行如下命令:
sudo mv kafka_2.13-2.5.0/ /usr/local/kafka
cd /usr/local/kafka
2)測試
由於前面已經啟動了 Zookeeper 服務,所以這裡只需要執行如下命令來開啟 Kafka 服務:
bin/kafka-server-start.sh config/server.properties
通過輸出資訊可以看到 Kafka 服務已經成功開啟了,截圖如下:
但這樣開啟之後是阻塞的了,我們可以在中間加一個“-daemon”即開一個守護程式來執行,則命令如下:
bin/kafka-server-start.sh -daemon config/server.properties
建立一個主題,用一個分割槽和一個副本建立一個名為“mytopic”的主題:
bin/kafka-topics.sh --create --zookeeper 127.0.0.1:2181 --replication-factor 1 --partitions 1 --topic mytopic
這樣就已經建立成功了,然後可以使用如下命令檢視主題:
bin/kafka-topics.sh --list --zookeeper 127.0.0.1:2181
Kafka 有一個命令列服務端,它將從檔案或標準輸入中獲取輸入,並將其作為訊息傳送到 Kafka 叢集。預設情況下,每行將作為單獨的訊息傳送:
bin/kafka-console-producer.sh --broker-list 127.0.0.1:9092 --topic mytopic
同樣的,Kafka 還有一個命令列客戶端,可以從 Kafka 叢集中獲取訊息:
bin/kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 --topic mytopic --from-beginning
三、kafka-python 使用
1.安裝 kafka-python
pip3 install kafka-python
2.建立 Consumer
Consumer 消費者負責從 Kafka 中獲取訊息進行處理,需要例項化 KafkaConsumer 這個類。
1 from kafka import KafkaConsumer 2 3 4 consumer = KafkaConsumer("test", bootstrap_servers=["localhost:9092"]) 5 for msg in consumer: 6 print(msg)
3.建立 Producer
Producer 生產者負責向 Kafka 生產和傳送訊息,需要例項化 KafkaProducer 這個類。
1 from kafka import KafkaProducer 2 3 4 producer = KafkaProducer(bootstrap_servers="localhost:9092") 5 for i in range(10): 6 producer.send("test", "Hello {}".format(i).encode("utf-8")) 7 producer.close()
4.執行測試
先執行消費者程式,再執行生產者程式,消費者一直在監聽,等到生產者傳送訊息,消費者就把訊息取出,執行結果如下:
可以看到其中每個訊息都包含了主題、分割槽、訊息內容、時間戳等資訊。