Windows11环境下PySpark读取目录CSV文件极慢的原因及解决方法
Windows 11本地PySpark读取目录CSV文件性能异常的原因与解决办法
问题背景
在Windows 11本地环境使用PySpark读取目录下2个仅20行的CSV文件时,出现严重性能问题:耗时超10分钟仍无法完成,且VS Code中无法终止内核,只能结束整个进程。但读取单个文件正常,在PySpark Docker容器中运行相同代码无异常,推测为Windows环境相关问题。
初始化Spark代码:
import findspark findspark.init() from pyspark.sql import SparkSession spark = SparkSession.builder.getOrCreate()
读取目录的代码:
path = r'C:\temp2\temp3\*.csv' df2 = spark.read.option("header", True).csv(path) df2.show()
原因分析
- Winutils组件缺失/配置错误:Spark依赖Hadoop的Winutils工具处理Windows文件系统操作,缺失或版本不匹配会导致文件枚举、访问操作异常缓慢。
- 安全软件实时扫描干扰:Windows Defender或第三方杀毒软件的实时监控会拦截Spark的文件读取操作,小文件的频繁访问会被反复扫描,大幅拖慢进程。
- 本地模式并行度配置不合理:Spark默认的本地模式线程数可能与Windows环境不匹配,小文件场景下调度开销远大于实际计算开销,导致进程卡顿。
解决办法
1. 配置Winutils工具
- 下载与Spark依赖的Hadoop版本匹配的Winutils(可通过
spark-submit --version查看Hadoop版本)。 - 创建系统环境变量
HADOOP_HOME,指向Winutils所在的根目录。 - 将Winutils的
bin目录添加到系统PATH环境变量中。 - 验证:打开命令提示符,执行
winutils.exe ls C:\temp2\temp3,确认能正常列出目录内文件。
2. 排除安全软件扫描范围
- 打开Windows Defender的「病毒和威胁防护」设置,将CSV文件目录(
C:\temp2\temp3)、Spark安装目录、Python环境目录添加到「排除项」列表。 - 可临时关闭实时扫描进行测试,确认问题是否由安全软件导致(测试完成后恢复防护)。
3. 调整Spark本地模式配置
- 初始化SparkSession时显式设置本地核心数,避免过度调度:
spark = SparkSession.builder \ .master("local[2]") # 根据CPU核心数设置,建议不超过实际物理核心数 .getOrCreate()
- 调整文件分区大小,减少小文件的分区数量,降低调度开销:
df2 = spark.read.option("header", True) \ .option("maxPartitionBytes", "10485760") # 设置每个分区为10MB .csv(r'C:\temp2\temp3')
4. 规范目录路径使用
直接传入目录路径而非通配符,避免路径解析异常:
path = r'C:\temp2\temp3' # 不要加末尾反斜杠或通配符 df2 = spark.read.option("header", True).csv(path)
内容的提问来源于stack exchange,提问作者Nicholas Jackson
相关产品推荐
相关产品推荐

