Я новичок в докере. Я пытаюсь запустить потоковое приложение искры с помощью докера.
У меня есть потоковое приложение kafka и spark, работающее отдельно в 2 контейнерах.
Моя служба kafka работает нормально. Я тестировал с помощью $KAFKA_HOME/bin/kafka-console-producer.sh и $KAFKA_HOME/bin/kafka-console-consumer.sh. Я могу получать сообщения.
Но когда я запускаю приложение потоковой передачи искры, оно показывает:
[Consumer clientId=consumer-1, groupId=consumer-spark] Connection to node -1 could not be established. Broker may not be available.
Итак, я не могу потреблять сообщения.
кафка: 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))
Я не уверен, что я что-то упускаю.
Любая помощь будет высоко ценится!!


Если вы новичок в Docker, я бы не рекомендовал использовать Kafka или Spark в качестве первых вещей, с которыми вы будете его пробовать. Кроме того, кажется, что вы только что скопировали пример wurstmeister, не прочитав README о его настройке... (что я могу сказать, потому что вам не нужно свойство build: ., потому что этот контейнер уже существует на DockerHub)
По сути, Kafka доступна только в пределах вашей сети Docker через эту конфигурацию.
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
Вам нужно будет отредактировать это, чтобы переадресация портов работала правильно из-за пределов сети Docker Compose по умолчанию, или вы также должны запустить свой код Spark в контейнере.
Если код Spark не находится в контейнере, то указать его на kafka:9092 вообще не получится.
Ссылка Слушатели Кафки объяснили
И много предыдущие вопросы с похожими проблемами (проблема не только в Spark)
Затем ваш контейнер Spark должен быть запущен из того же файла Docker-Compose, что и Kafka, или вы должны добавить параметр --net в команду docker run, используя ту же сеть, что и контейнер Kafka.
Как я уже упоминал в начале своего поста, я запускаю приложение для потоковой передачи искры в другом контейнере. Мое приложение по-прежнему не может установить соединение с брокером. Дайте мне знать, если я что-то пропустил в конфигурации.