使用PySpark从Docker部署的Hadoop集群读取CSV文件时出现连接超时问题求助
解决PySpark读取Docker中Hadoop CSV时的连接超时问题
从你描述的错误来看,核心问题是Spark的Executor节点(你的两个Slave容器)无法成功连接到Hadoop NameNode的9000端口——虽然你在Hadoop UI里确认了文件路径正确,但Spark集群的工作节点没法和Hadoop集群建立稳定的网络连接,才导致了超时。下面是几个针对性的解决方案:
1. 先排查Docker容器间的网络连通性
这是最常见的根因,先确认基础网络是否通畅:
- 登录任意一个Spark Slave容器,执行
ping my_hadoop_cluster_ip,检查能否ping通Hadoop主容器的IP - 再用
nc -zv my_hadoop_cluster_ip 9000或telnet my_hadoop_cluster_ip 9000测试9000端口是否开放可访问 - 如果不通,要确保所有Spark和Hadoop容器都在同一个Docker自定义网络里(默认bridge网络可能存在隔离限制),可以用
docker network ls查看现有网络,再通过docker network connect命令把容器加入同一网络。
2. 修改Hadoop绑定配置,避免仅监听localhost
默认情况下,Hadoop可能只绑定了localhost地址,导致外部容器无法访问:
- 进入Hadoop主容器,修改
$HADOOP_HOME/etc/hadoop/core-site.xml,把fs.defaultFS的地址从hdfs://localhost:9000改成Hadoop容器的实际IP或可被Spark集群解析的主机名:<property> <name>fs.defaultFS</name> <value>hdfs://my_hadoop_cluster_ip:9000</value> </property> - 同时修改
hdfs-site.xml里的dfs.namenode.http-address和dfs.datanode.address,确保它们绑定的是容器的外部可访问地址,而非localhost - 修改完成后重启Hadoop集群(执行
stop-all.sh再start-all.sh)
3. 临时调整Spark的Hadoop连接超时参数(辅助方案)
如果网络连通但偶尔出现超时,可以延长Spark的Hadoop客户端超时时间,在提交脚本时添加以下参数:
spark-submit --master spark://my_cluster_spark_ip:7077 \ --conf spark.hadoop.hadoop.security.socket.timeout=60000 \ --conf spark.hadoop.dfs.client.socket-timeout=60000 \ test.py
也可以在Spark的 spark-defaults.conf 里永久添加这些配置,但这只是缓解手段,核心还是要解决网络连通问题。
4. 使用Docker主机IP替代容器内部IP
如果Hadoop容器已经把9000端口映射到了你的本地主机(比如docker run时加了 -p 9000:9000),可以把HDFS路径改成主机IP:
dfcsv = spark.read.csv("hdfs://[你的本地主机IP]:9000/user/root/input/test.csv")
如果是Docker Desktop环境,还可以用 host.docker.internal 代替主机IP,容器能直接通过这个地址访问主机的端口。
5. 解决主机名解析问题
如果Spark节点无法解析my_hadoop_cluster_ip这个主机名,可以手动在每个Spark容器的/etc/hosts里添加映射:
echo "[Hadoop主容器的实际IP] my_hadoop_cluster_ip" >> /etc/hosts
这样就能避免因为DNS解析失败导致的连接超时。
内容的提问来源于stack exchange,提问作者Colin Defever
相关产品推荐
相关产品推荐

