[Toc]
如何在kafka中创建topic
在使用kafka发送消息和消费消息之前,必须先要创建topic,在kafka中创建topic的方式有以下3种:
- 如果kafka broker中的config/server.properties配置文件中配置了auto.create.topics.enable参数为true(默认值就是true),那么当生产者向一个尚未创建的topic发送消息时,会自动创建一个num.partitions(默认值为1)个分区和default.replication.factor(默认值为1)个副本的对应topic。不过我们一般不建议将auto.create.topics.enable参数设置为true,因为这个参数会影响topic的管理与维护。
- 通过kafka提供的kafka-topics.sh脚本来创建,并且我们也建议通过这种方式(或者相关的变种方式)来创建topic。
- kafka的0.10版本之前,可以使用内置的kafka-admin包,后续提供了专门的类
AdminClient API
来进行API层面上的topic创建。
脚本创建的实质
通过 kafka-topics.sh
脚本来创建一个名为topic-test1
并且副本数为2、分区数为4的topic。(如无特殊说明,本文所述都是基于1.0.0版本。)
bin/kafka-topics.sh --create --zookeeper 192.168.0.2:2181/kafka100 --topic topic-test1 --replication-factor 2 --partitions 4
打开kafka-topics.sh脚本一探究竟,其内容只有一行,具体如下:
exec $(dirname $0)/kafka-run-class.sh kafka.admin.TopicCommand "$@"
这个脚本的主要作用就是运行 kafka.admin.TopicCommand
。在main方法中判断参数列表中是否包含有create,如果有,那么就实施创建topic的任务。
创建topic时除了需要zookeeper的地址参数外,还需要指定topic的名称、副本因子replication-factor以及分区个数partitions等必选参数 ,还可以包括disable-rack-aware、config、if-not-exists等可选参数。
partion:topic的数据内容被划分为几块存储
replication-factor: 物理存储topic的内容采用几个副本的容错策略
topic命令时的警告
创建topic的时候,如果名称中包含.
或者_
,kafka会抛出警告。原因是:
在Kafka的内部做埋点时会根据topic的名称来命名metrics的名称,并且会将句点号 .
改成下划线_
。假设遇到一个topic的名称为topic.1_2
,还有一个topic的名称为topic_1.2
,那么最后的metrics的名称都为topic_1_2
,所以就会发生名称冲突。
命名规则
topic的命名不推荐(虽然可以这样做)使用双下划线__
开头,因为以双下划线开头的topic一般看作是kafka的内部topic,比如__consumer_offsets
和__transaction_state
。
topic的名称必须满足如下规则:
- 由大小写字母、数字、
.
、-
、_
组成 - 不能为空、不能为
.
、不能为..
- 长度不能超过249