我首先尝试查看是否可以在特定经纪人中创建主题。但是看起来这是不可能的。即使我在引导程序中提到经纪人主机
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类中找不到重新分配分区功能
谢谢
答案 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