Kafka實戰及常見問題解決方法

上一篇技術博客講解了kafka基本原理以及kafka分佈式集羣搭建方法,需要這些知識的小夥伴可以查看小廚的《Kafka原理介紹及其分佈式安裝使用》。本篇博客主要內容是一些kafka的常規操作,包括kafka-topic操作、kafka-producer操作、kafka-consumer操作。良心出品。。。。。

Kafka-Topic操作

  • 添加:新增一個Kafka topic:“mobilePhone”,爲它設置一個分區並且設置一個副本,並且創建在本地的zookeeper上,可以爲master:2181,slave1:2181,slave3:2181/kafka 也可以直接爲localhost:2181/kafka
cd /usr/kafka/bin
./kafka-topics.sh --create --zookeeper master:2181,slave1:2181,slave3:2181/kafka --replication-factor 1 --partitions 1 --topic mobilePhone

如果創建時,報以下錯誤Error while executing topic command : Replication factor: 1 larger than available brokers: 0.

解決方法:很可能是之前在server.properties配置文件夾裏面和執行命令的zookeeper目錄不一致。--zookeeper的值需要帶上根目錄,否則就會報這樣的錯誤。例如配置文件裏面寫的連接目錄是zookeeper.connect=master:2181,slave1:2181,slave3:2181/kafka,但是在執行命令時少寫了kafka目錄,寫成一下

--zookeeper master:2181,slave1:2181,slave3:2181。就會報上述的錯誤,因此,務必要保證zookeeper的目錄一致。

當Topic成功創建時,會輸出Created topic “mobilePhone”,如上圖。

注意:replication-factor不能大於broker數。

  • 查詢:查詢某一個Topic的信息,mobilePhone的信息
cd /usr/kafka/bin
./kafka-topics.sh --describe --zookeeper master:2181,slave1:2181,slave3:2181/kafka --topic mobilePhone

可以不指定具體的topic名稱,即不帶--topic參數的執行命令,即可查詢所有的topic及其信息。

  • 修改:修改某個Topic參數,例如修改mobilePhone爲5個分區, alter修改partition數(只能增加)
cd /usr/kafka/bin
./kafka-topics.sh --alter --zookeeper master:2181,slave1:2181,slave3:2181/kafka  --partitions 5 --topic mobilePhone

注意:剛剛小廚在輸入命令時報了以下的錯誤:

Error while executing topic command : Topic mobilePhone does not exist on ZK path master:2181,slave1:2181,slave3:2181
[2018-11-29 16:14:02,100] ERROR java.lang.IllegalArgumentException: Topic mobilePhone does not exist on ZK path master:2181,slave1:2181,slave3:2181
        at kafka.admin.TopicCommand$.alterTopic(TopicCommand.scala:124)
        at kafka.admin.TopicCommand$.main(TopicCommand.scala:65)
        at kafka.admin.TopicCommand.main(TopicCommand.scala)
 (kafka.admin.TopicCommand$)

造成這個錯誤的原因也是 在執行命令時,忘記輸入配置zookeeper時的根目錄hostname:port/kafak,直接寫成了主機名加端口號,從而zookeeper找不到topic的路徑。

  • 刪除:刪除某些不需要的Topic
cd /usr/kafka/bin
./kafka-topics.sh --delete --zookeeper master:2181,slave1:2181,slave3:2181/kafka  --topic mobilePhone

在執行刪除topic命令時,會提示無法刪除,這是因爲在server.properties的配置文件中,kafka默認爲無法刪除即false,因此需要去各個節點的配置文件中修改  delete.topic.enable=true。之後便可正常刪除。如下圖所示標記

但是,這樣刪除只是將剛剛的topic標記爲刪除狀態,並沒有真正意義上的刪除,當重新創建一個同名的topic時,依然會報錯,該topic已存在。因此,爲了能夠徹底的刪除topic,我們進入zookeeper的bin目錄下,輸入./zkCli.sh進入zookeeper的命令行,刪除三個目錄:1、rmr /kafka/brokers/topics/mobilePhone;  2、rmr /kafka/admin/delete_topics/mobliePhone;  3、rmr /kafka/config/topics/mobilePhone

此時,便可以完全刪除該topic,如果重新創建同名topic依然報已存在錯誤,需要重啓kafka服務即可解決。

2  Kafka-Producer操作 

在執行生產者和消費者命令之前,我們按照上面的創建方法,創建一個topic爲newPhone,並更改它的分區爲2。此處我們設置的zookeeper地址都爲localhost:2181/kafak,這與上面並無不同,只不過是在當前機器上創建。推薦此種做法,不僅簡潔,而且節約空間。

  • 創建生產者
cd /usr/kafka/config
./kafka-console-producer.sh --broker-list localhost:9092 --topic newPhone

broker-list:kafka的服務地址(用多個逗號隔開),端口號默認爲9092,如果不想使用該端口號,可以更改config下的server.properties配置文件進行修改,如下圖:

--topic newPhone:代表生產者綁定了這個topic,並且會向此主題裏面生產數據,正確執行命令之後,可得如下圖所示,並可以開始輸入數據。

3  kafka-consumer操作

  • 創建消費者
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic newPhone [--from-beginning]

--bootstrap-server:kafka的服務地址, --topic newPhone:綁定主題,開始從指定topic裏面消費(取出)數據,[--from-beginning]:從頭開始讀數據,並不是從consumer連上之後開始讀。

整個運行流程,首先我們在使用producer生產幾條數據:

此時,我們在ssh工具上(小廚用的是SecureCRT,蠻好用的嘞),clone一個Session。執行./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic newPhone,可以看到如下圖一樣,如果不加from-beginning參數選項,consumer則讀不到Topic裏面之前Producer生產的四條數據。

添加from-beginning參數選項之後,consumer便可以從頭開始消費Topic裏面的數據。如下圖所示:

提示:如果在生產者生產數據時,輸入message出現以下錯誤:

[root@master bin]# ./kafka-console-producer.sh --broker-list localhost:9092 --topic newPhone
>hisdhodsa
[2018-11-29 17:28:16,926] WARN [Producer clientId=console-producer] Error while fetching metadata with correlation id 1 : {newPhone=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)
[2018-11-29 17:28:17,080] WARN [Producer clientId=console-producer] Error while fetching metadata with correlation id 5 : {newPhone=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)
解決方法:由於9092端口沒有開,所以在server.properties配置文件裏,將listeners=PLAINTEXT://:9092的註釋刪除,如下圖所示

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章