Windows环境下使用SparkContext.wholeTextFiles出现Py4JJavaError如何解决
报错原因
该错误由Windows系统下Hadoop缺少与3.2.2版本匹配的原生支持组件导致,NativeIO的Windows本地实现需要依赖winutils.exe、hadoop.dll等文件才能正常完成文件权限校验和目录读取操作。
解决方案
步骤1:安装匹配版本的Hadoop Windows原生组件
下载与Hadoop 3.2.2完全匹配的Windows原生工具包,将工具包bin目录下的所有文件,覆盖替换本地Hadoop 3.2.2安装根目录下bin文件夹的原有内容。
步骤2:配置系统环境变量
- 新建系统环境变量
HADOOP_HOME,值为本地Hadoop 3.2.2的根目录路径,例如D:\program\hadoop-3.2.2 - 在系统Path环境变量中新增
%HADOOP_HOME%\bin条目 - 将
%HADOOP_HOME%\bin\hadoop.dll文件复制到C:\Windows\System32目录下,避免JVM运行时找不到依赖
步骤3:生效配置并验证
重启电脑让环境变量生效后,打开命令提示符执行winutils -version,如果能正常输出Hadoop版本号则说明原生组件配置成功。
步骤4:调整代码路径写法(可选,规避转义问题)
Windows本地路径建议用正斜杠代替反斜杠,避免转义字符导致的路径识别错误,调整后的代码如下:
from pyspark import SparkContext sc = SparkContext('local', 'Test') # 路径用正斜杠 load_files = sc.wholeTextFiles('E:/Sample') load_files.take(5)
步骤5:权限校验兜底方案
如果完成上述操作后仍然报错,可以在初始化SparkContext后添加以下配置,跳过NativeIO权限校验逻辑:
from pyspark import SparkContext sc = SparkContext('local', 'Test') # 新增两行配置 sc._jsc.hadoopConfiguration().set("hadoop.native.lib", "false") sc._jsc.hadoopConfiguration().set("fs.file.impl", "org.apache.hadoop.fs.RawLocalFileSystem") load_files = sc.wholeTextFiles('E:/Sample') load_files.take(5)
内容的提问来源于stack exchange,提问作者Sina
相关产品推荐
相关产品推荐

