尧图精选

Windows下PySpark+PyCharm环境配置与报错排查

🕒 发布时间:2026/10/2 4:23:33 📁 来源:尧图网络
Windows 下折腾 PySpark十个里八个卡在同一批坑上JDK 装太新、SPARK_HOME 改了但 Path 没生效、winutils.exe 忘了放、PyCharm 里一点运行就抛HADOOP_HOME and hadoop.home.dir are unset。我在三台不同配置的机器上从零配过这套环境包括 Win10 家庭版、Win11 和一台带虚拟机的笔记本每次踩的坑都记了下来。这篇就把 Windows PySpark PyCharm 的安装配置一次讲透从 JDK 选型、Spark 解压、winutils 补丁到 PyCharm 解释器设置、运行配置里的环境变量再到十几条常见报错的排查思路全部按我实际操作的真实顺序写。如果你只是想在本机把 PySpark 跑起来做数据分析、写写 DataFrame 作业、跑跑本地小规模任务那这套流程完全够用不需要碰任何服务器和集群。全文的路径示例我统一用D:\bigdata\作为根目录你照着换成自己的盘符就行但请务必记住纯英文、无空格、无中文这一条比后面所有配置都重要。1. 先把这套环境到底在装什么搞清楚1.1 PySpark 的三层结构决定了你要装三样东西PySpark 本质上是 Spark 的 Python 接口层它自己不是一个独立引擎。你在 Python 里写的spark.read.csv()、df.groupBy()最终都会通过Py4J这座桥转成 JVM 上的 Scala 调用去执行。所以结构是三层最底下是 Scala 写的 Spark 核心跑在 Java 虚拟机里中间是 Py4J 负责 Python 进程和 JVM 进程之间的序列化通信最上面才是你写的 Python 代码。这个结构直接决定了 Windows 上必须凑齐三样东西一个能跑的JVM、一个Python 解释器、以及Spark 的发行包里面有 jars 目录、bin 脚本、python 子包。少一样都不行而且三者的版本还要能对上。很多人的第一反应是pip install pyspark就完事了。这个命令确实会把整个 Spark 发行包连同几百兆的 jar 一起拉下来但 Windows 上仍然差一个关键补丁Hadoop 的本地库文件winutils.exe和hadoop.dll。缺了它代码一碰文件写入、或者 Spark 想创建临时目录申请权限时就会抛空指针异常或者权限相关的错误。这是 Windows 平台独有的问题Linux 和 macOS 用户完全不会遇到所以很多教程直接略过Windows 用户照着做就莫名其妙失败了。1.2 为什么 Windows 格外难搞两个非官方因素第一个因素是Hadoop 的 NativeIO 在 Windows 上没有官方编译版。Hadoop 的本地库是用 C 写的官方只发布了 Linux 版本。社区有人把在 Windows 上用 Visual Studio 编译好的winutils.exe和hadoop.dll放出来配合HADOOP_HOME环境变量指过去就能用。这个东西不是 Spark 官方维护的所以版本要和你的 Hadoop 版本大致对齐用 Spark 3.x 的话选 Hadoop 3.3.x 对应的那份就行。第二个因素是路径里的空格和中文。Windows 默认安装目录是C:\Program Files\...这个空格会在脚本拼接命令行参数时把路径截断Spark 的启动脚本是 shell 脚本逻辑对带空格的路径处理得并不好。中文路径的问题更隐蔽某些情况下 JVM 读取时按系统默认编码解析直接变成乱码导致ClassNotFoundException。所以我给自己定的铁律是所有大数据相关工具统一放在D:\bigdata\下面每个工具一个子目录目录名全是英文小写加连字符。还有一个容易被忽略的点是环境变量的生效机制。Windows 的环境变量是在进程启动时读取的你改完系统变量后已经开着的 cmd 窗口、已经打开的 PyCharm都不会自动刷新。所以每次改完环境变量第一件事是把终端全部关掉重开。我见过太多人卡在这一步反复检查配置都没问题其实只是没重启终端。2. 安装前的版本盘点与选型决策2.1 JDK 选型为什么我不建议直接装最新版JDK 是整套环境里最容易踩坑的地方因为 Java 最近的更新太激进。Spark 内部大量使用反射访问 JDK 内部类JDK 9 引入模块系统、JDK 17 进一步收紧封装之后很多访问会被拒绝报InaccessibleObjectException。另外 Spark 3.x 的核心是 Scala 2.12 编译的字节码版本和目标 JDK 也有对应关系用太新的 JDK 会直接报Unsupported class file major version 61这种错——61 就是 JDK 1765 是 JDK 21。下面这张表是我实测下来比较稳的搭配你可以直接照抄Spark 版本可用 JDK推荐 JDK说明3.0.x - 3.2.x8 / 118最保守几乎零兼容问题3.3.x - 3.5.x8 / 11 / 178 或 11官方支持 17但实测 17 偶发模块访问警告4.0.x 及以上17 / 2117必须新 JDK老版本反而跑不了我的选择是JDK 8理由是它最稳、资料最多、报错最少。别觉得 JDK 8 老Spark 生态对它的支持是完整的。如果你机器上已经装了别的 JDK也不必卸载Windows 上多版本共存很简单JAVA_HOME指向哪个用的就是哪个。装 JDK 8 的时候安装路径手动改成D:\bigdata\jdk8不要用默认的 Program Files 路径。装完之后确认一下JAVA_HOME指向的是包含bin\java.exe的那一层目录JDK 8 的安装目录里会有一个 jre 子目录别指错了。2.2 Python 版本别超过 Spark 支持的上限Python 版本这一块坑主要出在太新上。Spark 的 Python worker 是通过 socket 回调跟 JVM 通信的新旧 Python 之间的协议细节有差异版本超纲会直接报Python worker failed to connect back而且报错信息完全没有提示是版本问题。Spark 版本支持的 Python 范围我的建议3.3.x / 3.4.x3.7 - 3.103.103.5.x3.8 - 3.113.114.0.x3.9 - 3.123.11另外必须确认是64 位 Python。32 位版本在处理稍大数据量时会因为内存寻址限制直接崩掉而且报错很难看懂。安装时记得勾选Add Python to PATH路径手动改成D:\bigdata\python311。关于用 Anaconda 还是官方 CPythonAnaconda 自带 numpy、pandas 这些常用库开箱即用很省事但它的 base 环境非常庞大PySpark 启动 worker 时要扫描和导入的模块更多启动会慢一些。我现在更偏向官方 Python 加 venv干净、可控、每个项目独立。如果你是纯新手想少折腾用 Anaconda 也完全可以后面的配置逻辑一模一样。2.3 winutils 与 HADOOP_HOMEWindows 特有的那一块拼图winutils 这套东西的做法很简单在D:\bigdata\下建一个hadoop\bin目录把winutils.exe和hadoop.dll两个文件丢进去然后设置HADOOP_HOMED:\bigdata\hadoop再把%HADOOP_HOME%\bin加进 Path。有人会在教程里说要把hadoop.dll复制到C:\Windows\System32我不推荐。往系统目录塞东西以后很难清理而且多版本共存时会互相干扰。只要%HADOOP_HOME%\bin在 Path 里DLL 就能被正常加载没必要污染系统目录。选择 winutils 版本时优先选和你的 Spark 发行包同名 Hadoop 版本对应的那一份。比如spark-3.5.1-bin-hadoop3.tgz对应的就是 Hadoop 3 系列找 hadoop-3.3.x 的 winutils 就行。差一两个小版本通常没问题但大版本别跨。注意winutils.exe 和 hadoop.dll 必须是同一批次的两个文件不要从两个来源各拿一个否则会报UnsatisfiedLinkError而且这个错不会告诉你是文件不匹配。3. 手把手实操从零到 pyspark 命令行跑通3.1 JDK 安装与环境变量配置下载 JDK 8 的 Windows x64 安装包运行安装程序把安装路径改成D:\bigdata\jdk8。安装完成后按 Win 键搜环境变量打开编辑系统环境变量在高级标签里点环境变量。在系统变量区域新建变量名JAVA_HOME变量值D:\bigdata\jdk8然后在系统变量里找到Path双击编辑新增一行%JAVA_HOME%\bin这里有个细节编辑 Path 时要用新建按钮逐条添加不要手动在原有内容后面直接拼分号很容易把已有条目弄坏。添加完成后一路确定保存。验证方式是新开一个 cmd 窗口一定要新开执行echo %JAVA_HOME% java -version javac -version三条命令都有正确输出才算通过。java -version的输出里应该能看到1.8.0_xxx这样的版本号。如果提示不是内部或外部命令八成是 Path 没生效或者%JAVA_HOME%\bin写错了。3.2 Python 安装与 pip 源配置Python 安装包同样把路径改成D:\bigdata\python311安装向导第一页务必勾选Add Python to PATH。装完新开 cmd 验证python --version pip --version接下来配置 pip 源国内直接连官方源下载 pyspark 那几百兆会很慢。一条命令搞定pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pip config set global.trusted-host pypi.tuna.tsinghua.edu.cn这两条命令的作用是往用户目录下写一份 pip.ini 配置文件之后所有 pip 安装都会走这个源。我自己的经验是同样装 pyspark走默认源可能要十几分钟甚至中途断连换源之后两分钟左右就完事。除了清华源常用的还有阿里云源哪个快用哪个配置方式就是把上面的地址换掉。3.3 Spark 解压与目录规划去 Spark 官网下载页选一个版本文件名形如spark-3.5.1-bin-hadoop3.tgz。注意文件名里的bin-hadoop3这表示它是预编译好的、带 Hadoop 3 依赖的版本别下成without-hadoop的那个。tgz 在 Windows 上要解压两次。用 7-Zip 右键第一次解压得到一个.tar文件再右键解压一次才得到真正的spark-3.5.1-bin-hadoop3文件夹。把它移到D:\bigdata\下重命名为spark-3.5.1这样路径更短后面写环境变量也省事。解压完先花一分钟认识一下目录结构后面排查问题都用得上目录作用你会用到它的场景bin启动脚本含 pyspark、spark-shell、spark-submit加进 Path命令行调用jars所有 Java 依赖包报 NoClassDefFoundError 时来这看pythonPySpark 的 Python 包和 py4j 桥接库必须加进 PYTHONPATHconf配置文件模板调日志、调默认参数sbin集群启停脚本本地模式用不到配置环境变量这次有三个SPARK_HOMED:\bigdata\spark-3.5.1HADOOP_HOMED:\bigdata\hadoopPYTHONPATHD:\bigdata\spark-3.5.1\python;D:\bigdata\spark-3.5.1\python\lib\py4j-0.10.9.7-src.zip然后编辑 Path追加两行%SPARK_HOME%\bin%HADOOP_HOME%\binPYTHONPATH里那个 py4j 的版本号千万别照抄。你要打开D:\bigdata\spark-3.5.1\python\lib\目录看一眼实际的 zip 文件名是什么每个 Spark 版本带的 py4j 版本不一样写错了就会报ModuleNotFoundError: No module named py4j。这是新手最容易翻车的一步一定要去看实际文件名。3.4 winutils 放置与 HADOOP_HOME 打通在D:\bigdata\下新建hadoop\bin两级目录把下载好的winutils.exe和hadoop.dll放进去。HADOOP_HOME我们在上一步已经设好了这一步主要是确认文件位置正确。判断有没有配好的最直接方式是在命令行里执行where winutils如果输出了D:\bigdata\hadoop\bin\winutils.exe就说明 Path 生效了。这个命令比翻环境变量面板快得多我每次配完都用它验一遍。3.5 三连验证java、pyspark、写文件到这一步所有配置都做完了开一个全新的 cmd 窗口按顺序跑echo %SPARK_HOME% echo %HADOOP_HOME% where winutils pyspark --version前面几个是确认环境变量最后一条pyspark --version会真正启动 PySpark 的交互式 shell。第一次启动会刷一大堆日志其中夹杂着WARN开头的行这非常正常只要最后出现提示符就说明环境通了。在提示符后面敲一个最小验证专门用来确认 winutils 是否真的生效spark.range(5).write.mode(overwrite).csv(D:/tmp/sparktest)然后去D:\tmp\sparktest看一眼如果目录下出现了part-00000-xxx.csv和_SUCCESS文件说明 Hadoop 本地库工作正常。这一步如果报权限相关的错基本就是 winutils 没配好或者hadoop.dll没加载上。3.6 纯 Python 脚本验证顺便决定用哪种 pyspark 包交互式 shell 通了之后再验证一下用独立 Python 脚本跑的方式from pyspark.sql import SparkSession from pyspark.sql import functions as F spark SparkSession.builder \ .appName(local-check) \ .master(local[2]) \ .getOrCreate() df spark.createDataFrame([(1, alpha), (2, beta), (3, gamma)], [id, name]) df.withColumn(tag, F.upper(F.col(name))).show() spark.stop()这里要说明一个很多人纠结的问题独立 Spark 包和 pip 装的 pyspark 到底用哪个。方案优点缺点适合谁只用独立 Spark 包目录清晰后续用 spark-submit 方便PyCharm 里要手动把 python 目录加进解释器路径打算长期用、后面要提交任务只用 pip install pysparkPyCharm 里 import 直接就能用jar 全在 site-packages 里SPARK_HOME 指向难看只跑本地小脚本两个都装版本严格一致命令行和 IDE 都能跑多占几百兆磁盘我目前的做法我现在的做法就是两个都装但版本号必须完全一致。命令行用独立包PyCharm 里用 pip 装的那个。不一致的话会出现 Python 端代码和你实际调用的 jar 不匹配报一些莫名其妙的Py4JJavaError。4. PyCharm 配置把 PySpark 装进 IDE 里4.1 社区版完全够用别在版本上浪费时间先把这个说清楚跑 PySpark 本地开发PyCharm 社区版就够了。社区版支持完整的 Python 语法分析、调试、虚拟环境管理和运行配置PySpark 项目用到的功能一个不缺。专业版多出来的是 Web 框架支持、远程调试、数据库工具窗口这些跟本地跑 Spark 没关系。网上那些关于激活的说法我一律不建议碰用社区版省心也不会有任何合规风险。4.2 项目创建与解释器选择新建项目时Location 填一个纯英文路径比如D:\projects\pyspark-demo。解释器那一栏选Virtualenv位置默认在项目下的.venv目录基础解释器选D:\bigdata\python311\python.exe。用虚拟环境的好处是依赖隔离以后项目多了不会互相污染。项目建好后打开底部的 TerminalPyCharm 内置终端会自动激活 venv装依赖pip install pyspark3.5.1版本号和你解压的独立 Spark 包保持一致。装完在 PyCharm 里确认解释器列表里有 pyspark 这个包或者直接在代码里import pyspark看有没有红色波浪线。如果你选择的是只用独立 Spark 包的方案那 pip 里不用装 pyspark但需要在解释器设置里手动添加路径Settings→Project→Python Interpreter→ 点右上齿轮 →Show All→ 选中你的解释器 → 点右侧的路径编辑图标 → 用加号添加两条D:\bigdata\spark-3.5.1\pythonD:\bigdata\spark-3.5.1\python\lib\py4j-0.10.9.7-src.zip加完之后 PyCharm 才能索引到 pyspark 包代码补全和跳转才会正常工作。4.3 运行配置里必须补上的环境变量这是 PyCharm 环节最关键的一步也是最容易漏的一步。PyCharm 启动的运行进程虽然是 cmd 的子进程但它继承的环境变量不一定完整尤其是从桌面图标启动 PyCharm 的时候。所以要在运行配置里显式声明。路径是Run→Edit Configurations→ 左侧展开Templates→ 找到Python在Environment variables那一栏点右侧图标添加三条变量名值SPARK_HOMED:\bigdata\spark-3.5.1HADOOP_HOMED:\bigdata\hadoopPYTHONPATHD:\bigdata\spark-3.5.1\python;D:\bigdata\spark-3.5.1\python\lib\py4j-0.10.9.7-src.zip填的时候注意分隔符是分号格式是KEYVALUE;KEY2VALUE2中间不能有多余空格。改 Templates 的好处是以后每个新脚本都自动带上这些变量不用一个个配。同时确认Working directory设成了项目根目录Add content roots to PYTHONPATH和Add source roots to PYTHONPATH这两个复选框都勾上。4.4 代码里显式设置新手最保险的做法不管你环境变量配得多仔细我都建议在代码开头显式写一遍。这不是多余而是能把环境变量为什么没生效这个最烦人的变量彻底排除掉让问题范围从三个变成零个。import os import sys SPARK_HOME rD:\bigdata\spark-3.5.1 HADOOP_HOME rD:\bigdata\hadoop PY4J_ZIP rD:\bigdata\spark-3.5.1\python\lib\py4j-0.10.9.7-src.zip os.environ[SPARK_HOME] SPARK_HOME os.environ[HADOOP_HOME] HADOOP_HOME os.environ[PATH] os.path.join(HADOOP_HOME, bin) os.pathsep os.environ.get(PATH, ) sys.path.insert(0, os.path.join(SPARK_HOME, python)) sys.path.insert(0, PY4J_ZIP) from pyspark.sql import SparkSession逐行解释一下在干什么。前两行把SPARK_HOME和HADOOP_HOME写进当前进程的环境变量这样 Spark 启动脚本读得到。第三行把hadoop\bin插到 PATH 最前面保证 Windows 能优先加载到我们的hadoop.dll避免和其他版本冲突。后面两个sys.path.insert是把 PySpark 包目录和 py4j 的 zip 插到模块搜索路径最前面而且必须写在import pyspark之前否则 import 已经失败再插也没用。这个顺序问题很多人搞反。注意字符串前面加r表示原始字符串这样路径里的反斜杠不会被当成转义符。Windows 路径不写r偶尔会踩到\t、\n这种转义坑加上最省事。4.5 日志刷屏、中文乱码和编码设置跑起来之后你很快会遇到两个体验问题。第一个是日志刷屏Spark 默认日志级别是 INFO一启动几百行你想看的show()结果被淹在里面。解决办法是在项目里放一个log4j2.propertiesrootLogger.level warn rootLogger.appenderRef.stdout.ref console appender.console.type Console appender.console.name console appender.console.layout.type PatternLayout appender.console.layout.pattern %d{HH:mm:ss} %-5p %c{1}: %m%n放在项目根目录然后在运行配置的 VM options 里加-Dlog4j.configurationFilelog4j2.properties。如果不方便动配置用最粗暴的一行代码也能压住大部分噪音import logging logging.getLogger(py4j).setLevel(logging.ERROR)实测这一行能干掉一半以上的日志输出对排查问题几乎没有影响因为真正有用的报错是 ERROR 级别的。第二个是中文乱码Windows 控制台默认是 GBK 编码Python 输出 UTF-8 字符时会乱码。三处一起改PyCharm 的Settings→Editor→File Encodings把三个下拉框全设成 UTF-8运行配置的环境变量里加PYTHONIOENCODINGutf-8代码里读文件时显式指定编码df spark.read.option(encoding, utf-8).csv(data/中文数据.csv, headerTrue)三处都改完基本就不会再乱码了。只改一处的话问题会转移而不是消失。5. 常见报错速查与排查思路5.1 报错速查表下面这张表是我自己踩过加帮别人看过的问题汇总按出现频率排序前三行覆盖了八成的求助场景。报错信息关键词根本原因解决方法HADOOP_HOME and hadoop.home.dir are unsetHADOOP_HOME 没设或没生效设环境变量后重开终端或在代码里os.environ设置Could not locate executable null\bin\winutils.exeHADOOP_HOME 为空路径被拼成null\bin同上注意是 HADOOP_HOME 而非 HADOOP_HOME 拼错UnsatisfiedLinkErrorNativeIO$Windows缺 hadoop.dll 或没加载上确认 dll 在%HADOOP_HOME%\bin且该目录在 Path 最前Unsupported class file major version 61JDK 版本过新61 是 JDK 17换 JDK 8 或 11Python worker failed to connect backPython 版本超纲或 PATH 里有多个 python统一用 3.10 / 3.11检查 PATH 顺序ModuleNotFoundError: No module named py4jPYTHONPATH 里 py4j 版本号写错去python\lib看实际 zip 文件名ModuleNotFoundError: No module named pysparkPyCharm 解释器选错装到了别的环境检查解释器与 pip 安装位置是否一致AccessControlException/ 权限被拒绝winutils 缺失或临时目录无权限配好 winutils临时目录设到用户目录下NoClassDefFoundError: scala/...Spark 包与 jars 不匹配或 PYTHONPATH 指向了错版本清理 PYTHONPATH只保留一个 Spark 版本WARN ProcfsMetricsGetterWindows 上拿不到进程指标属正常现象忽略或调高日志级别pyspark提示不是内部命令%SPARK_HOME%\bin没进 Path检查 Path 并重开终端命令行被空格截断安装路径含空格全部迁到D:\bigdata\这类无空格路径5.2 三步定位法先修底层再修上层遇到报错别急着改代码按这三步从下往上确认能省掉大量无用排查。第一步确认 Java 能起来。在命令行执行java -version。这一步不通过后面全都白搭。常见问题是装了两个 JDKPath 里旧的那个排在前面java -version显示的不是你想要的版本。第二步确认 Spark 自身能起来。命令行执行pyspark能进提示符就说明 Spark、winutils、Python 三者的基础链路是通的。这一步不通过问题一定在环境变量或版本兼容跟你的代码无关。第三步才是 PyCharm 的问题。前两步都通过但 PyCharm 里报错那问题就锁定在 IDE 层面解释器选错、运行配置缺环境变量、venv 里没装包。这时候对照 4.2 和 4.3 两节逐条核查就行。我见过最多的误判是命令行跑得通PyCharm 里跑不通然后去改环境变量。实际上环境变量根本没问题是运行配置里的 Templates 没配或者解释器指向了系统 Python 而不是项目 venv。先按三步法定位能少走一大半弯路。5.3 几个不报错但让人困惑的现象有几个现象不会报错但每次看到都会让人怀疑是不是配错了这里提前打个招呼。一是启动时满屏的WARN。Spark 在 Windows 上会因为拿不到 Linux 特有的进程指标而刷警告这些是无害的只要最后出了结果就说明正常。二是第一次启动特别慢可能要二三十秒因为 JVM 冷启动加上要扫描 jars 目录第二次就快了这是正常的不是卡死。三是local[*]模式下看不到 4040 端口的 Web UI 的某些页面数据因为本地模式跑的任务太短UI 还没采集完任务就结束了代码跑得对就没问题。6. 实操心得与后续扩展方向6.1 环境变量改了不生效的三个真实原因折腾这套环境最耗时间的从来不是下载安装而是配置都对但就是不生效。我总结下来只有三个原因按出现频率排。第一是终端或 IDE 没重启。这个占了八成以上。改完系统环境变量必须关掉所有 cmd 窗口、关掉 PyCharm 再重开因为进程启动那一刻的环境变量是快照。有些人的 PyCharm 是从任务栏固定的图标启动的后台进程可能一直活着得从任务管理器里彻底结束再开。第二是用户变量和系统变量打架。用户变量里的同名变量会覆盖系统变量如果你在系统变量里设了SPARK_HOME但用户变量里还留着一个旧版本的那实际生效的永远是用户变量那个。排查的时候两栏都要看一遍别只盯着一栏。第三是Path 里的顺序。Path 是从上往下匹配的如果D:\software\python39排在D:\bigdata\python311前面那python命令用的就是 3.9 那个。我一般把大数据相关的几个目录全部置顶保证优先命中。6.2 两个能显著提升体验的 Spark 参数环境配好之后有两个参数我建议你在每个脚本里都设一下体验差别很大。spark SparkSession.builder \ .appName(demo) \ .master(local[4]) \ .config(spark.driver.memory, 4g) \ .config(spark.sql.shuffle.partitions, 8) \ .getOrCreate()先说spark.sql.shuffle.partitions。这个参数默认是 200是给集群环境设计的。你本地数据可能就几万行它却给你开 200 个任务每个任务处理几百行调度开销远远大于计算开销跑一个 groupBy 要等半分钟。设成你机器核数的两到四倍或者干脆设成 8速度快十倍不止这个我实测过很多次。再说内存。本地模式下 driver 和 executor 跑在同一个 JVM 里所以spark.executor.memory设了也没用真正起作用的是spark.driver.memory。这一点和集群模式完全不同很多从教程里抄配置的人会设错。4g 是个比较稳妥的起点如果你机器内存 16G 以上可以给到 6g 到 8g。6.3 从本地到集群代码几乎不用改本地跑通之后往集群迁移的成本比你想的低得多。你的业务代码——DataFrame 的转换逻辑、过滤、聚合、写出的格式——一行都不用改。唯一要动的是master这一个参数本地是local[*]换成集群就是spark://your-host:7077或者yarn。Spark 的设计初衷就是把执行环境和业务逻辑解耦这也是它比手写多进程脚本更值得学的地方。提交任务用spark-submit命令行方式的典型写法spark-submit --master local[4] --driver-memory 4g --py-files deps.zip main.py--py-files用来把你的自定义模块或者第三方依赖打包带上比如你把工具函数拆到了utils.py就把它和依赖一起打成一个 zip 传过去这样在提交的目标环境里也能 import 到。6.4 我这些年配环境攒下来的几条经验第一把整个安装过程写成一个文档放在仓库里。我自己有一份env-setup.md记录了所有路径、版本号、环境变量截图。换机器或者同事问的时候照着走二十分钟能搞定比每次重新摸索强太多。环境配置这种一次性的事情最值得写文档。第二版本锁定不要追最新。Spark 每个大版本都可能有兼容性调整你本地跑得好好的环境升级一个小版本就崩了。除非有明确的特性需求否则就用你验证过的那套组合把它记下来别再动。我到现在还在用 JDK 8 加 Spark 3.5 这套组合因为它稳定。第三遇到问题先怀疑环境变量再怀疑代码。这条听起来像废话但实际操作中代码逻辑错误的报错信息和环境配置错误的报错信息长得很不一样。环境类的报错通常带Exception in thread main前缀或者提到HADOOP_HOME、winutils、JAVA_HOME这些词代码类的报错则是AnalysisException、Py4JJavaError加一段 SQL 分析信息。先看报错里有没有提到环境相关的关键词能在一分钟内判断方向。第四留一个最小可复现脚本。就是前面 4.4 节那个十行左右的代码只做一件事创建一个三行数据的 DataFrame 然后 show。任何时候怀疑环境坏了先跑这个脚本它通过说明环境是好的问题在你的业务代码里它不通过说明环境坏了去查环境。这个习惯帮我省掉了无数次在业务代码里瞎找环境问题的时间。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →