当前位置: 首页 > 知识库问答 >
问题:

理解Kafka分区元数据

卫胜
2023-03-14

我正在NodeJs应用程序中使用kafka-node通过loadMetadataForTopics选项创建主题。我希望我的应用程序动态地了解可用分区的数量,以便它能够在这些分区上正确地分发消息。

在单个节点Kafka实例中,方法创建主题并返回元数据,如下所示:

  "step1_channelOut": {
    "0": {
      "topic": "step1_channelOut",
      "partition": 0,
      "leader": 1,
      "replicas": [
        1
      ],
      "isr": [
        1
      ]
    }
  },

但是,在三节点集群中,该方法会创建更多的条目:

{
    "0": {
        "topic": "step1_channelOut",
        "partition": 0,
        "leader": 3,
        "replicas": [
            3,
            2,
            1
        ],
        "isr": [
            3,
            2,
            1
        ]
    },
    "1": {
        "topic": "step1_channelOut",
        "partition": 1,
        "leader": 1,
        "replicas": [
            1,
            3,
            2
        ],
        "isr": [
            1,
            3,
            2
        ]
    },
    "2": {
        "topic": "step1_channelOut",
        "partition": 2,
        "leader": 2,
        "replicas": [
            2,
            1,
            3
        ],
        "isr": [
            2,
            1,
            3
        ]
    },
    "3": {
        "topic": "step1_channelOut",
        "partition": 3,
        "leader": 3,
        "replicas": [
            3,
            1,
            2
        ],
        "isr": [
            3,
            1,
            2
        ]
    }
}

在本例中,它创建了4个分区吗?在我看来是这样的--因为这只是最后一个案例场景(真的显式设置分区),我并不真正关心它做什么,只要它是可预测的。这就是说我控制的越多越好。

zookeeper中的主题信息与kafka服务器上的主题信息之间的关系是什么?有没有更好的方法通过NodeJS操作(创建/配置主题)kafka集群?

为什么是四个隔板?我可以理解三个,或者一个,但是四个?

共有1个答案

邵畅
2023-03-14

kafka-node的工作方式是根据server.properties中的全局Kafka配置创建主题。检查的值:

num.partitions=12
default.replication.factor=1

代理的数量和分区的数量之间没有自动的关系。您可以有100个代理设置,但只需要为主题设置1个分区,也可以有1,000个分区的单个代理设置。他们没有血缘关系。

没有用于创建主题的非Java API--至少现在还没有。请看我之前未回答的问题。

bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 12 --topic <topic_name_here>

我在node中使用:

const exec = require('child_process').exec;

function createTopic(topic, replFactor, numPartitions, cb) {
  var zkHost = "localhost:2181";
  var kafkaHome = "/usr/local/kafka";

  exec(
    `${kafkaHome}/bin/kafka-topics.sh --create --zookeeper ${zkHost} -- replication-factor ${replFactor} --partitions ${numPartitions} --topic ${topic}`,
    (error,stderr,stdout) => cb(topic)
  );
}
 类似资料:
  • 我开始学习Kafka用于企业解决方案。 在我阅读的过程中,我脑海中浮现出一些问题: > 当一个生产者正在生成一个消息--它会指定它想要将消息发送到的主题,是这样吗?它关心分区吗? 当订阅服务器运行时-它是否指定其组id,以便它可以是同一主题的使用者集群的一部分,或者是该组使用者感兴趣的几个主题的一部分? 每个消费者组在代理上有一个对应的分区还是每个消费者都有一个? 分区是由代理创建的,因此不是消费

  • 关于Kafka,我有以下几个问题: > 如果我创建一个主题,并且指定的分区数多于代理数,那么单个代理将处理多个分区? 如果我创建了一个主题,并且指定的复制因子大于没有代理,那么该主题会创建还是不会创建? 一个代理可以处理不同主题的多个分区。

  • 通过Kafka文档和各种其他资源,我了解到Kafka中的消息被组织成主题。此外,主题可以分解为多个分区,每个分区可以托管在不同的服务器上。这提供了冗余和可伸缩性。 我不确定这里的“破碎”这个词是什么意思。这是否意味着,如果添加到主题的消息是,例如“1 2 3 4 5 6 7”,那么在将其分解为分区后,我们将有一个分区仅包含整个主题的子部分。就像一个分区有“1 2 3”,而另一个分区有“4 5 6”

  • 我正在学习Kafka,并试图为我最近的搜索应用程序创建一个主题。被推送到Kafka主题的数据被认为是一个很高的数字。 我的kafka集群有3个代理,并且已经为其他要求创建了主题。 现在,我应该为最近的搜索主题选择多少个分区?如果我没有明确提供分区号呢?选择分区号时需要考虑哪些事项?

  • 我有一个主题T,它有4个分区TP1、TP2、TP4和TP4。 假设我有8条消息M1到M8。现在当我的制作人将这些消息发送到主题T时,在以下场景下,Kafka经纪人将如何接收它们: 场景1:只有一个kafka broker实例具有前面提到的分区的主题T。 现在假设kafka broker实例1宕机,消费者会作何反应?我假设我的使用者正在读取broker实例1。

  • Kafka主题分区偏移位置始终从0或随机值开始,如何确保使用者记录是分区中的第一条记录?有没有办法找出答案?如果有的话,请让我知道。谢谢。