vlambda博客
学习文章列表

「大数据」(五十二)Kafka之Topic简介

【导读:数据是二十一世纪的石油,蕴含巨大价值,这是·情报通·大数据技术系列第[52]篇文章,欢迎阅读和收藏】

、 基本概念

Topic : 在 Kafka 中,使用一个类别属性来划分数据的所属类,划分数据的这个类称为 topic 。如果把 Kafka 看做为一个数据库, topic 可以理解为数据库中的一张表, topic 的名字即为表名。

Partition : topic 中的数据分割为一个或多个 partition 。每个 topic 至少有一个 partition 。每个 partition 中的数据使用多个 segment 文件存储。partition 中的数据是有序的, partition 间的数据丢失了数据的顺序。如果 topic 有多个 partition ,消费数据时就不能保证数据的顺序。在需要严格保证消息的消费顺序的场景下,需要将 partition 数目设为 1 。

partitions 的 设计 目的有多个 . 最根本原因是 kafka 基于文件存储 . 通过分区 , 可以将日志内容分散到多个 server 上 , 来避免文件尺寸达到单机磁盘的上限 , 每个 partiton 都会被当前 server(kafka 实例 ) 保存 ; 可以将一个 topic 切分多任意多个 partitions, 来消息保存 / 消费的效率 . 此外越多的 partitions 意味着可以容纳更多的 consumer, 有效提升并发消费的能力 .( 具体原理参见下文 ).


、 术语解释

Message( 消息 ) :传递的数据对象,主要由四部分构成:offset( 偏移量 ) 、 key 、 value 、 timestamp( 插入时间 ) ;其中 offset 和 timestamp 在 kafka 集群中产生, key/value 在 producer 发送数据的时候产生

Broker( 代理者 ) :Kafka 集群中的机器 / 服务被成为 broker , 是一个物理概念。

Partition( 分区 ) :具体维护 Kafka 上的消息数据的最小单位,一个 Topic 可以包含多个分区;Partition 特性:ordered & immutable 。 ( 在数据的产生和消费过程中,不需要关注数据具体存储的 Partition 在那个 Broker 上,只需要指定 Topic 即可,由 Kafka 负责将数据和对应的 Partition 关联上 ) 。

Producer( 生产者 ) :负责将数据发送到 Kafka 对应 Topic 的进程。

Consumer( 消费者 ) :负责从对应 Topic 获取数据的进程。

Consumer Group( 消费者组 ) :每个 consumer 都属于一个特定的 group 组,一个 group 组可以包含多个 consumer ,但一个组中只会有一个 consumer 消费数据。

、 Topic常用命令

3.1 list topic 显示所有 topic


1. 从 zookeeper 的 /brokers/topics 节点下获取所有 topic 封装成 topic 集合

2. 遍历该集合,查看每个 topic 是否是待删除 topic—— 即在 /admin/delete_topics 下是否存在同名节点。如果是,打印 topic 已经被标记为删除;否则直接打印 topic 名称

3.2 create topic 创建 topic

bin/kafka-topics.sh --create --zookeeper 10.200.250.194:2181,10.200.250.195:2181,10.200.250.196:2181 --replication-factor 1 --partitions 1 --topic test


1. 从命令行中获取要创建的 topic 名称

2. 解析命令行指定的 topic 配置 ( 如果存在的话 ) ,配置都是 x=a 的格式

3. 若指定了 replica-assignment 参数表明用户想要自己分配分区副本与 broker 的映射 —— 通常都不这么做,如果不提供该参数 Kafka 帮你做这件事情

4. 检查必要的参数是否已指定,包括:zookeeper , replication-factor , partition 和 topic

5. 获取 /brokers/ids 下所有 broker 并按照 broker id 进行升序排序

6. 在 broker 上分配各个分区的副本映射 ( 没有指定 replica-assignment 参数,这也是默认的情况 )

7. 检查 topic 名字合法性、自定义配置的合法性,并且要保证每个分区都必须有相同的副本数

8. 若 zookeeper 上已有对应的路径存在,直接抛出异常表示该 topic 已经存在

9. 确保某个分区的多个副本不会被分配到同一个 broker

10. 若提供了自定义的配置,更新 zookeeper 的 /config/topics/[topic] 节点的数据

11. 创建 /brokers/topics/[topic] 节点,并将分区副本分配映射数据写入该节点

3.3 delete topic 删除 topic

kafka-serkafka-topics.sh --zookeeper 10.200.250.194:2181,10.200.250.195:2181,10.200.250.196:2181  --delete --topic "clicki_info_topic"



1. 获取待删除的 topic ,如果没有指定 --topic 就是删除所有的 topic

2. 对于每个要删除的 topic ,在 zookeeper 上的 /admin/delete_topics 下创建对应的子节点。kafka 目前的删除 topic 逻辑只是在 Zookeeper 上标记而已,会有专门的线程负责监听该路径下的变更并负责更新 zookeeper 上其他节点上的数据,但底层的日志文件目前还是需要手动删除。

3.4 describe topic 显示 topic 详细信息

kafka-topics.sh --zookeeper 10.200.250.196:2181 --topic "clicki_track_topic" --describe

kafka-topics.sh --zookeeper 10.200.250.194:2181,10.200.250.195:2181,10.200.250.196:2181  --describe





1. 如果指定了 --topic 就是只显示给定 topic 的信息,否则显示所有 topic 的详细信息。

2. 如果指定了 under-replicated-partitions ,那么就显示那些副本数量不足的分区 (ISR size < AR.size)

3. 如果指定了 unavailable-partitions ,那么就显示那些 leader 副本已不可用的分区

4. 从 zookeeper 上获取当前所有可用的 broker

5. 遍历每个要 describe 的 topic ,

6. 获取这个 topic 的分区副本分配信息,若该信息不存在说明 topic 不存在

7. 否则将分配信息按照分区号进行排序

10. 如果没有指定步骤 2 中的参数也没有指定步骤 3 中的参数,那么显示分区数信息、副本系数信息以及配置信息

11. 默认情况下还会显示各个分区的信息

12. 从 zookeeper 中获取每个分区的 ISR 、 Leader 、 AR 信息并显示