【发布时间】:2016-09-14 08:57:13
【问题描述】:
我在 docker 容器中运行 Kafka。我使用以下命令启动我的容器
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
我写了一个简单的程序,我可以在容器中复制并执行它,它运行良好。
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
}
}
但是,如果我从容器外部(从我的 mac)运行相同的程序。 [我将“localhost”替换为docker-machine ip的输出]
我收到此错误
[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)
我的理解是,对于远程的 kafka 生产者,我需要打开的唯一端口是 2181(zookeeper)和 9092(kafka),你可以看到我已经打开了这些。
但同样的程序在容器外执行时仍然超时,但在容器内(使用本地主机)时可以工作。
编辑::根据下面的建议,我尝试了以下
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
和
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
但是这些并没有解决问题。我遇到了完全相同的问题
【问题讨论】:
-
嗨,我也面临同样的问题。你解决了吗?
-
我放弃了 :) 有时间会再试一次。检查下面的解决方案。让我知道它是否有效:)
-
我正在使用 wurstmeister kafka docker。一切都在 docker 中运行,但我在主机上的生产者/消费者代码无法连接到 kafka 代理。我正在解决这个问题,如果出现问题我会告诉你
-
即使我也面临同样的问题。如果您找到任何解决方案,请更新。或者是否有任何适合您的替代方法。
标签: docker apache-kafka kafka-producer-api