【问题标题】:connecting spark streaming from local machine to kafka on GCP [closed]将本地机器的火花流连接到 GCP 上的 kafka [关闭]
【发布时间】:2020-09-17 04:38:28
【问题描述】:

我目前在 GCP 上有 4 个虚拟机。 1 是托管我的 zookeeper 的地方,另外 3 个是名为 kafka-0、kafka-1、kafka-2 的 kafka-brokers。在 VMS 中生成/使用消息时一切正常,但是当我尝试从本地计算机连接到 Kafka 时它开始失败。首先,我为端口 9092(在所有实例上)打开了防火墙规则。然后我为每个实例添加了一个静态外部 IP。我正在尝试从本地 spark 流作业连接到我的 kafka 代理。

只是为了进行健全性检查,我的 zookeeper 能够连接到所有代理

i.ie 这个 bash 命令在我的 zookeeper 上运行(10.150.0.6:2181 是 zookeeper 的内部 IP)

zookeeper-shell.sh 10.150.0.6:2181 ls /brokers/ids 

给我以下输出

Connecting to 10.150.0.6:2181
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
[0, 1, 2]

我的第一个方法。我尝试使用代理的外部 IP 连接到其中一个 kafka 代理

val df = sparkSession.readStream
      .format("kafka")
      .option("kafka.bootstrap.servers",
        "34.86.170.127:9092")
      .option("subscribe", KAFKA_TOPIC_NAME_CONS)
      .option("startingOffsets", "latest")
      .option("failOnDataLoss", false)
      .load()

这给了我以下错误

 java.net.UnknownHostException: kafka-0.us-west2-c.c.civic-animal-213016.internal: nodename nor servname provided, or not known

我觉得这个错误很有趣,因为即使我只给出它,它也会以某种方式在 GCP 上找出我的主机名。(这可以从 zookeeper-shell.sh localhost:2181 <<< "get /brokers/ids/0 确认)

所以我进一步研究了这个问题,并找到了这篇博文。 https://www.confluent.io/blog/kafka-client-cannot-connect-to-broker-on-aws-on-docker-etc/ 并了解了广告听众。然后我阅读了以下 stackoverflow 交流。

Not able to connect to kafka server on google compute engine from local machine

第二种方法

我尝试了答案。所以我虚拟机进入我的 kafka-0 代理实例并运行以下命令

vi kafka_2.12-2.0.0/config/server.properties

然后我取消了广告听众的注释并更改了

#advertised.listeners=PLAINTEXT://localhost:9092

advertised.listeners=PLAINTEXT://[instance_public_id_address]:9092

所以这解决了

advertised.listeners=PLAINTEXT://kafka-0.us-west2-c.c.civic-animal-213016.internal:9092

但是,这仍然给我同样的错误

java.net.UnknownHostException: kafka-0.us-west2-c.c.civic-animal-213016.internal: nodename nor servname provided, or not known

所以尝试 3,我尝试更改而不是使用外部 IP 进行连接,我可以使用主机名代替

val df = sparkSession.readStream
      .format("kafka")
      .option("kafka.bootstrap.servers",
        "kafka-0.us-west2-c.c.civic-animal-213016.internal:9092")
      .option("subscribe", KAFKA_TOPIC_NAME_CONS)
      .option("startingOffsets", "latest")
      .option("failOnDataLoss", false)
      .load()

但我收到以下错误。

Caused by: org.apache.kafka.common.config.ConfigException: No resolvable bootstrap urls given in bootstrap.servers

我很困惑如何解决这个问题?任何可以帮助我走得更远的步骤

【问题讨论】:

  • .internal 就是它所说的那样。我不认为那是您的“公共 DNS”名称
  • 当我运行 zookeeper-shell.sh localhost:2181
  • 这与您在advertised.listeners中输入的信息相同
  • 所以,34.86.170.127:9092 似乎工作正常...您打开了端口,并且引导请求已通过发送。然后,内部地址被返回(通过 Zookeeper),但这些主机名无法在您的 VPC 之外解析
  • 另外,最好使用多个监听器。一个用于内部流量,另一个用于外部网络客户端(在网络外部打开 PLAINTEXT 协议也不是一个好主意,但这是一个单独的问题)

标签: google-cloud-platform apache-kafka spark-structured-streaming


【解决方案1】:

结果我很困惑为advertised.listeners=PLAINTEXT://[instance_public_id_address]:9092 输入什么

我变了

advertised.listeners=PLAINTEXT://kafka-0.us-west2-c.c.civic-animal-213016.internal:9092

到这里

advertised.listeners=PLAINTEXT://34.86.170.127:9092

其中 34.86.170.127:9092 是我在 VM 实例上的外部 IP。

【讨论】:

    猜你喜欢
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 2020-08-18
    • 2020-04-11
    • 2021-11-27
    • 2018-07-12
    相关资源
    最近更新 更多