Kafka Spark Streaming:代理可能不可用[Docker]

时间:2019-02-17 02:49:53

标签: docker apache-kafka spark-streaming

我是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))

我不确定是否遗漏了任何东西。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

如果您是Docker的新手,我不建议您首先尝试使用Kafka或Spark。此外,似乎您只是复制了wurstmeister示例而未阅读有关配置它的README ...(我可以告诉您,因为您不需要build: .属性,因为该容器已经存在于DockerHub上)

基本上,Kafka仅可通过此配置在您的Docker网络内 使用

KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092

您需要对其进行编辑,以使端口转发能够从Docker Compose的默认网络外部正常运行,或者您还必须在容器中运行Spark代码。

如果Spark代码不在容器中,则将其指向kafka:9092根本不起作用

参考Kafka listeners explained

很多previous questions都存在类似的问题(问题不仅与Spark有关)