将本地计算机上的Spark流连接到GCP上的kafka

时间:2020-09-16 18:23:30

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

我目前在GCP上有4个VM。 1个是我的动物园管理员的托管地,另外3个是名为kafka-0,kafka-1,kafka-2的kafka经纪人。在VMS中生成/使用消息时,一切工作正常,但是当我尝试从本地计算机连接到Kafka时,一切都开始失败。首先,我打开了端口9092(在所有实例上)的防火墙规则。然后,我为每个实例添加了一个静态外部IP。我正在尝试通过本地Spark流作业连接到我的kafka经纪人。

只需进行健全性检查,我的动物园管理员就可以连接到所有经纪人

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

我对如何解决这个问题感到困惑?任何可以帮助我进一步发展的步骤

1 个答案:

答案 0 :(得分:1)

原来我对广告的内容感到困惑。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。