工作流程
常用命令:先启动zookeeper和kfka
# 创建topic
[atguigu@hadoop112 kafka_2.11-0.11.0.0]$ bin/kafka-topics.sh --create --zookeeper hadoop112:2181 --replication-factor 3 --partitions 2 --topic first
# 开启生产者
[atguigu@hadoop112 kafka_2.11-0.11.0.0]$ bin/kafka-console-producer.sh --broker-list hadoop112:9092 --topic first
# 开启消费者
[atguigu@hadoop112 kafka_2.11-0.11.0.0]$ bin/kafka-console-consumer.sh --zookeeper hadoop112:2181 --topic first
# 删除topic,需要在server.properties里面配置delete.topic.enable=true
[atguigu@hadoop112 kafka]$ bin/kafka-topics.sh --zookeeper hadoop112:2181 --delete --topic first
Kafka 中消息是以 topic 进行分类的,生产者生产消息,消费者消费消息,都是面向 topic
的。
分区命名规则为:topic 名称+分区序号。例如,first 这个 topic 有三个分区,则其对应的文件夹为 first-0,first-1,first-2
topic 是逻辑上的概念,而 partition 是物理上的概念,每个 partition 对应于一个 log 文
件,该 log 文件中存储的就是 producer 生产的数据。 Producer 生产的数据会被不断追加到该
log 文件末端,且每条数据都有自己的 offset 。消费者组中的每个消费者,都会实时记录自己
消费到了哪个 offset ,以便出错恢复时,从上次的位置继续消费
理解 :1:kafka按照topic进行分类,每个类别又进行了分区partition ,在实际存储中,以分区进行存储。每个分区又会有副本机制,即相同的分区,kafka可能会存储多分且分布在不同机器上面,防止某一个机器坏掉,数据丢失了。例如:我们将收藏和点赞分别放在topic1和topic2,然后今天的topic1作为一个分区,明天的topic1又作为一个分区,topic2同理,这样每个topic都有两个分区,然后但是我们数据只有一份。为了防止某台服务器突然坏了,里面数据都丢失了,我们就把这些分区数据备份一个,把备份的和原本的相同数据分开存在不同服务器,这就是副本了。
2:kafka每个分区都会记录该分区的偏移量了,相同分区偏移量一样,这样我们就知到这个分区那些数据是被读取过的,下次会从这个地方接着读取。同一个组的消费者,例如张三上次从topic1的一个分区读取了10条数据,那么下次同一个消费组的李四,第一次读取topic1的这个分区
也会接着从第11条数据开始读取
生产顺序和消费顺序并保证一致。
文件储存
命名:当前偏移量+1
由于生产者生产的消息会不断追加到 log 文件末尾,为防止 log 文件过大导致数据定位效率低下,Kafka 采取了分片和索引机制(分片:当log文件超过设定存储量时会产生新的log和index文件),将每个 partition 分为多个 segment。每个 segment对应两个文件——“.index”文件和“.log”文件,“.index”文件存储大量的索引信息,“.log”文件存储大量的数据,索引文件中的元数据指向对应数据文件中 message 的物理偏移地址。
下图为 index 文件和 log 文件的结构示意图。
消费说明:当该分区有多个index文件时,比较index名字大小(二分查找法),定位index索引文件,index里面索引数据大小一样3为索引,756为偏移量大小,index还能记录该条消息大小,例如,message3大小为1000,那么会快速读取756——1756的数据,即message3