我在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”中的任何消息。或者该问题的解决方案应该是什么。
答案 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:找不到领导者 连续发送工作完美。
建议
在发送第一条消息之前调用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。