kafka错误之 Topic xxx not present in metadata after 60000 ms

一、背景

今天尝试使用 kafka 的 生产者 api 写一下,消息发送,结果遇到以下问题,
Topic xxx not present in metadata after 60000 ms,找了半天结果发现是jar包引入不全导致的,为防以后忘记,在此记录一下。

二、场景还原

1、jar包引入

<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka-clients</artifactId>
    <version>2.6.0</version>
</dependency>

2、jar代码

public class KafkaProducerDemo {

    public static void main(String[] args) {
        Properties properties = new Properties();

        properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "127.0.0.1:9092,127.0.0.1:9093,127.0.0.1:9094");
        properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
        properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
        properties.put(ProducerConfig.ACKS_CONFIG, "all");
        properties.put(ProducerConfig.BUFFER_MEMORY_CONFIG, 33554432);
        properties.put(ProducerConfig.RETRIES_CONFIG, 0);
        properties.put(ProducerConfig.RETRY_BACKOFF_MS_CONFIG, 300);
        properties.put(ProducerConfig.BATCH_SIZE_CONFIG, 16384);

        // KafkaProducer 是线程安全的,可以多个线程使用用一个 KafkaProducer
        KafkaProducer<String, String> kafkaProducer = new KafkaProducer<>(properties);
        for (int i = 0; i < 100; i++) {
            ProducerRecord<String, String> record = new ProducerRecord<>("topic-a", "value - (" + i + 1 + ")");
            kafkaProducer.send(record, new Callback() {
                @Override
                public void onCompletion(RecordMetadata metadata, Exception exception) {
                    if (exception != null) {
                        System.err.println("发送数据到kafka中,发生了异常.");
                        exception.printStackTrace();
                        return;
                    }
                    System.out.println("topic: " + metadata.topic() + " offset: " + metadata.offset() + " partition: "
                            + metadata.partition());
                }
            });
        }

        System.out.println("消息发送完成");
        kafkaProducer.close();
    }
}

3、运行结果

运行结果
运行上面的代码出现了 org.apache.kafka.common.errors.TimeoutException: Topic topic-a not present in metadata after 60000 ms 异常。

三、问题解决

其实这个问题很简单,在启动项目的时候加入 logback.xml 配置文件,然后加入logback相关的jar包,发现,缺少jackson的jar,引入之后就好了。

<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka-clients</artifactId>
    <version>2.6.0</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.0</version>
</dependency>

四、参考文档

1、https://stackoverflow.com/questions/63714401/org-apache-kafka-common-errors-timeoutexception-topic-not-present-in-metadata-a

2、http://kafka.apache.org/26/documentation.html#producerapi

"Failed to update metadata after 60000 ms" 是一个错误消息,通常在使用 Apache Kafka 进行数据传输时出现。这个错误表示 Kafka 客户端在指定的时间内无法更新元数据信息。 元数据是 Kafka 集群中关于主题、分区和副本等信息的描述。当 Kafka 客户端需要连接到集群并发送或接收消息时,它需要获取最新的元数据信息。如果在指定的时间内无法更新元数据,就会出现这个错误。 这个错误可能有以下几个原因: 1. 网络问题:客户端无法与 Kafka 集群建立连接,可能是由于网络故障、防火墙配置或者集群不可用导致的。 2. 集群问题:Kafka 集群可能正在进行重分区、副本分配或者其他维护操作,导致元数据更新失败。 3. 客户端配置问题:客户端的配置可能不正确,比如指定了错误的集群地址、端口或者其他参数。 解决这个问题的方法包括: 1. 检查网络连接:确保客户端能够正常连接到 Kafka 集群,并且网络稳定。 2. 检查集群状态:确认 Kafka 集群正常运行,并且没有正在进行的维护操作。 3. 检查客户端配置:仔细检查客户端的配置文件,确保配置正确。 4. 增加超时时间:可以尝试增加更新元数据的超时时间,以便给集群足够的时间来响应。 5. 调整 Kafka 集群的配置:如果问题持续存在,可能需要调整 Kafka 集群的配置,比如增加副本数、调整分区分配策略等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值