Docker部署HDFS后通过Airflow连接失败的问题求助
问题解决方案
一、HDFS连接拒绝问题
1. 确保网络互通
- 如果Airflow运行在Docker容器中:将Airflow容器加入Hadoop/Spark集群所在的Docker网络。先通过
docker network ls找到项目创建的网络(通常名称类似docker-hadoop-spark_default),再执行docker network connect <network-name> <airflow-container-id>。 - 如果Airflow在本地运行:
- 修改Hadoop namenode的绑定地址:进入namenode容器,编辑
$HADOOP_HOME/etc/hadoop/core-site.xml,将fs.defaultFS的值改为hdfs://0.0.0.0:9000,然后重启namenode服务。 - 检查主机防火墙是否开放9000端口,确保本地能访问namenode的9000端口。
- 修改Hadoop namenode的绑定地址:进入namenode容器,编辑
2. 显式配置Spark的HDFS参数
在构建SparkSession时,直接指定HDFS的地址,避免依赖容器内部的hostname解析:
spark = (SparkSession .builder .master("spark://127.0.0.1:7077") .appName("Test") .config("fs.defaultFS", "hdfs://172.19.0.9:9000") # 替换为你的namenode容器IP .getOrCreate())
另外,将Hadoop的core-site.xml和hdfs-site.xml文件复制到Airflow环境的Spark配置目录(如$SPARK_HOME/conf/),确保Spark能读取到正确的Hadoop配置。
3. 验证连通性
- 在namenode容器中执行
hdfs dfsadmin -report,确认namenode正常运行且9000端口处于监听状态。 - 在Airflow环境中执行
nc -zv 172.19.0.9 9000(或telnet 172.19.0.9 9000),测试是否能连通namenode的9000端口。如果不通,优先排查网络配置。
二、Spark序列化版本不兼容问题
这个错误是因为Airflow环境中的Spark版本与集群中的Spark版本不一致导致的,解决步骤:
- 检查版本一致性:查看集群中Spark的版本(进入spark-master容器执行
spark-submit --version),确保Airflow环境(或SparkOperator使用的镜像)的Spark版本与集群完全相同(包括小版本,比如3.3.0必须对应3.3.0,不能是3.3.1)。 - 统一Spark镜像:如果使用Airflow的SparkOperator,指定与集群相同的Spark镜像,避免版本差异。
- 清理缓存:删除Spark集群的work目录(通常在容器内的
$SPARK_HOME/work/),重启Spark集群和Airflow,清除旧的序列化类残留。
内容的提问来源于stack exchange,提问作者Марсель Абдуллин
相关产品推荐
相关产品推荐

