当我向kafka写一个主题时,出现错误:Offset commit failed
:
2016-10-29 14:52:56.387 INFO [nioEventLoopGroup-3-1][org.apache.kafka.common.utils.AppInfoParser$AppInfo:82] - Kafka version : 0.9.0.1
2016-10-29 14:52:56.387 INFO [nioEventLoopGroup-3-1][org.apache.kafka.common.utils.AppInfoParser$AppInfo:83] - Kafka commitId : 23c69d62a0cabf06
2016-10-29 14:52:56.409 ERROR [nioEventLoopGroup-3-1][org.apache.kafka.clients.consumer.internals.ConsumerCoordinator$DefaultOffsetCommitCallback:489] - Offset commit failed.
org.apache.kafka.common.errors.GroupCoordinatorNotAvailableException: The group coordinator is not available.
2016-10-29 14:52:56.519 WARN [kafka-producer-network-thread | producer-1][org.apache.kafka.clients.NetworkClient$DefaultMetadataUpdater:582] - Error while fetching metadata with correlation id 0 : {0085000=LEADER_NOT_AVAILABLE}
2016-10-29 14:52:56.612 WARN [pool-6-thread-1][org.apache.kafka.clients.NetworkClient$DefaultMetadataUpdater:582] - Error while fetching metadata with correlation id 1 : {0085000=LEADER_NOT_AVAILABLE}
使用命令创建新主题时,没关系。
./kafka-topics.sh --zookeeper localhost:2181 --create --topic test1 --partitions 1 --replication-factor 1 --config max.message.bytes=64000 --config flush.messages=1
这是使用Java的生产者代码:
public void create() {
Properties props = new Properties();
props.clear();
String producerServer = PropertyReadHelper.properties.getProperty("kafka.producer.bootstrap.servers");
String zookeeperConnect = PropertyReadHelper.properties.getProperty("kafka.producer.zookeeper.connect");
String metaBrokerList = PropertyReadHelper.properties.getProperty("kafka.metadata.broker.list");
props.put("bootstrap.servers", producerServer);
props.put("zookeeper.connect", zookeeperConnect);//声明ZooKeeper
props.put("metadata.broker.list", metaBrokerList);//声明kafka broker
props.put("acks", "all");
props.put("retries", 0);
props.put("batch.size", 1000);
props.put("linger.ms", 10000);
props.put("buffer.memory", 10000);
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
producer = new KafkaProducer<String, String>(props);
}
哪里错了?
答案 0 :(得分:2)
我遇到了同样的问题。我遇到的问题是,当你启动你的kafka经纪人时,有一个与之相关的财产,“KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR”。如果使用单节点群集,请确保将此属性设置为值“1”。由于其默认值为3.此更改解决了我的问题。 (你可以检查kafka.properties文件中的值) 注意:我使用的是融合kafka版本4.0.0的基本映像(confluentinc / cp-kafka:4.0.0)
答案 1 :(得分:1)
查看您的日志问题是群集可能与节点没有连接,而节点是zookeeper中唯一知道给定主题的副本。
您可以使用给定的命令检查它:
kafka-topics.sh --describe --zookeeper localhost:2181 --topic test1
或使用kafkacat:
kafkacat -L -b localhost:9092
示例结果:
Metadata for all topics (from broker 1003: localhost:9092/1003):
1 brokers:
broker 1003 at localhost:9092
1 topics:
topic "topic1" with 1 partitions:
partition 0, leader -1, replicas: 1001, isrs: , Broker: Leader not available
如果您有单节点群集,则代理ID( 1001 )应与topic1分区的leader相匹配。
但正如您所看到的,只有一个已知的 topic1 副本是 1001 - 现在无法使用,因此无法在不同节点上重新创建主题。
问题的根源可能是自动生成经纪商ID (如果您没有指定broker.id
或设置为-1
)。
然后在启动代理(同一个代理)时,您可能会收到与先前不同的代理ID,并且与在zookeeper中标记的不同(这是分区删除可以帮助的原因 - 但它不是生产解决方案)。
解决方案可能是将node config中的broker.id值设置为固定值 - 根据文档,它应该在生产环境中完成:
broker.id=1
如果一切顺利,你应该收到这样的话:
Metadata for all topics (from broker 1: localhost:9092/1001):
1 brokers:
broker 1 at localhost:9092
1 topics:
topic "topic1" with 1 partitions:
partition 0, leader 1, replicas: 1, isrs: 1
答案 2 :(得分:1)
嗨,您必须保持代码的kafka副本和复制因子相同。
对我来说,我保留3个副本和3个复制因子。
答案 3 :(得分:0)
对我来说,解决方案是必须确保KAFKA_ADVERTISED_HOST_NAME
是服务器的正确IP地址。
答案 4 :(得分:-1)
我们在生产中也面临同样的问题。代码工作正常很长时间突然我们得到了这个例外。
我们分析了代码中没有问题。所以我们要求部署团队重新启动zookeeper。重新启动它解决了这个问题。
答案 5 :(得分:-4)
我不知道为什么会删除所有可以确定的主题。
configparser
重启kafka。