【发布时间】:2016-07-26 07:17:05
【问题描述】:
在 kafka 中创建主题的最佳方式是什么?
- 创建主题时要定义多少个副本/分区?
在新的 producer API 中,当我尝试将消息发布到不存在的主题时,它第一次失败,然后成功发布。
- 我想知道,副本、分区和集群节点数之间的关系。
- 我们需要在发布消息之前创建主题吗?
【问题讨论】:
标签: apache-kafka kafka-consumer-api kafka-producer-api
在 kafka 中创建主题的最佳方式是什么?
在新的 producer API 中,当我尝试将消息发布到不存在的主题时,它第一次失败,然后成功发布。
【问题讨论】:
标签: apache-kafka kafka-consumer-api kafka-producer-api
您可以通过编程方式创建主题。
public class CreateTopic {
public static void main(String[] args) throws ExecutionException, InterruptedException {
Properties config = new Properties();
config.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
AdminClient admin = AdminClient.create(config);
//creating new topic
System.out.println("-- creating --");
NewTopic newTopic = new NewTopic("my-new-topic", 1, (short) 1);
admin.createTopics(Collections.singleton(newTopic));
//listing
System.out.println("-- listing --");
admin.listTopics().names().get().forEach(System.out::println);
}
}
【讨论】:
当您启动 Kafka 代理时,您可以在 conf/server.properties 文件中定义一组属性。该文件只是键值属性文件。其中一个属性是auto.create.topics.enable,如果设置为 true(默认情况下),当您向不存在的主题发送消息时,Kafka 会自动创建主题。
您可以找到的所有配置选项都定义为here。恕我直言,创建主题的简单规则如下:副本数不能超过您拥有的节点数。主题和分区的数量不受集群中节点数量的影响
例如:
【讨论】:
我想分享我最近在我的博客The Side Effect of Fetching Kafka Topic Metadata 上描述的经历,并对这里提出的某些问题给出我的答案。
1) 在 kafka 中创建主题的最佳方式是什么?我们需要在发布消息之前创建主题吗?
我认为如果我们提前知道我们将使用一个固定名称的 Kafka 主题,我们最好在写入或读取消息之前创建该主题。这通常可以通过使用 bin/kafka-topics.sh 在启动后脚本中完成,例如参见official documentation。或者我们可以使用 Kafka 0.11.0.0 中引入的KafkaAdminClient。
另一方面,我确实看到某些情况下我们需要即时生成主题名称。在这些情况下,我们将无法知道固定的主题名称,我们可以依赖“auto.create.topics.enable”属性。启用后,将自动创建一个主题。这就引出了第二个问题:
2) 当 auto.create.topics.enable 为 true 时,哪些操作会导致创建
实际上正如@Lan 已经指出的那样
如果设置为 true,当应用程序尝试生产、消费、 或获取不存在主题的元数据,Kafka 将自动 使用默认复制因子和数量创建主题 分区。
我想说得更简单:
如果为 Kafka 代理启用了自动主题创建,则每当 Kafka 代理看到特定主题名称时,如果该主题尚不存在,则会创建该主题
此外,获取元数据会自动创建主题这一事实经常被包括我在内的人们所忽视。一个具体的例子是使用 consumer.partitionFor(topic) API,如果给定的主题不存在,此方法将创建它。
任何对我上面提到的更多细节感兴趣的人,你也可以看看我自己关于同一主题的博客文章The Side Effect of Fetching Kafka Topic Metadata。
【讨论】:
Kafka 的基本并行级别是分区。在生产者和代理端,对不同分区的写入可以完全并行完成。
注意事项
根据经验,将每个代理的分区数限制为100 x b x r 可能是个好主意,
其中b 是代理数量,r 是复制因子。
例如: 如果您的集群中有 9 个代理/节点,您的主题可能有
编辑:更多详情请参阅文章How to choose the number of topics/partitions in a Kafka cluster?(已从那里获取答案)
【讨论】:
设置属性
auto.create.topics.enable=true
在您的 server.properties 文件中,如果您有多个代理,请对所有 server*.properties 文件执行相同操作并重新启动您的 kafka-server。
但是一定要在服务器*.propertiesnum.partitions=int中设置合适的分区数,否则以后再增加分区会出现性能问题。
【讨论】:
分区号决定了主题的并行度,因为一个分区只能被一个消费者组中的一个消费者消费。比如一个topic只有10个partition,一个consumer group有20个consumer,那么有10个consumer是空闲的,没有收到任何消息。这个数字真的取决于你的应用程序,但 1-1000 都是合理的。
副本数由您的耐用性要求决定。对于复制因子为 N 的主题,Kafka 最多可以容忍 N-1 个服务器故障,而不会丢失任何提交到日志的消息。 3个副本是常见的配置。当然,副本号必须小于或等于您的代理号。
auto.create.topics.enable 属性控制 Kafka 何时在服务器上启用自动创建主题。如果设置为 true,当应用程序尝试为不存在的主题生成、使用或获取元数据时,Kafka 将自动创建具有默认复制因子和分区数的主题。我建议在生产中将其关闭并提前创建主题。
【讨论】: