1. 程式人生 > >搭建kafka叢集詳細教程

搭建kafka叢集詳細教程

kafka叢集搭建

網路上的部落格質量參差不齊,對新手很不友好,我參考了一些部落格文件後,重新寫了一遍kafka的搭建教程,包括zookeeper的搭建教程,還附上了遇到的一些常見錯誤的解決方案。 我使用了3臺虛擬機器,因為kafka需要zookeeper的支援,所以虛擬機器上需要事先搭建好zookeeper的叢集,具體步驟見 《搭建zookeeper叢集》。主要參考了這兩個教程: 教程一(三臺虛擬機器)教程二(兩臺虛擬機器)

1. 軟體環境

  1. CenOS7 虛擬機器三臺。
  2. 已經搭建好的zookeeper叢集。
  3. 軟體版本:kafka_2.11-1.0.0

2. 建立目錄並下載安裝軟體

1.建立目錄

cd /opt mkdir kafka #建立專案目錄cd kafka mkdir kafkalogs #建立kafka訊息目錄,主要存放kafka訊息

  1. 下載軟體 我用的是xshell工具將下載好的軟體傳送到虛擬機器的,放在了/opt/kafka/目錄下,並解壓:

tar -zxvf kafka_2.11-1.0.0.tgz

3. 修改配置檔案

3.1 進入到config目錄

cd /opt/kafka/kafka_2.11-1.0.0/config/

我們主要關心的檔案只有一個:server.properties,我們可以發現在這個目錄下有很多檔案,還有zookeeper的檔案。我們可以直接使用kafka自帶的zookeeper叢集來啟動,但是考慮到未來的專案需求,建議使用獨立的zookeeper叢集。

-rw-r--r--. 1 root root 906 Oct 27 08:56 connect-console-sink.properties -rw-r--r--. 1 root root 909 Oct 27 08:56 connect-console-source.properties -rw-r--r--. 1 root root 5807 Oct 27 08:56 connect-distributed.properties -rw-r--r--. 1 root root 883 Oct 27 08:56 connect-file-sink.properties -rw-r--r--. 1 root root 881 Oct 27 08:56 connect-file-source.properties -rw-r--r--. 1 root root 1111 Oct 27 08:56 connect-log4j.properties -rw-r--r--. 1 root root 2730 Oct 27 08:56 connect-standalone.properties -rw-r--r--. 1 root root 1221 Oct 27 08:56 consumer.properties -rw-r--r--. 1 root root 4727 Oct 27 08:56 log4j.properties -rw-r--r--. 1 root root 1919 Oct 27 08:56 producer.properties -rw-r--r--. 1 root root 7030 Nov 22 18:10 server.properties -rw-r--r--. 1 root root 1032 Oct 27 08:56 tools-log4j.properties -rw-r--r--. 1 root root 1023 Oct 27 08:56 zookeeper.properties

3.2 修改配置檔案server.properties

需要說明的是,我現在是在虛擬機器1上進行的操作,同樣的操作要在三臺虛擬機器上都執行,只是有些細微的配置不同,其他配置資訊完全相同。對於不同虛擬機器上有差異的部分,我會一一指出。下面修改配置檔案:

// 開啟配置檔案vim server.properties // 修改配置檔案broker.id=1 /* 這是這臺虛擬機器上的值,在另外兩臺虛擬機器上應該是2或者3,這個值是唯一的,每臺虛擬機器或者叫伺服器不能相同。 / / 設定本機IP和埠。 我這裡設定的是listeners,也可以直接設定host.name=192.168.172.10,port=19292,這個IP地址也是與本機相關的,每臺伺服器上設定為自己的IP地址。 /listeners=PLAINTEXT://192.168.172.10:19092 // 該埠預設是9092,我為了加深理解,沒有設定為預設值。 // 在og.retention.hours=168下面新增下面三項message.max.byte=5242880default.replication.factor=2replica.fetch.max.bytes=5242880 / 設定zookeeper的連線埠,新版本的kafka不再使用zookeeper而是通過brokerlist的配置讓producer直接連線broker,這個brokerlist可以配置多個,只要有一個能連線上,就可以讓producer獲取道叢集中的其他broker的資訊,繞過了zookeeper。因此這個zookeeper.connect可以設定多個值 */zookeeper.connect=192.168.172.12:12181,192.168.172.11:12181,192.168.172.10:12181

也就是說,zookeeper.connect 指的是zookeeper叢集的地址,可以是多個,多個之間用逗號分割。 配置檔案的詳細資訊見參考連結

4. 啟動kafka叢集並測試

4.1 啟動服務

首先要啟動kafka叢集,並且是三臺都要手動去啟動。

// 進入kafka的bin目錄cd /opt/kafka/kafka_2.11-1.0.0/bin/ // 啟動kafka./kafka-server-start.sh -daemon ../config/server.properties

-daemon代表著以後臺模式執行kafka叢集,這樣kafka的啟動就不會影響我們繼續在控制檯輸入命令。

4.2 檢查服務是否啟動

執行命令jps,顯示出了正在執行Kafka這個程序,程序號是4855。在執行這個命令時,你可能會出現錯誤,顯示jps command not found。文章的最後給出瞭解決方案。

jps 4161 QuorumPeerMain 4855 Kafka 6809 Jps

4.3 建立topic來驗證是否建立成功

  1. 建立topic

./kafka-topics.sh --create --zookeeper 192.168.172.10:12181 --replication-factor 2 --partitions 1 --topic my-topic

引數解釋:

--replication-factor 2 // 複製兩份--partitions 1 // 建立1個分割槽--topic // 主題為my-topic-- --zookeeper // 此處為為zookeeper監聽的地址

  1. 建立生產者producer

./kafka-console-producer.sh --broker-list 192.168.172.10:19092 --topic my-topic //`這個IP地址可以寫brokerlist中的任意一個

此時,console處於阻塞狀態,可以直接輸入資料。

  1. 建立消費者 此時要切換到另一臺虛擬機器的shell介面輸入以下命令:

./kafka-console-consumer.sh --zookeeper 192.168.172.10:12181 --topic my-topic --from-beginning

此時,一旦有資料生成,此處的console中就會顯示資料。

5. 遇到的問題

5.1 埠輸入錯誤

[[email protected] bin]# ./kafka-topics.sh --create --zookeeper 192.168.172.10 --replication-factor 2 --partitions 1 --topic my-topic OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N [2017-11-22 17:45:59,726] WARN Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect (org.apache.zookeeper.ClientCnxn) java.net.ConnectException: Connection refused at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717)

at org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:361)  
at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1141)  

這是因為在輸入建立topic命令時,埠輸入錯誤了,./kafka-topics.sh --create --zookeeper 192.168.172.10 --replication-factor 2 --partitions 1 --topic my-topic。這裡邊只輸入了IP地址192.168.172.10,沒有輸入埠號:12181。這個IP地址+埠號是在/opt/kafka/kafka_2.11-1.0.0/config/server.properties檔案中的zookeeper.connect=192.168.172.12:12181,192.168.172.11:12181,192.168.172.10:12181設定的任意一個地址即可。 參考連結: 主參考輔助參考,還有一個參考

5.2 topic名字寫錯

[[email protected] bin]# ./kafka-console-producer.sh --broker-list 192.168.172.10:19092--topic shuaige OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N Missing required argument "[topic]"

這個問題是因為我的topic名字寫錯了。我是照著這兩個教程搭建kafka叢集的:Kafka【第一篇】Kafka叢集搭建kafka叢集環境搭建。第二篇幾乎是抄的第一篇。由於這兩個文件的topic名字不一樣,我在虛擬機器1上建立的topic名字是用的教程一的my-topic,建立生產者時用的卻是教程二的shuaige,所以才報錯。可見kafka的生產者和消費者是通過topic進行連線的,而不是kafka的IP地址。 PS:教程一Kafka【第一篇】Kafka叢集搭建是目前為止看到的寫的最好的kafka叢集搭建的教程,其他部落格都有錯誤,無法復現。

5.3 啟動console消費者後介面卡住不動

建立consumer後不能消費生產者的訊息,卡住了

[[email protected] bin]# ./kafka-console-consumer.sh --zookeeper 192.168.172.10:12181 --topic my-topic --from-beginning OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N Using the ConsoleConsumer with old consumer is deprecated and will be removed in a future major release. Consider using the new consumer by passing [bootstrap-server] instead of [zookeeper]. // 卡在了上邊這句話不動 了

其中下面這段提示不用管它。跟JVM有關係,是一些openJDK預設的設定,具體我也沒懂。感興趣這裡有解釋:參考1參考2

OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N

產生錯誤的原因是我在虛擬機器1啟動生產者的時候用的命令:./kafka-console-producer.sh --broker-list 192.168.172.10:12181 --topic my-topic,注意這裡我寫的埠號是12181。當我將生產者啟動時的埠引數設為19092,消費者啟動時的埠引數設為12181時,就可以成功的進行生產者和消費者的通訊。

關於生產者和消費者的埠設定,這個教程裡有比較簡明的講解:kafka快速上手。 在zookeeper的配置檔案zoo.cfg中,zookeeper會開發一個clientPort=12181(這是我自己設定的值)埠給消費者使用,其實也可以給生產者使用,但是在0.8.0版本後,producer不再通過zookeeper連線broker,而是通過brokerlist的配置(在kafka的server.properties檔案中,我設定的值為zookeeper.connect=192.168.172.12:12181,192.168.172.11:12181,192.168.172.10:12181)直接和broker連線,只要能和一個broker連線上,就能夠獲取到叢集中其他broker的資訊,繞過了zookeeper。

5.4 linux下jps command not found

jps命令可以列出本機所有java程序的pid (jps命令講解)。我執行jps命令時出現:

-bash: jps: command not found

網上好多例子都是說因為jdk裡有jps可執行檔案,只是沒有放在環境變數裡。使用root身份vi /etc/profile,然後在下面加一行export PATH="usr/java/jdk160_05/bin:$PATH"(其中jdk160_05是你的安裝目錄,依你自己的安裝情況所決定),然後source /etc/profile即可解決。 但是對我的CentOS7虛擬機器不起作用,我覺得這是當你自己安裝jdk後jps命令無法執行時可以這樣解決,但是有人試驗過,自己安裝jdk成功後,一般jps命令就已經好使了。 所以說,一般輸入jps後報-bash: jps: command not found的都是Linux自帶的jdk,下面以我的CentOS7的解決方法為例。需要安裝java-1.X.X-openjdk-devel這個包,他提供了jps這個工具。

[[email protected] lib]# yum list | grep jdk-devel java-1.8.0-openjdk-devel.x86_64 1:1.8.0.151-1.b12.el7_4 @updates java-1.6.0-openjdk-devel.x86_64 1:1.6.0.41-1.13.13.1.el7_3 base java-1.7.0-openjdk-devel.x86_64 1:1.7.0.151-2.6.11.1.el7_4 updates java-1.8.0-openjdk-devel.i686 1:1.8.0.151-1.b12.el7_4 updates java-1.8.0-openjdk-devel-debug.i686 1:1.8.0.151-1.b12.el7_4 updatesjava-1.8.0-openjdk-devel-debug.x86_64 1:1.8.0.151-1.b12.el7_4 updates [[email protected] lib]# java -version openjdk version "1.8.0_151" OpenJDK Runtime Environment (build 1.8.0_151-b12) OpenJDK 64-Bit Server VM (build 25.151-b12, mixed mode) 在這裡可以看到我的jdk的版本是"1.8.0_151",所以我安裝了java-1.8.0-openjdk-devel-debug.x86_64 [[email protected] lib]# yum -y install java-1.8.0-openjdk-devel-debug.x86_64

安裝完畢後,問題解決,jps可以正常執行。