如何在kafka中将主题从一个经纪人转移到另一个经纪人?

时间:2020-07-26 18:14:56

标签: apache-kafka confluent-platform

我首先尝试查看是否可以在特定经纪人中创建主题。但是看起来这是不可能的。即使我在引导程序中提到经纪人主机

    admin_client = AdminClient({
    "bootstrap.servers": "xxx1.com:9092,xxx2.com:9092"
})

futmap=admin_client.create_topics(topic_list)

该计划任意挑选我作为该主题的首席经纪人的5个经纪人之一。我试图了解为什么会这样发生。

我还试图查看是否可以将主题负责人重新分配给另一位经纪人。我知道可以通过kafka-reassign-partitions命令行脚本来实现,但是我想以编程方式使用python和confluent-Kafka软件包来实现。是否可以通过编程方式执行此操作。我在confluent-Kafka软件包的ADMIN类中找不到重新分配分区功能

谢谢

2 个答案:

答案 0 :(得分:1)

我终于找到了解决方案,融合的Kafka python软件包的文档不足以满足此要求。但是关于开源的一件好事是,您可以阅读代码并弄清楚。因此,要在特定代理中创建主题,我必须对创建主题代码进行编码,如下所示。请注意,我已经使用过plicate_assignment而不是replication_factor。这两个是互斥的。如果使用replication_factor,则分区将由Kafka分配,您可以通过replica_assignment控制分配。但是,我确定在重新平衡/重新分配分区的情况下,将重新分配该位置。但这也可以通过on_revoke事件来处理。但是现在,这对我有用。

def createTopic(admin_client,topics):
    #topic_name=topics
    topic_name = ['rajib1_test_xxx_topic']
    replica_assignment = [[262, 261]]
    topic_list = [NewTopic(topic, num_partitions=1, replica_assignment=replica_assignment) for topic in topic_name]
futmap=admin_client.create_topics(topic_list)
# Wait for each operation to finish.
for topic, f in futmap.items():
    try:
        f.result()  # The result itself is None
        print("Topic {} created".format(topic))
    except Exception as e:
        print("Failed to create topic {}: {}".format(topic, e))
#return futmap

答案 1 :(得分:0)

您还可以使用Kafka随附的kafka-reassign-partitions.sh工具将一个主题的副本更改为另一个代理。

例如,如果要在代理“ 1”上放置(在此示例中为单复制和单分区的)主题“ test”,则可以首先定义一个计划(名为copychangechange.json):

{
"partitions":
  [{"topic": "test", "partition": 0,
    "replicas": [
       1
    ]
  }],
"version":1
}

,然后使用:

kafka-reassign-partitions.sh --zookeeper localhost:2181 --execute \
--reassignment-json-file replicachange.json