kafka.admin.TopicCommand失败

时间:2017-11-16 11:36:57

标签: apache-kafka apache-zookeeper

我使用单节点Kafka V 0.10.2(16 GB RAM,8个内核)和单节点zookeeper V 3.4.9(4 GB RAM,1个内核)。我有64个消费者组和500个主题,每个主题有250个分区。我能够执行只需要Kafka代理及其运行正常的命令 恩。

  

./ kafka-consumer-groups.sh --bootstrap-server localhost:9092   --describe --group

但是当我执行admin命令之类的创建主题时,请改变主题例如

  

./ kafka-topics.sh --create --zookeeper:2181   --rerelication-factor 1 --partitions 1 --topic

正在显示以下异常:

  

执行主题命令时出错:复制因子:1更大   比可用的经纪人:0 [2017-11-16 11:22:13,592]错误   org.apache.kafka.common.errors.InvalidReplicationFactorException:   复制因子:比可用的代理大1:0   (kafka.admin.TopicCommand $)

我检查了我的经纪人。在server.log中有以下警告

[2017-11-16 11:14:26,959] WARN Client session timed out, have not heard from server in 15843ms for sessionid 0x15aa7f586e1c061 (org.apache.zookeeper.ClientCnxn)
[2017-11-16 11:14:28,795] WARN Unable to reconnect to ZooKeeper service, session 0x15aa7f586e1c061 has expired (org.apache.zookeeper.ClientCnxn)
[2017-11-16 11:21:46,055] WARN Unable to reconnect to ZooKeeper service, session 0x15aa7f586e1c067 has expired (org.apache.zookeeper.ClientCnxn) 

下面提到的是我的Kafka服务器配置:

broker.id=1
delete.topic.enable=true
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/kafka/data/logs
num.partitions=1
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=<zookeeperIP>:2181
zookeeper.connection.timeout.ms=6000

Zookeeper配置是:

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/zookeeper/data
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
autopurge.snapRetainCount=20
# Purge task interval in hours
# Set to "0" to disable auto purge feature
autopurge.purgeInterval=48

我无法确定要调整的配置。我错过了什么。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

使用zookeeper参数运行使用者时,如

  

./ kafka-topics.sh --create --zookeeper:2181 --rerelication-factor 1    - 分区1 - 主题

这意味着消费者会去询问zookeeper关于经纪人的详细信息。如果在zookeeper中可用的代理详细信息,它可以连接到代理。

在你的场景中,我认为zookeeper失去了经纪人的细节。 zookeeper通常将所有配置存储在树路径中。

检查zookeeper是否有代理路径你需要使用/bin/zkCli.sh -server localhost:2181登录zookeeper shell

成功连接后ls /你会看到这样的输出

[controller, controller_epoch, brokers, zookeeper, admin, isr_change_notification, consumers, config]

然后ls /brokers输出[ids, topics, seqid]

然后ls /brokers/ids输出将是[0] - 它是一个代理ID的数组。如果您的数组为空[],则表示您的zookeeper中不存在任何代理详细信息

在这种情况下,您需要重新启动您的经纪人和zookeeper。

已更新

这个问题通常不会发生。因为您的zookeeper服务器正在自动关闭(查杀)或丢失代理路径。

为了克服这个问题,最好再保留两个动物园管理员意味着完整的3个动物园饲养员节点。

如果是本地使用localhost:2181,localhost:2182,localhost:2183。

如果是群集使用三个实例zookeeper1:2181,zookeeper2:2181,zookeeper3:2181

您最多可以容忍两次失败。

用于创建主题并使用以下命令:

  

./ kafka-topics.sh --create --zookeeper   localhost:2181,localhost:2182,localhost:2183 --rerelication-factor 1    - 分区1 - 主题