我是Scala和Kafka的新手,我遇到了一些麻烦。
我试图将scala kafka生产者连接到安装在cloudera express服务器上的kafka服务器。 我已经在使用these instructions的虚拟机中完成了一次,并且没有任何问题。
当我运行生产者时,会创建所需的主题,但不会发送任何消息,或者我认为。
以下是一些代码:
Kafka制作人
import java.util.Properties
import org.apache.kafka.clients.producer.{KafkaProducer, ProducerRecord}
class KafkaProducerManager {
val props = new Properties()
props.put("bootstrap.servers", KafkaServer.KAFKA_ADDRESS)
props.put("acks", "all")
props.put("retries", "2")
props.put("auto.commit.interval.ms", "1000")
props.put("linger.ms", "1")
props.put("block.on.buffer.full", "true")
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer")
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer")
props.put("auto.create.topics.enable", "true")
val producer = new KafkaProducer[String, String](props)
def startCounter() {
println("Start Producer Counter")
for (i <- 1 to 100) {
producer.send(new ProducerRecord("test-counter", i.toString, "Package " + i))
println("Producer - Send: " + i)
}
println("Closing producer")
producer.close()
}
}
当我执行run方法时,我看到&#34; Producer - 发送:#&#34;作为输出,我没有错误。 所以我假设这段代码已经将消息发送给Kafka。
在我运行生产者之前,我在kafka服务器上启动了以下内容:
kafka-console-consumer --zookeeper zk:2181 --topic test-counter
但在这里,我发现没有任何事情发生。
当我检查主题时,生产者应该创建,在列表中。
kafka-topics -zookeeper zk:2181 --list
我也与消费者有类似的问题:
import java.util.{Arrays, Properties}
import org.apache.kafka.clients.consumer.KafkaConsumer
class KafkaConsumerManager {
val props = new Properties()
props.put("bootstrap.servers", KafkaServer.KAFKA_ADDRESS)
props.put("group.id", "testGroup")
props.put("enable.auto.commit", "true")
props.put("auto.commit.interval.ms", "1000")
props.put("linger.ms", "1")
props.put("session.timeout.ms", "3000")
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer")
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer")
props.put("zookeeper.connect", KafkaServer.ZOOKEEPER_ADDRESS)
val consumer = new KafkaConsumer[String, String](props)
def start() {
println("Start Consumer")
consumer.subscribe(Arrays.asList("test-counter"))
while (true) {
val records = consumer.poll(100)
val iterator = records.iterator()
while (iterator.hasNext) {
val record = iterator.next()
printf("Consumer: offset = %d, key = %s, value = %s \n", record.offset(), record.key(), record.value())
}
}
}
}
当我通过kafka-console-producer在服务器上创建消息时,我看到它们出现在服务器上的kafka-console-consumer中,但不出现在我写的消费者中。
kafka-console-producer --broker-list ks:9092 --topic test-counter
KafkaServer.ZOOKEEPER_ADDRESS与参数zk:2181与kafka-console-consumer相同,而KafkaServer.KAFKA_ADDRESS与参数ks:9092与kafka-console-producer相同。
答案 0 :(得分:0)
我尝试了代码并发现:
应在消费者中指定密钥和值 反序列化程序 属性:
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
session.timeout.ms
属性存在问题。来自here:
heartbeat.interval.ms - ...值必须设置为 session.timeout.ms ... 默认值:3000
这意味着您应该增加session.timeout.ms
价值或只是删除该行,因为默认值
属性为30000
,大于默认值
heartbeat.interval.ms
。
执行更正后,代码可以正常工作。