我目前在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
我对如何解决这个问题感到困惑?任何可以帮助我进一步发展的步骤
答案 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。