Spark 在尝试保存 CSV 文件时抛出错误

Posted

技术标签:

【中文标题】Spark 在尝试保存 CSV 文件时抛出错误【英文标题】:Spark throws error when trying to save a CSV file 【发布时间】:2020-07-13 15:10:37 【问题描述】:

社区向导,

我真的很沮丧。谈到 Spark、Hadoop 等,似乎没有什么是直截了当的。

在过去的几个小时里,我试图找到以下问题的解决方案:

ERROR Executor: Exception in task 0.0 in stage 13.0 (TID 823)
java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.createFileWithMode0(Ljava/lang/String;JJJI)Ljava/io/FileDescriptor;

版本

    操作系统:Windows 10 Spark 版本:2.4.6 Scala 版本:2.11.12 Hadoop 版本:2.7.1 Java 版本:1.8.0_202(64 位)

变量

    SPARK_HOME:C:\Spark HADOOP_HOME: C:\Hadoop\hadoop-2.7.1 SCALA_HOME:C:\Program Files (x86)\scala JRE_HOME:C:\Program Files\Java\jre1.8.0_202 JAVA_HOME: C:\Program Files\Java\jdk1.8.0_202

路径

    %SPARK_HOME%\bin %HADOOP_HOME%\bin %SCALA_HOME%\bin %JRE_HOME%\bin %JAVA_HOME%\bin

引发错误的命令是:

df.coalesce(1).write.format("csv").save("result")

文件夹(结果)似乎已创建,但它是空的。

我真的不知道如何解决这个问题。

热烈欢迎任何帮助。

【问题讨论】:

以下帖子可能对您有所帮助,***.com/questions/50344874/… 【参考方案1】:

我相信您的 HADOOP_HOME=C:\Hadoop\hadoop-2.7.1 指向 Hadoop 二进制文件/库,相反,您应该需要一个名为 WINUTILS.EXE 的工具才能在 Windows 中工作。

您可以从 git 下载 Hadoop 版本的 winutils 并将 HADOOP_HOME 映射到 Winutils 的根目录。 https://github.com/steveloughran/winutils

来源:

来自 Hadoop 的 Confluence: Hadoop 需要 Windows 上的本地库才能正常工作——包括访问 file:// 文件系统,其中 Hadoop 使用一些 Windows API 来实现类似 posix 的文件访问权限

https://cwiki.apache.org/confluence/display/HADOOP2/WindowsProblems

【讨论】:

我已经在C:\Hadoop\hadoop-2.7.1\bin 中拥有了winutils.exe。我拿了这个bin 文件夹并将其替换为我已经拥有的文件夹,并且它有效。似乎winutils.exe 不是真正的问题,但其他一些事情肯定是。感谢您的回答!【参考方案2】:

您似乎没有在HADOOP_HOME 目录中安装适用于Windows 的Hadoop binaries。 也可能是缺少它们的依赖项(例如 Visual C++ Runtime)。

您可能还需要直接加载共享库,这取决于您启动 Spark 应用程序的方式。

System.load(System.getenv("HADOOP_HOME") + "/lib/hadoop.ddl");

【讨论】:

以上是关于Spark 在尝试保存 CSV 文件时抛出错误的主要内容,如果未能解决你的问题,请参考以下文章

0xC0000005 读取二进制文件时抛出异常(C++)

Spark Shell 导入正常,但在引用类时抛出错误

在 Spark 中使用 partitionBy 保存 CSV 文件 [重复]

如何读取 CSV 文件,然后在 Spark Scala 中将其保存为 JSON?

如何在 Spark 中写入 CSV

尝试在 DBFS 上将 Spark Dataframe 以 CSV 格式保存到磁盘