Spark CSV IOException Mkdirs 无法创建文件
Spark CSV IOException Mkdirs failed to create file
TL;DR
Spark 1.6.1 无法在没有 HDFS 的独立集群上使用 Spark CSV 1.4 写入 CSV 文件,IOException Mkdirs 无法创建文件
更多详情:
我正在使用本地文件系统在独立集群上开发 Spark 1.6.1 应用程序 运行(我 运行 所在的机器甚至没有 HDFS ) 与斯卡拉。我有这个数据框,我正在尝试使用 HiveContext 将其另存为 CSV 文件。
这就是我运行:
exportData.write
.mode(SaveMode.Overwrite)
.format("com.databricks.spark.csv")
.option("delimiter", ",")
.save("/some/path/here") // no hdfs:/ or file:/ prefix in the path
我使用的 Spark CSV 是 1.4。
当 运行 此代码时,我得到以下异常:
WARN TaskSetManager:70 - Lost task 4.3 in stage 10.0: java.io.IOException: Mkdirs failed to create file: /some/path/here/_temporary/0
完整的堆栈跟踪是:
at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:442)
at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:428)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:908)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:801)
at org.apache.hadoop.mapred.TextOutputFormat.getRecordWriter(TextOutputFormat.java:123)
at org.apache.spark.SparkHadoopWriter.open(SparkHadoopWriter.scala:91)
at org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsHadoopDataset$$anonfun.apply(PairRDDFunctions.scala:1193)
at org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsHadoopDataset$$anonfun.apply(PairRDDFunctions.scala:1185)
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66)
at org.apache.spark.scheduler.Task.run(Task.scala:89)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
确实创建了输出目录,但它是空的。
我尝试 运行 它使用 spark shell,我所做的是创建一个虚拟数据框,然后使用完全相同的代码保存它(也保存到相同的路径)。成功了。
我检查了我正在写入的文件夹的权限并将其更改为 777 但基本上当 运行 Spark 作业
时它仍然不起作用
谷歌搜索建议:
- 通过删除我没有的 hdfs:/ 来更改文件前缀。我还尝试添加 file:/, file://, file:/// 前缀,但没有成功
- 权限问题 - 我尝试通过将文件夹设置为 777
来解决这个问题
- 一些 MacBook 问题可能与我无关,因为我正在处理 Ubuntu
- 安全问题 - 检查我的堆栈跟踪,我找不到任何安全故障。
- 删除文件路径开头的 / 前缀 - 我也试过了,但没有成功
- 关于此问题的其他未解答的问题
有没有人知道问题到底是什么?以及如何克服它?
提前致谢
好的,我找到了问题,希望这对其他人有帮助
显然我 运行 所在的机器上安装了 hadoop。当我 运行 hadoop version
它输出: Hadoop 2.6.0-cdh5.7.1 这与我的 Spark 版本冲突
此外,我不太确定它是否相关,但我是 运行 来自 root 而不是 Spark 用户的 spark,这可能导致了一些权限问题
将 hadoop 版本与我们的 spark 匹配后(在我们的例子中,我们将 Spark 匹配为 cloudera 的 Spark)和 运行 作为 Spark 用户的代码,此故障停止发生
TL;DR
Spark 1.6.1 无法在没有 HDFS 的独立集群上使用 Spark CSV 1.4 写入 CSV 文件,IOException Mkdirs 无法创建文件
更多详情:
我正在使用本地文件系统在独立集群上开发 Spark 1.6.1 应用程序 运行(我 运行 所在的机器甚至没有 HDFS ) 与斯卡拉。我有这个数据框,我正在尝试使用 HiveContext 将其另存为 CSV 文件。
这就是我运行:
exportData.write
.mode(SaveMode.Overwrite)
.format("com.databricks.spark.csv")
.option("delimiter", ",")
.save("/some/path/here") // no hdfs:/ or file:/ prefix in the path
我使用的 Spark CSV 是 1.4。 当 运行 此代码时,我得到以下异常:
WARN TaskSetManager:70 - Lost task 4.3 in stage 10.0: java.io.IOException: Mkdirs failed to create file: /some/path/here/_temporary/0
完整的堆栈跟踪是:
at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:442)
at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:428)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:908)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:801)
at org.apache.hadoop.mapred.TextOutputFormat.getRecordWriter(TextOutputFormat.java:123)
at org.apache.spark.SparkHadoopWriter.open(SparkHadoopWriter.scala:91)
at org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsHadoopDataset$$anonfun.apply(PairRDDFunctions.scala:1193)
at org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsHadoopDataset$$anonfun.apply(PairRDDFunctions.scala:1185)
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66)
at org.apache.spark.scheduler.Task.run(Task.scala:89)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
确实创建了输出目录,但它是空的。
我尝试 运行 它使用 spark shell,我所做的是创建一个虚拟数据框,然后使用完全相同的代码保存它(也保存到相同的路径)。成功了。
我检查了我正在写入的文件夹的权限并将其更改为 777 但基本上当 运行 Spark 作业
时它仍然不起作用谷歌搜索建议:
- 通过删除我没有的 hdfs:/ 来更改文件前缀。我还尝试添加 file:/, file://, file:/// 前缀,但没有成功
- 权限问题 - 我尝试通过将文件夹设置为 777 来解决这个问题
- 一些 MacBook 问题可能与我无关,因为我正在处理 Ubuntu
- 安全问题 - 检查我的堆栈跟踪,我找不到任何安全故障。
- 删除文件路径开头的 / 前缀 - 我也试过了,但没有成功
- 关于此问题的其他未解答的问题
有没有人知道问题到底是什么?以及如何克服它?
提前致谢
好的,我找到了问题,希望这对其他人有帮助
显然我 运行 所在的机器上安装了 hadoop。当我 运行 hadoop version
它输出: Hadoop 2.6.0-cdh5.7.1 这与我的 Spark 版本冲突
此外,我不太确定它是否相关,但我是 运行 来自 root 而不是 Spark 用户的 spark,这可能导致了一些权限问题
将 hadoop 版本与我们的 spark 匹配后(在我们的例子中,我们将 Spark 匹配为 cloudera 的 Spark)和 运行 作为 Spark 用户的代码,此故障停止发生