Spark写入DataFrame时抛出ExitCodeException错误求助
看起来你遇到的问题在Windows环境下的Spark中挺常见的,结合你的代码和错误信息,我来帮你梳理下解决方案:
问题分析
你的finalDF.show()能正常输出结果,说明DataFrame本身没有问题,但写入JSON时抛出ExitCodeException exitCode=-1073741515,还伴随临时文件删除失败的警告——这通常和Windows环境下的依赖缺失、文件权限或Hadoop配置有关。
具体解决方案
1. 安装Visual C++ Redistributable运行库
错误码-1073741515对应Windows系统的STATUS_DLL_NOT_FOUND,也就是缺少必要的动态链接库。你需要安装Microsoft Visual C++ Redistributable Packages for Visual Studio(建议选2015-2019版本,和你的JDK/Spark版本匹配),安装后重启IDE和Spark环境再试。
2. 检查文件路径与权限
- 避开系统保护的目录(比如
C:\Users\jsolano\IdeaProjects\Test2这类可能权限严格的目录),换成权限宽松的路径,比如C:\temp\test\df.json,记得先手动创建好C:\temp\test目录。 - 确保你的用户账号对目标路径有读写和删除的权限,Windows的UAC权限控制有时候会阻止Spark操作文件。
3. 配置Hadoop Winutils(关键步骤)
Spark在Windows上运行依赖Hadoop的winutils.exe工具,缺少它会直接导致文件系统操作失败:
- 下载和你的Spark版本兼容的Winutils包(比如Spark 2.x对应Hadoop 2.7版本)。
- 解压后把
winutils.exe放到一个目录(比如C:\hadoop\bin)。 - 设置系统环境变量:
- 添加
HADOOP_HOME,值为C:\hadoop(注意是bin目录的上一级)。 - 把
%HADOOP_HOME%\bin添加到系统PATH中。
- 添加
- 或者直接在你的Spark代码开头添加配置:
System.setProperty("hadoop.home.dir", "C:/hadoop")
4. 额外调试小技巧
- 先手动删除
test/df.json目录,再运行代码,避免覆盖模式下的文件锁定问题。 - 尝试合并分区后再写入,减少临时文件操作:
finalDF.coalesce(1).write.mode("overwrite").json("test/df.json")
你的代码片段:
var finalDF = spark_session.createDataFrame(d, schema) finalDF.show(10, false) finalDF.write.mode("overwrite").json("test/df.json")
错误信息摘要:
ExitCodeException exitCode=-1073741515: at org.apache.hadoop.util.Shell.runCommand(Shell.java:575)
...
WARN FileUtil: Failed to delete file or dir [C:\Users\jsolano\IdeaProjects\Test2\test\df.json_temporary\0_temporary\attempt_20180516170948_0005_m_000000_0.part-00000-ff4d215c-00f2-4585-89bb-d53426315539-c000.json.crc]: it still exists.
ERROR FileFormatWriter: Job job_20180516170948_0005 aborted.
内容的提问来源于stack exchange,提问作者Jimmy Solano

