Ich habe Kafka innerhalb Docker Container ausgeführt. Ich beginne meine ContainerVeröffentlichen einer Nachricht an Kafka läuft im Docker
docker run --rm -p 2181:2181 -p 9092:9092 -p 8081:8081 --env
ADVERTISED_HOST=\`docker-machine ip \\`docker-machine active\\`` --env
ADVERTISED_PORT=9092 -v
/Users/abhishek.srivastava/MyProjects/KafkaTest/target/scala-2.11:/app
-it -- name kafka spotify/kafka bash
ich ein einfaches Programm geschrieben haben, mit dem folgenden Befehl, die ich im Inneren des Behälters kopieren und ausführen und es funktioniert perfekt.
object KafkaProducerString {
def SendStringMessage(msg: String) : Unit = {
val inputRecord = new ProducerRecord[String, String]("test", null, msg)
val producer: KafkaProducer[String, String] = CreateProducerString
val rm = producer.send(inputRecord).get(10, SECONDS)
println(s"offset: ${rm.offset()} partition: ${rm.partition()} topic: ${rm.topic()}")
producer.close()
}
private def CreateProducerString: KafkaProducer[String, String] = {
val props = new Properties()
props.put("bootstrap.servers", "localhost:9092")
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer")
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer")
props.put("batch.size", "0")
props.put("client.id", "1")
val producer = new KafkaProducer[String, String](props)
producer
}
}
Aber wenn ich das gleiche Programm von außerhalb des Containers (von meinem Mac) ausführen. [I ersetzen die „localhost“ mit der Ausgabe von docker-machine ip
]
Ich erhalte diesen Fehler
[error] (run-main-0) java.util.concurrent.TimeoutException: Timeout after waiting for 10000 ms.
java.util.concurrent.TimeoutException: Timeout after waiting for 10000 ms.
at org.apache.kafka.clients.producer.internals.FutureRecordMetadata.get(FutureRecordMetadata.java:50)
at org.apache.kafka.clients.producer.internals.FutureRecordMetadata.get(FutureRecordMetadata.java:25)
at com.abhi.KafkaProducerString$.SendStringMessage(KafkaProducerString.scala:23)
at com.abhi.KafkaMain$$anonfun$main$1.apply$mcVI$sp(KafkaMain.scala:19)
at scala.collection.immutable.Range.foreach$mVc$sp(Range.scala:160)
at com.abhi.KafkaMain$.main(KafkaMain.scala:17)
at com.abhi.KafkaMain.main(KafkaMain.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
Mein Verständnis war, dass für einen kafka Produzenten entfernt zu sein, um die einzigen Anschlüsse brauche ich sind 2181 zu öffnen (zookeeper) und 9092 (kafka) und du kannst sehen, dass ich diese geöffnet habe.
Aber immer noch das gleiche Programm, wenn außerhalb des Containers ausgeführt wird, aber funktioniert, wenn innerhalb des Containers (mit localhost).
bearbeitet :: Auf der Grundlage der Vorschläge unten, habe ich versucht, das folgende
docker run --rm -p 127.0.0.1:2181:2181 -p 127.0.0.1:9092:9092 -p
127.0.0.1:8081:8081 --env ADVERTISED_HOST=`docker-machine ip \`docker-machine
active\`` --env ADVERTISED_PORT=9092 -v
/Users/abhishek.srivastava/MyProjects/KafkaTest/target/scala-2.11:/app -it --
name kafka kafka_9.0 bash
und
docker run --rm -p 0.0.0.0:2181:2181 -p 0.0.0.0:9092:9092 -p 0.0.0.0:8081:8081
--env ADVERTISED_HOST=`docker-machine ip \`docker-machine active\`` --env
ADVERTISED_PORT=9092 -v
/Users/abhishek.srivastava/MyProjects/KafkaTest/target/scala-2.11:/app -it --
name kafka kafka_9.0 bash
Aber das hat das Problem nicht lösen. Ich bekomme genau das gleiche Problem
Hallo, ich habe auch das gleiche Problem. Hast du es gelöst? – maverick
Ich habe aufgegeben :) werde es irgendwann wieder versuchen wenn ich Zeit habe. Überprüfen Sie die folgende Lösung. lass es mich wissen, wenn es funktioniert :) –
Ich benutze Wurstmeister Kafka Docker. Alles funktioniert innerhalb von docker, aber mein Code für Producer/Consumer, der sich auf dem Host-Rechner befindet, kann keine Verbindung zum Kafka-Broker herstellen. Ich bin bei der Fehlersuche, wenn etwas kommt, werde ich Sie wissen lassen – maverick