Spark读取目录多文本文件失败求助:通配符/目录方式报错
解决Windows 10下Spark无法通过通配符/目录批量读取文本文件的问题
问题场景
Windows 10系统,Python 3.8.5(推测你笔误写成8.5)、Java 8、Anaconda 3环境下,使用Spark读取单个目录中的多份文本文件:
- 显式指定文件列表的方式(如
sc.textFile("data/199901.txt,data/200002.txt"))可正常运行 - 使用通配符(
*.txt、data/*.txt)或直接指定目录(data、C:/spark/HW1/data)的方式全部失败,执行collect()时抛出核心错误:
py4j.protocol.Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.collectAndServe. : java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
问题根源
这个错误是Hadoop本地IO库在Windows平台的兼容性问题:当Spark需要遍历目录(使用通配符或直接指定目录时会触发目录遍历操作),Hadoop会尝试调用Windows原生API检查文件权限,但缺少对应的原生库文件(winutils.exe、hadoop.dll),或库版本与Spark依赖的Hadoop版本不匹配,导致调用失败。
解决方案
方案1:配置Hadoop Windows原生库
- 确认Spark依赖的Hadoop版本:查看Spark安装目录下
lib文件夹中hadoop-*.jar的版本号(比如hadoop-2.7.3.jar) - 下载对应版本的Windows原生库(winutils.exe和hadoop.dll)
- 新建一个Hadoop目录(比如
C:\hadoop),在其中创建bin子目录,把下载的winutils.exe和hadoop.dll放入C:\hadoop\bin - 设置系统环境变量:
- 添加
HADOOP_HOME变量,值为C:\hadoop - 将
%HADOOP_HOME%\bin添加到系统PATH变量中
- 添加
- 重启命令行或IDE,重新运行Spark代码
方案2:禁用Hadoop原生IO检查
如果不想配置Hadoop环境,可以直接在Spark中禁用原生IO库的使用:
from pyspark import SparkConf, SparkContext # 初始化Spark配置时禁用原生IO conf = SparkConf().setAppName("BatchReadFiles").setMaster("local[*]") conf.set("spark.hadoop.io.native.lib.available", "false") sc = SparkContext(conf=conf) # 测试批量读取 files = sc.textFile("C:/spark/HW1/data/*.txt") llist = files.collect() for line in llist: print(line)
方案3:权限排查
- 确保运行Spark代码的用户对目标目录
C:/spark/HW1/data有读取权限 - 避免将数据目录放在需要管理员权限的路径(如C盘根目录),或使用管理员身份运行命令行/IDE
验证
完成上述配置后,重新尝试使用通配符或目录路径读取文件,应该可以正常加载RDD并打印内容。
内容的提问来源于stack exchange,提问作者DougW
相关产品推荐
相关产品推荐

