我的生产者可以创建一个主题,但是数据似乎没有存储在代理中

时间:2019-08-07 09:12:05

标签: apache-kafka kafka-consumer-api kafka-producer-api

我的生产者可以创建一个主题,但似乎没有在经纪人内部存储任何数据。我可以检查是否使用#!/usr/bin/expect spawn ssh user@host report expect "Press ENTER to continue, or CTRL-C to quit." send " \r" expect "Press enter for inputing" send "\r" 脚本创建了该主题。

当我尝试使用kafka-topics消费时,它什么也没消费。 (我知道kafka-console-consumer。)

当我使用--from-beginning制作商品时,我的消费者(kafka-console-producer)可以立即消费它。所以我的Java代码有问题。

当我使用kafka-console-consumer运行代码时,它运行良好。当我使用使用者代码使用该主题时,它可以正常工作。我的生产者可以在本地计算机上使用Kafka服务器,但不能与远程计算机上的另一台Kafka服务器一起使用。

代码:

localhost:9092

我的CLI(腻子):

enter image description here

我想看到我的消费者在运行Java代码时正在消费。(图像中显示的数据来自生产者脚本。)


更新

阅读答案和评论后,这是我到目前为止尝试过的。仍然不使用任何消息。我认为此代码中生成的消息未存储在代理中。我也尝试过使用其他服务器。同样的问题。主题已创建,但使用者组列表中不存在任何使用者,因此无法使用。消费者脚本不能消耗任何数据。

我还尝试了权限更改。 (小丑)并尝试使用etc / hosts文件。但没有运气。在解决此问题之前,我将继续尝试。

//this code is inside the main method
Properties properties = new Properties();
        //properties.put("bootstrap.servers", "localhost:9092");  
        //When I used localhost, my consumer code consumes it fine. 
        properties.put("bootstrap.servers", "192.168.0.30:9092");        
        properties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        properties.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

        KafkaProducer<String, String> kafkaProducer = new KafkaProducer<String, String>(properties);

        ProducerRecord<String, String> record = new ProducerRecord<>("test5", "1111","jin1111");
        //topc is created, but consumer can't consume any data. 
        //I tried putting different values for key and value parameters but no avail.

        try {
            kafkaProducer.send(record);
            System.out.println("complete");

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            kafkaProducer.close();
            System.out.println("closed");
        }

        /*//try{
        for(int i = 0; i < 10000; i++){
            System.out.println(i);
            kafkaProducer.send(new ProducerRecord("test", Integer.toString(i), "message - " + i ));
        }*/

当我在Eclipse中运行此命令时,控制台显示:

enter image description here

enter image description here

3 个答案:

答案 0 :(得分:2)

要完成ppatierno答案,应在调用KafkaProducer.close()之前调用KafkaProducer.flush()。这是一个阻塞的调用,在所有记录发送之前不会返回。

Yannick

答案 1 :(得分:1)

我的猜测是,在Kafka客户端发送消息之前,您的主要方法已经退出,应用程序结束了。 send方法不同步。客户端缓冲消息并在达到名为linger time的超时(请参阅linger.ms)后将其发送,或者将缓冲区填充到特定大小(例如,请参见batch.size参数)。缺省情况下,延迟时间为0。 因此,您的主要方法所做的是将消息提供给send方法,但随后退出,并且Kafka客户端中的基础线程无法发送消息。

答案 2 :(得分:0)

我终于明白了。如果您遇到类似的问题,则可以做一些事情。

在您的server.properties中,取消注释,然后放置ip和port。 (端口似乎有问题,所以我更改了它。)

listeners=PLAINTEXT://192.168.0.30:9093
advertised.listeners=PLAINTEXT://192.168.0.30:9093

(在使用更改后的server.properties重新启动代理之前,您可能希望清除所有现有的log.dir。如果无用,请尝试执行此操作)

您可能需要考虑的其他事项:

  • 更改您的log.dir。通常,默认路径为tmp,但有时会有noexec设置,因此请配置到其他位置
  • 检查您的etc/hosts
  • 检查您的许可:并使用chownchmod
  • 如有必要,请更改Zookeeper端口和kafka端口。
  • 更改broker.id

我工作的生产者代码:

public class Producer1 {

    public static void main(String[] args){
        Properties properties = new Properties();            
        properties.put("bootstrap.servers", "192.168.0.30:9093");        
        properties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        properties.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

        KafkaProducer<String, String> kafkaProducer = new KafkaProducer<String, String>(properties);

        ProducerRecord<String, String> record = new ProducerRecord<>("test", "1","jin");

        try {           
            kafkaProducer.send(record);
            System.out.println("complete");                     
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            kafkaProducer.close();
            System.out.println("closed");
        }              
    }   
}


有效的消费者代码:

public class Consumer1 {

    public static void main(String[] args) {

        Properties props = new Properties();
        props.put("bootstrap.servers", "192.168.0.30:9093");
        props.put("group.id", "jin");
        props.put("auto.offset.reset", "earliest");
        props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

        KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(props);

        consumer.subscribe(Collections.singletonList("test"));

        try {
            while (true) {              

                ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(1000));

                for (ConsumerRecord<String, String> record : records){
                    System.out.printf("offset = %d, key = %s, value = %s", record.offset(), record.key(), record.value());          
                }                           
            }
        } catch (Exception e){
            e.printStackTrace();
        } finally {
            consumer.close();
            System.out.println("closed");
        }   
    }
}

控制台: enter image description here