我是Docker的新手。我正在尝试使用Docker运行Spark Streaming应用程序。
我有分别在2个容器中运行的kafka和spark流应用程序。
我的kafka服务正常运行。我使用$ KAFKA_HOME / bin / kafka-console-producer.sh和$ KAFKA_HOME / bin / kafka-console-consumer.sh进行了测试。我能够接收消息。
但是当我运行我的Spark Streaming应用程序时,它显示为:
[Consumer clientId=consumer-1, groupId=consumer-spark] Connection to node -1 could not be established. Broker may not be available.
因此,我无法使用消息。
kafka:docker-compose.yml
version: '2'
services:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
kafka:
build: .
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: kafka
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_PORT: 9092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
KAFKA_LISTENERS: PLAINTEXT://:9092
depends_on:
- zookeeper
volumes:
- /var/run/docker.sock:/var/run/docker.sock
火花流代码:
val sparkConf = new SparkConf().setAppName("Twitter Ingest Data")
sparkConf.setIfMissing("spark.master", "local[2]")
val ssc = new StreamingContext(sparkConf, Seconds(2))
val kafkaTopics = "sentiment"
val kafkaBroker = "kafka:9092"
val topics : Set[String] = kafkaTopics.split(",").map(_.trim).toSet
val kafkaParams = Map[String,Object](
"bootstrap.servers" -> kafkaBroker,
"group.id" -> "consumer-spark",
"key.deserializer" -> classOf[StringDeserializer],
"value.deserializer" -> classOf[StringDeserializer]
)
logger.info("Connecting to broker...")
logger.info(s"kafkaParams: $kafkaParams")
val tweetStream = KafkaUtils.createDirectStream[String, String](
ssc,
PreferConsistent,
Subscribe[String, String](topics, kafkaParams))
我不确定是否遗漏了任何东西。
任何帮助将不胜感激!
答案 0 :(得分:0)
如果您是Docker的新手,我不建议您首先尝试使用Kafka或Spark。此外,似乎您只是复制了wurstmeister示例而未阅读有关配置它的README ...(我可以告诉您,因为您不需要build: .
属性,因为该容器已经存在于DockerHub上)
基本上,Kafka仅可通过此配置在您的Docker网络内 使用
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
您需要对其进行编辑,以使端口转发能够从Docker Compose的默认网络外部正常运行,或者您还必须在容器中运行Spark代码。
如果Spark代码不在容器中,则将其指向kafka:9092
根本不起作用
很多previous questions都存在类似的问题(问题不仅与Spark有关)