BrokerNotAvailableError:在Spark Streaming时找不到领导者Exception

时间:2015-07-23 13:13:52

标签: apache-spark apache-kafka

我在NodeMS中编写了一个Kafka Producer,在Java Maven中编写了Kafka Consumer。我的主题是“test”,它由以下命令创建:

bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test

NodeJS中的制作人:

var kafka = require('kafka-node');
var Producer = kafka.Producer;
var Client = kafka.Client;
var client = new Client('localhost:2181');
var producer = new Producer(client);

producer.on('ready', function () {
    producer.send([
        { topic: 'test', partition: 0, messages: ["This is the zero message I am sending from Kafka to Spark"], attributes: 0},
        { topic: 'test', partition: 1, messages: ["This is the first message I am sending from Kafka to Spark"], attributes: 0},
        { topic: 'test', partition: 2, messages: ["This is the second message I am sending from Kafka to Spark"], attributes: 0}
        ], function (err, result) {
        console.log(err || result);
        process.exit();
    });
});

当我从NodeJS生成器发送两条消息时,它被Java Consumer成功使用。但是当我从NodeJS生产者发送三条或更多消息时,它会给我以下错误:

{[BrokerNotAvailableError:找不到领导者]消息:'找不到领导'}

我想问一下如何将LEADER设置为主题“test”中的任何消息。或者该问题的解决方案应该是什么。

5 个答案:

答案 0 :(得分:2)

而不是partition使用partitions(复数键名)。

例如:

producer.on('ready', function () {
  producer.send([
    { topic: 'test', partitions: 0, messages: ["This is the zero message I am sending from Kafka to Spark"], attributes: 0},
    { topic: 'test', partitions: 1, messages: ["This is the first message I am sending from Kafka to Spark"], attributes: 0},
    { topic: 'test', partitions: 2, messages: ["This is the second message I am sending from Kafka to Spark"], attributes: 0}
  ], function (err, result) {
    console.log(err || result);
    process.exit();
  });
});

答案 1 :(得分:2)

在当前版本的kafka-node

中存在可能导致此问题的错误

https://github.com/SOHU-Co/kafka-node/issues/354

  带有KeyedPartitioner的HighLevelProducer在第一次发送#354时失败   将KeyedParitioner与HighLevelProducer一起使用时,第一次发送失败   BrokerNotAvailableError:找不到领导者   连续发送工作完美。

另见https://www.npmjs.com/package/kafka-node#highlevelproducer-with-keyedpartitioner-errors-on-first-send

建议

  

在发送第一条消息之前调用client.refreshMetadata()。

我就是这样做的

    // Refresh metadata required for the first message to go through
    // https://github.com/SOHU-Co/kafka-node/pull/378
    client.refreshMetadata([topic], (err) => {
        if (err) {
            console.warn('Error refreshing kafka metadata', err);
        }
    });

答案 2 :(得分:1)

该主题是使用1个分区创建的,但是在生产者端,您正在尝试将消息发送到3个分区,从逻辑上讲,Kafka不应该为其他分区找到领导者并且应该抛出此异常。

答案 3 :(得分:0)

我正面临类似的问题。当我推送消息或阅读消息时,该分区不存在。请使用以下命令手动将分区计数修改为所需的数字。

> sh kafka-topics.sh --alter --bootstrap-server localhost:9092 --partitions 2 --topic test

在此之后它将正常工作。

“ Miguel Veces”的答案正在起作用,但是这是错误的,因为随着更改,它开始忽略您正在传递的分区参数。

答案 4 :(得分:0)

最后得到了解决方案。我犯了一个错误。默认情况下,Apache Kafka创建3个复制,这意味着默认情况下它创建3个代理。但是,在YAML之上,仅创建一个代理,并寻找另外两个未创建的代理。因此我们遇到了同样的错误。

修复

<div class="container" title="My tooltip">
    <input type="button" disabled="disabled" value="My button"/>
</div>

然后version: '3' services: zookeeper: container_name: zookeeper image: confluentinc/cp-zookeeper ports: - "32181:32181" environment: ZOOKEEPER_CLIENT_PORT: 32181 ZOOKEEPER_TICK_TIME: 2000 ZOOKEEPER_SYNC_LIMIT: 2 kafka: container_name: kafka image: confluentinc/cp-kafka ports: - "9094:9094" environment: KAFKA_ZOOKEEPER_CONNECT: zookeeper:32181 KAFKA_LISTENERS: INTERNAL://:9092,OUTSIDE://:9094 KAFKA_ADVERTISED_LISTENERS: INTERNAL://:9092,OUTSIDE://localhost:9094 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,OUTSIDE:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 ES_JAVA_OPTS: "-Xms512m -Xmx3000m" 告诉Apache kafka我们只想创建一个复制及其工作。

使用下面的代码发布和使用kafka消息

KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1

快乐编码:)

感谢与问候 Jaiswar Vipin Kumar R。