kafka安装使用(windows下实践)
安装jdk
JAVA_HOME E:\Java\jdk1.8.0_152
PATH %JAVA_HOME%\bin,%JAVA_HOME%\jre\bin
安装zookeeper
https://archive.apache.org/dist/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
解压后,重命名conf/zoo_sample.cfg为zoo.cfg,并编辑
修改dataDir=/tmp/zookeeper 为 dataDir=E:/zookeeper/data
运行zookeeper
bin/zkServer.cmd
安装kafka
https://archive.apache.org/dist/kafka/2.3.0/kafka_2.12-2.3.0.tgz
2.8版本后不需要单独下载zookeeper了
修改config/server.properties文件中log.dirs=/tmp/kafka-logs 为 log.dirs=E:/kafka/kafka-logs
运行kafka
.\bin\windows\kafka-server-start.bat .\config\server.properties
使用kafka
-
创建topic
kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
-
创建producer
kafka-console-producer.bat --broker-list localhost:9092 --topic test
-
创建consumer
kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test
-
列出主题
kafka-topics.bat --list --zookeeper localhost:2181
-
描述主题
kafka-topics.bat --describe --zookeeper localhost:2181 --topic [Topic Name]
-
从头读取消息
kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic [Topic Name] --from-beginning
-
删除主题
kafka-run-class.bat kafka.admin.TopicCommand --delete --topic [topic_to_delete] --zookeeper localhost:2181
安装kafka-tool
安装后填写连接信息,连接后查看topic
修改数据格式
laravel使用kafka
安装composer包
composer require nmred/kafka-php
发现无法安装需要修改psr/log包版本,composer require psr/log 1.0.2
创建kafka消费者 php artisan make:command KafkaConsumer
创建kafka生产者 php artisan make:command KafkaProducer
//消费者 $config = ConsumerConfig::getInstance(); $config->setMetadataRefreshIntervalMs(10000); $config->setMetadataBrokerList('127.0.0.1:9092'); $config->setGroupId('test'); $config->setBrokerVersion('1.0.0'); $config->setTopics(['test']); $consumer = new Consumer(); $consumer->start(function($topic, $part, $message) { $this->info(json_encode($message)); }); //生产者 $config = ProducerConfig::getInstance(); $config->setMetadataRefreshIntervalMs(10000); $config->setMetadataBrokerList('127.0.0.1:9092'); $config->setBrokerVersion('1.0.0'); $config->setRequiredAck(1); $config->setIsAsyn(false); $config->setProduceInterval(500); $producer = new Producer(); for($i = 0; $i < 5; $i++) { $producer->send([ [ 'topic' => 'test', 'value' => 'test....message.' . $i, 'key' => '' . $i, ], ]); }
踩坑记录
在kafka-tool中删掉topic后发现kafka挂掉了
删掉zoo.cfg中配置的data目录下的文件,重启zookeeper和kafka即可
注意点
kafka的broker是每台kafka服务器的唯一标识
根据服务器的吞吐量来设置partition分区,分区越多,并行传输的数据越多,但是资源不充足的情况下会导致传输速度更慢,12核cpu每个topic可以设置12分区,分区越多需要的内存空间也越多
越多的分区需要打开更多的文件句柄,每个分区对应文件系统一个目录
每个partition都会有多个副本存在于其他broker中,如果其中一个broker故障时,需要重新选举leader,这时要从zookeeper读取和修改受影响的partition元数据,还要从其他broker中移走相应的partition,意味着更多的partition需要更多的时间来恢复
kafka默认是发布订阅模式,即一个消息可以被多个消费者消费
常见错误
[2022-05-31 14:38:46,406] INFO Reading configuration from: E:\kafka\config\server.properties (org.apache.zookeeper.server.quorum.QuorumPeerConfig) [2022-05-31 14:38:46,409] ERROR Invalid config, exiting abnormally (org.apache.zookeeper.server.quorum.QuorumPeerMain) org.apache.zookeeper.server.quorum.QuorumPeerConfig$ConfigException: Error processing E:\kafka\config\server.properties at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:156) at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:104) at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:81) Caused by: java.lang.NumberFormatException: For input string: "initial.rebalance.delay.ms" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Long.parseLong(Long.java:589) at java.lang.Long.parseLong(Long.java:631) at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parseProperties(QuorumPeerConfig.java:244) at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:152) ... 2 more
解决:在kafka安装目录下启动