PySpark读取CSV失败:Connection Refused问题排查求助
问题描述
我尝试用PySpark读取CSV文件,安装Hadoop前能正常读取,但换成Java 8并安装Hadoop后无法读取,报错如下:
23/03/15 18:52:47 WARN FileStreamSink: Assume no metadata directory. Error while looking for metadata directory in the path: ../sales.csv. java.net.ConnectException: Call From MacBook-Pro-890.local/127.0.0.1 to localhost:9000 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
仅修改过Java版本和JAVA_HOME,怀疑是配置变更导致的问题,作为PySpark和Hadoop新手,查文档没头绪,该从哪开始排查?
相关配置信息:
core-site.xml
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> </configuration>
hdfs-site.xml
<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration>
zshrc
## JAVA env export PATH="/usr/local/mysql/bin:$PATH" export JAVA_HOME="$(/usr/libexec/java_home -v 1.8)" ## MAVEN env export M2_HOME=/usr/local/apache-maven-3.9.0 export PATH=${PATH}:${M2_HOME}/bin ## Homebrew env export PATH=/opt/homebrew/bin:$PATH export PATH=/opt/homebrew/sbin:$PATH export PYSPARK_DRIVER_PYTHON="jupyter" export PYSPARK_DRIVER_PYTHON_OPTS="notebook" export SPARK_HOME=/opt/homebrew/Cellar/apache-spark/3.3.2/libexec export PATH=$SPARK_HOME/bin:$PATH export SPARK_OPTS="--packages graphframes:graphframes:0.8.2-spark3.0-s_2.12" ## HADOOP env variables export HADOOP_HOME="/opt/homebrew/Cellar/hadoop/3.3.4/libexec" export PATH=$PATH:$HADOOP_HOME/bin export PATH=$PATH:$HADOOP_HOME/sbin export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop export HADOOP_MAPRED_HOME=$HADOOP_HOME export HADOOP_COMMON_HOME=$HADOOP_HOME export HADOOP_HDFS_HOME=$HADOOP_HOME export YARN_HOME=$HADOOP_HOME export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib" export HADOOP_CLASSPATH=${JAVA_HOME}/lib/tools.jar
排查步骤
1. 检查HDFS服务状态
安装Hadoop后,PySpark默认会使用HDFS作为文件系统(因core-site.xml配置了fs.defaultFS=hdfs://localhost:9000),若HDFS未启动就会触发连接拒绝错误:
- 执行
jps命令,查看输出中是否有NameNode和DataNode进程,没有则说明HDFS未启动。 - 启动HDFS:执行
start-dfs.sh,再次用jps确认进程是否正常运行。
2. 临时切换本地文件系统测试
若只是读取本地CSV,无需HDFS,可在读取路径前加上本地文件系统前缀file://,示例代码:
df = spark.read.csv("file:///absolute/path/to/sales.csv")
如果这样能正常读取,说明问题确实出在HDFS的配置或服务上。
3. 验证HDFS连接可用性
- 执行
hdfs dfs -ls /,若能返回HDFS根目录内容,说明HDFS服务和配置无问题;若仍报错连接拒绝,继续排查。 - 用
lsof -i :9000检查端口9000是否被其他程序占用,若有则停止对应进程,或修改HDFS配置文件更换端口。
4. 确认Hadoop配置生效
- 执行
echo $HADOOP_CONF_DIR,确认输出路径与zshrc中配置的/opt/homebrew/Cellar/hadoop/3.3.4/libexec/etc/hadoop一致。 - 执行
hadoop version,查看Hadoop是否正常识别Java 8环境,排除版本兼容问题。
5. 首次安装需初始化HDFS
如果是首次安装Hadoop,未格式化HDFS会导致NameNode无法启动:
- 执行
hdfs namenode -format完成格式化,之后再启动HDFS服务start-dfs.sh。
内容的提问来源于stack exchange,提问作者asmallpotato
相关产品推荐
相关产品推荐

