kafka官方文件學習筆記2–QuickStart

積澱發表於2018-01-17

下載kafka

https://www.apache.org/dyn/closer.cgi?path=/kafka/1.0.0/kafka_2.11-1.0.0.tgz

解壓安裝包

> tar -xzf kafka_2.11-1.0.0.tgz
> cd kafka_2.11-1.0.0/bin

檢視bin目錄下主要幾個指令碼功能如下:

指令碼 功能
kafka-server-start.sh 啟動kafka伺服器;
kafka-server-stop.sh 停止kafka伺服器;
kafka-topics.sh topic管理;
kafka-console-producer.sh 基於命令列的生產者;
kafka-console-consumer.sh 基於命令列的消費者;
kafka-run-class.sh 執行java類的指令碼,由kafka-server-start.sh和kafka-server-stop.sh、kafka-topics.sh等指令碼呼叫;
zookeeper-server-start.sh 啟動kafka自帶的zookeeper伺服器;
zookeeper-server-stop.sh 停止kafka自帶的zookeeper伺服器;
zookeeper-shell.sh 在命令列連線zookeeper的客戶端工具;
connect-standalone.sh 在命令列啟動單點的connector;
connect-distributed.sh 在命令列啟動基於叢集connector;

注:kafka的安裝包除了包括kafka自身的工具以外,也包括了一系列簡易的zookeeper工具,能夠通過zookeeper-server-start.sh指令碼啟動簡易的單點zookeeper例項,供kafka使用。但一般僅限於測試環境使用;

config目錄下存放的是kafka服務、自帶zk服務以及基於命令列的生產者、消費者工具對應的配置檔案,常用如下:

指令碼 功能
server.properties kafka例項的配置檔案,配置kafka最重要的配置檔案;
log4j.properties kafka日誌配置;
zookeeper.properties 自帶zk的配置檔案;
producer.properties 基於命令列的生產者工具配置檔案;(測試用)
consumer.properties 基於命令列的消費者工具配置檔案;(測試用)
connect-standalone.properties 自帶單點connector的配置檔案,存放connector的序列化方式、監聽broker的地址埠等通用配置;(測試用)
connect-file-source.properties 配置檔案讀取connector,用於逐行讀取檔案,匯入入topic;(測試用)
connect-file-sink.properties 配置檔案寫入connector,用於將topic中的資料匯出到topic中;(測試用)

啟動zk服務,預設埠:2181

> bin/zookeeper-server-start.sh config/zookeeper.properties
[2018-01-16 20:22:52,327] INFO Reading configuration from: config/zookeeper.properties (org.apache.zookeeper.server.quorum.QuorumPeerConfig)
...

啟動kafka服務,預設埠:9092

> bin/kafka-server-start.sh config/server.properties
[2018-01-16 20:23:52,758] INFO KafkaConfig values:
...

經過如上兩步,我們就啟動了一個簡易的kafka叢集(具有1個zookeeper例項和1個kafka例項的叢集)

檢視zookeeper中存放的kafka資訊

> bin/zookeeper-shell.sh localhost:2181
Connecting to localhost:2181
Welcome to ZooKeeper!
JLine support is disabled

WATCHER::

WatchedEvent state:SyncConnected type:None path:null
ls /
[cluster, controller, controller_epoch, brokers, zookeeper, admin, isr_change_notification, consumers, log_dir_event_notification, latest_producer_id_block, config]
ls /brokers
[ids, topics, seqid]
ls /brokers/topics
[test]
ls /brokers/ids
[0]

“ls /”命令列出了zk根節點下的所有元素,可以看到kafka在zk中存放了叢集(cluster)、例項(brokers)、消費者(consumers)等資訊;zookeeper服務作為kafka的後設資料管理服務,因而每次對kafka服務操作都需要指定zookeeper服務的地址,以便於獲取kafka的後設資料,連線到正確的kafka叢集;

建立topic

> bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
Created topic "test".

建立一個名為test的topic,包含1個複本,1個分割槽;

檢視叢集中的所有topic

> bin/kafka-topics.sh --list --zookeeper localhost:2181
test

啟動生產者,並寫入測試訊息

> bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
> Hello World1
> I`m a programer

啟動消費者,接收訊息

> bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
Hello World1
I`m a programer

可以看到生產者寫入的訊息,都能夠立刻被消費者接收並列印出來。需要注意的是,生產者和消費者通過topic這個概念來建立聯絡,只有消費者指定與生產者相同的topic,才能夠消費其產生的消費;

刪除topic

> bin/kafka-topics.sh --zookeeper localhost:2181 --delete --topic test
Topic test is marked for deletion.
Note: This will have no impact if delete.topic.enable is not set to true.

建立多個kafka例項的叢集

拷貝配置檔案,修改例項ID、日誌目錄、監聽埠:

> cp config/server.properties config/server-1.properties
> cp config/server.properties config/server-2.properties

修改配置項如下:

config/server-1.properties:
    broker.id=1
    listeners=PLAINTEXT://:9093
    log.dir=/tmp/kafka-logs-1
 
config/server-2.properties:
    broker.id=2
    listeners=PLAINTEXT://:9094
    log.dir=/tmp/kafka-logs-2

啟動例項:

> bin/kafka-server-start.sh config/server-1.properties &
...
> bin/kafka-server-start.sh config/server-2.properties &
...

新建topic

> bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 1 --topic my-replicated-topic
Created topic "my-replicated-topic".

新建一個名為my-replicated-topic的topic,有3個副本和1個分割槽;

檢視topic狀態描述

> bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-replicated-topic
Topic:my-replicated-topic    PartitionCount:1    ReplicationFactor:3    Configs:
    Topic: my-replicated-topic    Partition: 0    Leader: 0    Replicas: 0,1,2    Isr: 0,1,2

topic上有幾個partition,就會展示幾行記錄;欄位含義如下:

  • leader:標識當前partition的leader節點是那個,通過broker.id標識;一個partition只有一個leader節點,負責接收和處理讀寫請求;
  • replicas:標識當前partition的所有副本所在的節點,無論節點是否是leader節點,也無論節點是否”存活”,通過broker.id標識;
  • isr:標識存活且與leader節點同步的節點,即可用的副本(包括leader借點);通過broker.id標識;

檢視最初建立的test狀態描述:

>  bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic test
Topic:test    PartitionCount:1    ReplicationFactor:1    Configs:
    Topic: test    Partition: 0    Leader: 0    Replicas: 0    Isr: 0

可以看到,因為test只有1個副本、1個partition,所以只能分佈在一個例項上;

模擬leader切換

對於包含多個副本的topic而言,當一個副本所在的例項不可用時,將會從其它可用副本中選擇一個作為leader;
在叢集節點都正常的情況下,檢視topic的狀態:

>  bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-replicated-topic
Topic:my-replicated-topic    PartitionCount:1    ReplicationFactor:3    Configs:
    Topic: my-replicated-topic    Partition: 0    Leader: 0    Replicas: 0,1,2    Isr: 0,1,2

關掉broker.id=0的例項,再次檢視,發現leader節點已經切換,同時isr中不包含”不可用”節點0:

>  bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-replicated-topic
Topic:my-replicated-topic    PartitionCount:1    ReplicationFactor:3    Configs:
    Topic: my-replicated-topic    Partition: 0    Leader: 1    Replicas: 0,1,2    Isr: 1,2

重新啟動broker.id=0的例項,再次檢視,發現isr中包括了節點0,說明可用。

使用kafka connect匯入/匯出資料

kafka connect是kafka與外部系統互動的工具,通過執行不同的connector,實現與不同外部系統的互動,包括資料的匯入/匯出。如下模擬從檔案匯入資料到kafka,以及從kafka匯出資料到檔案;

  1. 首先,建立檔案,寫入測試資料:
> cd kafka_2.11-1.0.0
> echo "Hello World" > test.txt

注:一定是在kafka根目錄中建立名為test.txt的檔案,否則不會讀取;

2.啟動2個單點的connector,這兩個connector都是kafka自帶的,一個用於讀取檔案寫入topic,另一個用於將topic中資料匯出到檔案;

> bin/connect-standalone.sh config/connect-standalone.properties config/connect-file-source.properties config/connect-file-sink.properties
[2018-01-17 10:37:32,568] INFO Kafka Connect standalone worker initializing ... (org.apache.kafka.connect.cli.ConnectStandalone:65)

connect-console-source.properties檔案內容:

name=local-console-source
# connector入口
connector.class=org.apache.kafka.connect.file.FileStreamSourceConnector
tasks.max=1
# connector關聯的topic
topic=connect-test

connect-console-sink.properties檔案內容:

name=local-console-sink
# connector入口
connector.class=org.apache.kafka.connect.file.FileStreamSinkConnector
tasks.max=1
# connector關聯的topic
topics=connect-test

在kafka根目錄可以看到生成了名為test.sink.txt的檔案,其中的內容即為test.txt中的內容,持續向test.txt中append內容,test.sink.txt中的內容也隨之append;

注:因為同步過程是監聽檔案的增量變化,如果改變test.txt中舊有內容,則舊資料不發生變化,覆蓋同一行舊資料,貌似會產生一個空行;

整個同步過程是:

test.txt ->   FileStreamSourceConnector -> connect-test(topic) -> FileStreamSinkConnector -> test.sink.txt

由於是通過topic存放過往資料,因此在topic中也可以看到相應的資料:

> bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic connect-test --from-beginning
{"schema":{"type":"string","optional":false},"payload":"Hello World"}
{"schema":{"type":"string","optional":false},"payload":""}
{"schema":{"type":"string","optional":false},"payload":"Hello World1"}
{"schema":{"type":"string","optional":false},"payload":"Hello World2"}

使用kafka stream處理資料

參考官方文件:http://kafka.apache.org/10/documentation/streams/quickstart

kafka生態

kafka周邊包含很多元件,參看wiki:https://cwiki.apache.org/confluence/display/KAFKA/Ecosystem


相關文章