创建Kafka主题时出错: - 复制因子大于可用的代理

时间:2015-01-23 08:48:59

标签: java scala apache-kafka kafka-consumer-api

我正在尝试使用以下代码Source

通过AdminCommand创建一个kafka主题
 ZkClient zkClient = new ZkClient(kafkaHost, 10000, 10000, ZKStringSerializer$.MODULE$);
    AdminUtils.createTopic(zkClient, "pa_reliancepoc_telecom_usageevent", 10, 2, new Properties());

但是得到以下异常

Exception in thread "main" kafka.admin.AdminOperationException: replication factor: 1 larger than available brokers: 0
at kafka.admin.AdminUtils$.assignReplicasToBrokers(AdminUtils.scala:70)
at kafka.admin.AdminUtils$.createTopic(AdminUtils.scala:155)

但是,我可以使用shell命令创建主题。

3 个答案:

答案 0 :(得分:13)

在您的代码中,

 AdminUtils.createTopic(zkClient, "pa_reliancepoc_telecom_usageevent", 10, 2, new Properties());

第四个参数是复制因子。因此,您尝试使用分区pa_reliancepoc_telecom_usageeventcount of 10创建名称为replication of 2的主题。因此在创建主题时应该可以使用two kafka brokers。如果少于两个,则会出现以下异常。

Exception in thread "main" kafka.admin.AdminOperationException: replication factor: 1 larger than available brokers: 0
at kafka.admin.AdminUtils$.assignReplicasToBrokers(AdminUtils.scala:70)
at kafka.admin.AdminUtils$.createTopic(AdminUtils.scala:155)

确保您正在运行kafka cluster with two broker nodes和两个节点should be alive while creating the topic.

要在群集中运行kafka,请参阅this link

中的步骤6

答案 1 :(得分:4)

配置您的本地计算机以启动并运行多个代理,以防您决定保留replication_factor > 1

你可以通过简单地拥有多个副本来实现 server.properties个文件。例如server-1.properties& server-2.properties

然后您需要指定不同的broker.id&每个文件中port使它们成为唯一的..

   config/server-1.properties:
     broker.id=1
     port=9093
     log.dir=/tmp/kafka-logs-1

   config/server-2.properties:
     broker.id=2
     port=9094
     log.dir=/tmp/kafka-logs-2

然后使用以下命令启动多个实例

> bin/kafka-server-start.sh config/server-1.properties &
> bin/kafka-server-start.sh config/server-2.properties &

有关详细信息,请查看Step 6: Setting up a multi-broker cluster

答案 2 :(得分:0)

我在设置多个经纪人时面临同样的问题。

我缺少的一步是:

编辑配置文件时:     配置/ server-1.properties:         broker.id = 1         听众= PLAINTEXT://:9093         log.dir = / TMP /卡夫卡-日志-1

还需要更新LOG BASICS部分(见下文):

#######################日志基础知识

以逗号分隔的目录列表,用于存储日志文件

log.dirs=/tmp/kafka-logs-1