Я новичок в kafka и хочу использовать Kafka 2.3 для реализации приложения производителя / потребителя.

  1. Я должен был загрузить и установить Kafka 2.3 на моем сервере Ubuntu.
  2. Я нашел некоторый код в Интернете и собрал его на своем ноутбуке в IDEA, но потребитель не может получить никакой информации.
  3. Я проверил информацию о теме на моем сервере, который имеет эту тему.
  4. Я использовал kafka-console-consumer, чтобы проверить эту тему, получил значение темы успешно, но не с моим потребителем.

Так что не так с моим потребителем?

Режиссер

package com.phitrellis.tool

import java.util.Properties
import java.util.concurrent.{Future, TimeUnit}

import org.apache.kafka.clients.consumer.KafkaConsumer
import org.apache.kafka.clients.producer._

object MyKafkaProducer extends App {

  def createKafkaProducer(): Producer[String, String] = {
    val props = new Properties()
    props.put("bootstrap.servers", "*:9092")
    props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer")
    props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer")
    props.put("producer.type", "async")
    props.put("acks", "all")

    new KafkaProducer[String, String](props)
  }

  def writeToKafka(topic: String): Unit = {
    val producer = createKafkaProducer()
    val record = new ProducerRecord[String, String](topic, "key", "value22222222222")
    println("start")
    producer.send(record)
    producer.close()
    println("end")
  }

  writeToKafka("phitrellis")

}

Потребитель

package com.phitrellis.tool

import java.util
import java.util.Properties
import java.time.Duration
import scala.collection.JavaConverters._
import org.apache.kafka.clients.consumer.KafkaConsumer

object MyKafkaConsumer extends App {

  def createKafkaConsumer(): KafkaConsumer[String, String] = {
    val props = new Properties()
    props.put("bootstrap.servers", "*:9092")
    props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
    props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
    //    props.put("auto.offset.reset", "latest")
    props.put("enable.auto.commit", "true")
    props.put("auto.commit.interval.ms", "1000")
    props.put("group.id", "test")

    new KafkaConsumer[String, String](props)
  }

  def consumeFromKafka(topic: String) = {

    val consumer: KafkaConsumer[String, String] = createKafkaConsumer()
    consumer.subscribe(util.Arrays.asList(topic))
    while (true) {
      val records = consumer.poll(Duration.ofSeconds(2)).asScala.iterator
      println("true")
      for (record <- records){
        print(record.value())
      }
    }
  }

  consumeFromKafka("phitrellis")

}

-1
wsf1990 26 Авг 2019 в 18:34

2 ответа

Лучший ответ

Две строки в вашем коде Consumer имеют решающее значение:

props.put("auto.offset.reset", "latest")
props.put("group.id", "test")

Чтобы прочитать с начала темы, вы должны установить auto.offset.reset в earliest (latest, потому что вы пропускаете сообщения, созданные до того, как ваш потребитель начал).

group.id отвечает за управление группой. Если вы начинаете обрабатывать данные с некоторого group.id и затем перезапускаете свое приложение или начинаете новое с того же group.id, будут прочитаны только новые сообщения.

Для ваших тестов я бы предложил добавить auto.offset.reset -> earliest и изменить group.id

props.put("auto.offset.reset", "earliest")
props.put("group.id", "test123")

< Сильный > Дополнительно : Вы должны помнить, что KafkaProducer::send возвращает Future<RecordMetadata>, и сообщения отправляются асинхронно, и если вы закончите программу до того, как Future завершит, сообщения могут быть не отправлены.

2
Bartosz Wardziński 26 Авг 2019 в 19:45

Здесь есть две части. Производящая сторона и потребитель.

Вы ничего не говорите о продюсере, поэтому мы предполагаем, что это сработало. Тем не менее, вы проверили на серверах? Вы можете проверить файлы журнала kafka, чтобы увидеть, есть ли какие-либо данные по этой конкретной теме / разделам.

На стороне потребителя, чтобы проверить, вы должны попытаться использовать с помощью командной строки из той же темы, чтобы убедиться, что данные там. Найдите «Consumer Console» Kafka по следующей ссылке и выполните эти шаги.

http://cloudurable.com/blog/kafka-tutorial-kafka-from-command-line/index.html

Если по теме есть данные, то при запуске этой команды вы получите данные. Если это не так, то он просто «зависнет», потому что он ожидает записи данных в тему.

Кроме того, вы можете попробовать создать ту же тему с помощью этих инструментов командной строки, чтобы убедиться, что ваш кластер настроен правильно, у вас есть правильные адреса и порты, порты не заблокированы и т. Д.

0
mjuarez 26 Авг 2019 в 16:16