下载地址
http://kafka.apache.org/downloads.html
参考文档
http://kafka.apache.org/documentation/
kafka依赖zookeeper,先启动zookeeper在启动kafka
1 .D:\kafka_2.12-2.6.0\config 文件夹下修改文件
zookeeper.properties 找到并编辑dataDir=D:/Tool/zookeeper-3.4.13/tmp (可以自定义文件夹)
server.properties 找到并编辑log.dirs=D:\Tool\kafka_2.11-2.1.1\kafka-log, (自定义文件夹)
找到并编辑zookeeper.connect=localhost:2181。表示本地运行(默认的可以不改)
Kafka会按照默认,在9092端口上运行,
并连接zookeeper的默认端口:2181。
启动zookeeper服务端
zookeeper-server-start.bat ..\..\config\zookeeper.properties
启动zookeeper客户端
zookeeper-shell.bat localhost:2181
启动kafka
kafka-server-start.bat ..\..\config\server.properties
创建topic test
kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 3 --topic test2
或者,您也可将代理配置为:在发布的topic不存在时,自动创建topic,而不是手动创建。
创建生产者产生消息
kafka-console-producer.bat --broker-list localhost:9092 --topic test2
创建消费者接收消息
从头消费
kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test --from-beginning
固定位置消费
kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test2 --consumer-property group.id=group1
通过添加–consumer-property group.id=group1指定消费组为group1
查看topic
./kafka-topics.bat --list --zookeeper localhost:2181
./kafka-topics.bat --describe --zookeeper localhost:2181
删除主题
//kafka-run-class.bat kafka.tools.ConsumerOffsetChecker --zkconnect localhost:2181 --group group1
查看固定分组的消费情况
kafka-consumer-groups.bat --describe --bootstrap-server localhost:9092 --group group1
看消费组的消费者情况,可以看到下图,有一个消费者是没有对应的partition的,所以它就拉取不到消息
php连接kafka 生产和消费
参考资料:
https://www.cnblogs.com/lz0925/p/11280654.html
消费者组中的消费者实例个数不能超过分区的数量。
当分区数量是3,而消费者数量是4的时候,会有一个消费者拉取不到任何消息
kafka日志中消息的存储情况。
kafka-run-class.bat kafka.tools.DumpLogSegments --files ..\..\kafka-logs\test2-0\00000000000000000000.log --print-data-log
查看消费位移offset
使用kafka的bin目录下面的kafka-consumer-groups.sh命令可以查看offset消费情况,注意,如果你的offset是存在kafka集群上的,就指定kafka服务器的地址bootstrap-server:
/kafka-consumer-groups.bat --bootstrap-server localhost:9092 --describe --group group1
按照指定的offset进行消费数据:
./kafka-console-consumer.sh --bootstrap-server master:9092 --topic mytest --consumer-property group.id=group_mytest --offset 8 --partition 0
java消费 进入zookeeper查看,发现有group_mytest这个消费组对于mytest主题各分区的消费位移信息了
ls /consumers/group_mytest/offsets/mytest/0
get /consumers/group_mytest/offsets/mytest/0
首先来说说消费者如果是根据javaapi来消费,也就是【kafka.javaapi.consumer.ConsumerConnector】,我们会配置参数【zookeeper.connect】来消费。这种情况下,消费者的offset会更新到zookeeper的【consumers/{group}/offsets/{topic}/{partition}】目录下,例如:
get /kafka/consumers/zoo-consumer-group/offsets/my-topic/0
如果是根据kafka默认的api来消费,即【org.apache.kafka.clients.consumer.KafkaConsumer】,我们会配置参数【bootstrap.servers】来消费。而其消费者的offset会更新到一个kafka自带的topic【__consumer_offsets】下面,查看当前group的消费进度,则要依靠kafka自带的工具【kafka-consumer-offset-checker】
上面结果的说明:
kafka-consumer-groups.bat --bootstrap-server localhost:9092 --describe --group group1
Group : 消费者组
Topic : topic的名字
Pid : partition的ID
Offset : kafka消费者在对应分区上已经消费的消息数【位置】
logSize : 已经写到该分区的消息数【位置】
Lag : 还有多少消息未读取(Lag = logSize - Offset)
Owner : 分区创建在哪个broker
自动提交,设置enable.auto.commit=true,更新的频率根据参数【auto.commit.interval.ms】来定。这种方式也被称为【at most once】,fetch到消息后就可以更新offset,无论是否消费成功。
手动提交,设置enable.auto.commit=false,这种方式称为【at least once】。fetch到消息后,等消费完成再调用方法【consumer.commitSync()】,手动更新offset;如果消费失败,则offset也不会更新,此条消息会被重复消费一次。
总结
通过以上的步骤,可以查看到消息的推送到broker的日志文件,查看消息推送的内容、offset和时间等信息。另外,可以我们也查看到消息端读取消息的offset位置。能够更深入的了解kakfa的工作原理。
Kafka将topic划分为多个partition进行存储拥有两个好处:
消息存储扩容。一个文件的存储大小是有限的,但在集群中的多个文件的存储就可以大大增加一个topic能够保存的消息数量。
并行读写。通过多个partition文件存储消息,意味着producer和consumer可以并行的读写一个topic。
Consumer消费消息时,通过指定的offset来定位下一条要读取的消息。值得注意的是,offset的维护是由Consumer全权控制的。Kafka集群只负责根据Consumer传入的offset来返回对应的消息。如下图所示:
Kafka不会立刻删除已经被消费的消息,它会根据broker中的配置来决定多久清理一次。当broker中配置的时间到达时,不论消息是否被消费,Kafka都会清理磁盘空间。
最后,Kafka只能够保证消息再一个分区内的消费是有序的。无法保证一个topic下(拥有多个分区)所有的消息消费都是有序的。