Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka 为kafka节点中的主题创建分区_Apache Kafka_Node Kafka - Fatal编程技术网

Apache kafka 为kafka节点中的主题创建分区

Apache kafka 为kafka节点中的主题创建分区,apache-kafka,node-kafka,Apache Kafka,Node Kafka,我创建了一个HighLevelProducer,将消息发布到主题流,主题流将由使用kafka节点的ConsumerGroupStream使用。当我从同一个ConsumerGroup创建多个consumer以使用同一主题时,只创建一个分区,并且只使用一个consumer。我还尝试为该主题定义分区的数量,尽管我不确定是否需要在创建主题时定义分区,如果需要,我需要预先定义多少个分区。此外,是否可以将对象推送到转换流而不是字符串(我目前使用的是JSON.stringify,因为否则我会在使用者中得到[o

我创建了一个HighLevelProducer,将消息发布到主题流,主题流将由使用kafka节点的ConsumerGroupStream使用。当我从同一个ConsumerGroup创建多个consumer以使用同一主题时,只创建一个分区,并且只使用一个consumer。我还尝试为该主题定义分区的数量,尽管我不确定是否需要在创建主题时定义分区,如果需要,我需要预先定义多少个分区。此外,是否可以将对象推送到转换流而不是字符串(我目前使用的是JSON.stringify,因为否则我会在使用者中得到[object object]

const myProducerStream = ({ kafkaHost, highWaterMark, topic }) => {
    const kafkaClient = new KafkaClient({ kafkaHost });
    const producer = new HighLevelProducer(kafkaClient);
    const options = {
        highWaterMark,
        kafkaClient,
        producer
    }; 

    kafkaClient.refreshMetadata([topic], err => {
        if (err) throw err; 
    }); 

    return new ProducerStream(options);
};

const transfrom = topic => new Transform({
    objectMode: true,
    decodeStrings: true,
    transform(obj, encoding, cb) {
        console.log(`pushing message ${JSON.stringify(obj)} to topic "${topic}"`);

        cb(null, {
            topic,
            messages: JSON.stringify(obj)
        });
    }
});

const publisher = (topic, kafkaHost, highWaterMark) => {
    const myTransfrom = transfrom(topic);
    const producer = myProducerStream({ kafkaHost, highWaterMark, topic });

    myTransfrom.pipe(producer);

    return myTransform;
};

消费者:


const createConsumerStream = (sourceTopic, kafkaHost, groupId) => {
    const consumerOptions = {
        kafkaHost,
        groupId,
        protocol: ['roundrobin'],
        encoding: 'utf8',
        id: uuidv4(),
        fromOffset: 'latest',
        outOfRangeOffset: 'earliest',
    };

    const consumerGroupStream = new ConsumerGroupStream(consumerOptions, sourceTopic);

    consumerGroupStream.on('connect', () => {
        console.log(`Consumer id: "${consumerOptions.id}" is connected!`);
    });

    consumerGroupStream.on('error', (err) => {
        console.error(`Consumer id: "${consumerOptions.id}" encountered an error: ${err}`);
    });

    return consumerGroupStream; 
};

const publisher = (func, destTopic, consumerGroupStream, kafkaHost, highWaterMark) => { 
    const messageTransform = new AsyncMessageTransform(func, destTopic);

    const resultProducerStream = myProducerStream({ kafkaHost, highWaterMark, topic: destTopic })

    consumerGroupStream.pipe(messageTransform).pipe(resultProducerStream);
}; 

关于第一个问题: 组中的最大工作使用者数等于分区数

因此,如果您的TopicA具有1个分区,并且您的消费者组中有5个消费者,其中4个将处于空闲状态

如果您的TopicA有5个分区,并且您的消费者组中有5个消费者,那么所有这些消费者都将处于活动状态并使用来自您主题的消息

要指定分区数,您应该从CLI创建主题,而不是在首次发布消息时要求Kafka创建主题

要创建具有特定数量分区的主题,请执行以下操作:

bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 3 --partitions 3 --topic test
要更改已存在主题中的分区数,请执行以下操作:

bin/kafka-topics.sh --zookeeper zk_host:port/chroot --alter --topic test 
       --partitions 40 
请注意,您只能增加分区数,不能减少分区数

请参阅卡夫卡文档


另外,如果您想了解更多关于卡夫卡的信息,请查看免费书籍

是否可以指定节点应用程序中的分区数?在卡夫卡节点文档中,他们执行了以下方法:var-topicsToCreate=[{topic:'topic1',partitions:1,replicationFactor:2}]client.createTopics(topicsToCreate,(error,result)=>{//result是无法创建给定主题时所有错误的数组});虽然这对我不起作用。但不起作用,因为回调函数中有错误?或者是使用默认分区数创建的?还有,您使用的是哪个版本的kafka?我使用的是最新的kafka版本。当我创建生产者流时,问题会出现,它只生成一个主题分区: