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的注释删除,如下图所示

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