kafka的操作1(命令行方式)及操作2(kafka的工作流程写/读)
命令行方式
与主题有关的命令
- 需要连接上zookeeper集群操作(主题的名字以及分区数据、副本数等属于元数据,元数据是在zookeeper中存储)
- 查看kafka服务器中有哪些主题
kafka-topics.sh --zookeeper node1:2181 --list
- 创建一个主题
kafka-topics.sh --zookeeper node1:2181 --create --partitions 分区数 --replication-factor 备份数 --topic 主题的名字
- 查看某个主题的详情
一个主题可以有多个分区,一个分区可以设置多个备份,如果分区有多个副本,那么消费者消费哪个副本?kafka中的主题的分区的多个副本有一个leader和follower区分 leader角色的分区副本会对外让消费者消费,让生产者去写数据,follower的分区副本相当于是一个热备
kafka-topics.sh --zookeeper node1:2181 --describe --topic 主题的名字
- 删除某个主题
kafka-topics.sh --zookeeper node1:2181 --delete --topic 主题的名字
与生产者生产消息有关的命令
- 生产者生产消息的命令
kafka自带的一个简易的生产者,接受控制台的输入数据生产到对应的主题中
kafka-console-producer.sh --broker-list node:9092,node:9092,node3:9092 --topic 主题的名字
与消费者消费消息有关的命令
- 旧的消费者命令行代码
需要连接zookeeper集群消费数据----分区无法指定
kafka-console-consumer.sh --zookeeper node1:2181 --topic 主题名
- 新的消费者命令行代码
需要连接kafka集群消费数据---可以手动指定消费者消费主题的哪个分区
kafka-console-consumer.sh --bootstrap-server node1:9092 --topic 主题名 --partition 分区
kafka-console-consumer.sh --bootstrap-server node1:9092 --topic 主题名 --from-beginning
kafka的工作流程
生产者的写入数据的流程
- 写流程
- 生产者先从zookeeper的"/brokers/.../state"节点找到partition的leader
[zk: localhost:2181(CONNECTED) 4] get /brokers/topics/bbb/partitions/0/state
{"controller_epoch":13,"leader":1,"version":1,"leader_epoch":0,"isr":[1,0]}
[zk: localhost:2181(CONNECTED) 5] get /brokers/topics/bbb/partitions/1/state
{"controller_epoch":13,"leader":2,"version":1,"leader_epoch":0,"isr":[2,1]}
[zk: localhost:2181(CONNECTED) 6] get /brokers/topics/bbb/partitions/2/state
{"controller_epoch":13,"leader":0,"version":1,"leader_epoch":0,"isr":[0,2]}
- producer将消息发送给该leader
- leader将消息写入本地log
- followers从leader拉取消息,写入本地log后向leader发送ACK
- leader收到所有ISR中的replication的ACK后,增加HW(high watermark,最后commit 的offset)并向producer发送ACK
- 消费者消费数据的流程
- 消费者都是以消费者组的形式存在的,
- 消费者组可能只有一个消费者,也可以有多个消费者,
- 一个消费者组能消费一个Topic的数据,也能消费多个Topic的数据
- 一个topic中的一个分区数据在一个消费者组中只能被一个消费者消费,但是可以被多个消费者组消费
- 在一般情况下,定义消费者组的时候,消费者组当中的消费者个数要和topic的分区数量保持一致。
- 消费者数量可以小于分区数量,但是不建议大于分区数
- 当消费者数量大于分区数时,消费者剩余
# 修改consumer.properties中的group.id属性
[root@node2 config]# pwd
/opt/app/kafka-0.11.0.0/config
[root@node2 config]# vi consumer.properties
{
group.id=uek01
}
[root@node3 config]# pwd
/opt/app/kafka-0.11.0.0/config
[root@node3 config]# vi consumer.properties
{
group.id=uek01
}
[root@node1 ~]# kafka-console-producer.sh --broker-list node1:9092,node2:9092,node3:9092 --topic t1
[root@node2 ~]# kafka-console-consumer.sh --zookeeper node1:2181,node2:2181,node3:2181 --topic t1 -consumer.config /opt/app/kafka-0.11.0.0/config/consumer.properties
[root@node3 ~]# kafka-console-consumer.sh --zookeeper node1:2181,node2:2181,node3:2181 --topic t1 -consumer.config /opt/app/kafka-0.11.0.0/config/consumer.properties
输入:1 2 3 4 5 6 7 8
node2消费情况:2 4 6 8
node3消费情况:1 3 5 7 9
本文来自博客园,作者:jsqup,转载请注明原文链接:https://www.cnblogs.com/jsqup/p/16661155.html