You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Kubernetes上的Spark应用连接Docker部署的Kafka?

解决Kubernetes上Spark应用连接外部Docker Kafka的问题

错误原因

ed-kafka是Docker Compose创建的内部网络别名,仅在Docker Compose的默认网络范围内可解析,Kubernetes集群的Pod不在该网络中,因此无法识别这个主机名,导致"Unresolved Host-ed-kafka:29092"错误。


解决方案

1. 调整Kafka的对外暴露地址配置

修改docker-compose.yml中Kafka的KAFKA_ADVERTISED_LISTENERS参数,将PLAINTEXT_HOST的地址替换为Docker宿主机的实际可访问IP(如内网IP 192.168.1.100),而非127.0.0.1:

version: '2'
services:
  ed-zookeeper:
    # ... 原有配置不变
  ed-kafka:
    # ... 原有配置不变
    environment:
      # ... 其他配置不变
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://ed-kafka:29092,PLAINTEXT_HOST://<宿主机实际IP>:9092
      # ... 其他配置不变
volumes:
  streaming_data:

说明:PLAINTEXT://ed-kafka:29092保留给Docker内部容器使用,PLAINTEXT_HOST配置为K8s集群能访问到的宿主机IP,让Spark Pod可以通过该地址连接Kafka。

修改完成后重启Kafka容器:

docker-compose down && docker-compose up -d

2. 确保网络可达性

  • 检查Docker宿主机的防火墙规则,开放9092端口,允许Kubernetes集群所在的IP段访问。
  • 若K8s集群与Docker宿主机不在同一内网,需确保宿主机的公网IP或内网路由能被K8s Pod访问到。

3. 配置Spark应用的Kafka连接参数

在Spark应用代码中,将Kafka Broker地址设置为宿主机IP加9092端口:

// Scala 示例
val streamingDF = spark.readStream
  .format("kafka")
  .option("kafka.bootstrap.servers", "<宿主机实际IP>:9092")
  .option("subscribe", "raw")
  .load()
# Python 示例
streaming_df = spark.readStream \
    .format("kafka") \
    .option("kafka.bootstrap.servers", "<宿主机实际IP>:9092") \
    .option("subscribe", "raw") \
    .load()

特殊场景:Docker Desktop内置Kubernetes集群

如果使用Docker Desktop自带的K8s集群,可以用host.docker.internal作为宿主机的映射地址,无需手动填写IP:

  1. 修改Kafka的KAFKA_ADVERTISED_LISTENERS:
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://ed-kafka:29092,PLAINTEXT_HOST://host.docker.internal:9092
  1. Spark应用中使用host.docker.internal:9092作为Broker地址。

内容的提问来源于stack exchange,提问作者Vaibhav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 06:11:16