有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Spark saveAsTextFile()导致为一半目录创建Mkdirs失败

我目前正在tomcat中运行Java Spark应用程序,并收到以下异常:

Caused by: java.io.IOException: Mkdirs failed to create file:/opt/folder/tmp/file.json/_temporary/0/_temporary/attempt_201603031703_0001_m_000000_5

在线

text.saveAsTextFile("/opt/folder/tmp/file.json") //where text is a JavaRDD<String>

问题是/opt/folder/tmp/已经存在,并且成功创建了多达/opt/folder/tmp/文件。json/_temporary/0/然后它在路径_temporary/attempt_201603031703_0001_m_000000_5本身的剩余部分遇到了权限问题,但是我给了tomcat用户对tmp/目录的权限(chown -R tomcat:tomcat tmp/chmod -R 755 tmp/)。有人知道会发生什么吗

谢谢

为@javadba编辑:

[root@ip tmp]# ls -lrta 
total 12
drwxr-xr-x 4 tomcat tomcat 4096 Mar  3 16:44 ..
drwxr-xr-x 3 tomcat tomcat 4096 Mar  7 20:01 file.json
drwxrwxrwx 3 tomcat tomcat 4096 Mar  7 20:01 .

[root@ip tmp]# cd file.json/
[root@ip file.json]# ls -lrta 
total 12
drwxr-xr-x 3 tomcat tomcat 4096 Mar  7 20:01 _temporary
drwxrwxrwx 3 tomcat tomcat 4096 Mar  7 20:01 ..
drwxr-xr-x 3 tomcat tomcat 4096 Mar  7 20:01 .

[root@ip file.json]# cd _temporary/
[root@ip _temporary]# ls -lrta 
total 12
drwxr-xr-x 2 tomcat tomcat 4096 Mar  7 20:01 0
drwxr-xr-x 3 tomcat tomcat 4096 Mar  7 20:01 ..
drwxr-xr-x 3 tomcat tomcat 4096 Mar  7 20:01 .

[root@ip _temporary]# cd 0/
[root@ip 0]# ls -lrta 
total 8
drwxr-xr-x 3 tomcat tomcat 4096 Mar  7 20:01 ..
drwxr-xr-x 2 tomcat tomcat 4096 Mar  7 20:01 .

卡塔利纳的例外。出去

Caused by: java.io.IOException: Mkdirs failed to create file:/opt/folder/tmp/file.json/_temporary/0/_temporary/attempt_201603072001_0001_m_000000_5
    at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:438)
    at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:424)
    at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:906)
    at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:799)
    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$1$$anonfun$13.apply(PairRDDFunctions.scala:1193)
    at org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsHadoopDataset$1$$anonfun$13.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:213)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    ... 1 more

共 (6) 个答案

  1. # 1 楼答案

    我也遇到了同样的问题,通过使用完整的HDFS路径,我的问题得到了解决:

    错误

    Caused by: java.io.IOException: Mkdirs failed to create file:/QA/Gajendra/SparkAutomation/Source/_temporary/0/_temporary/attempt_20180616221100_0002_m_000000_0 (exists=false, cwd=file:/home/gajendra/LiClipse Workspace/SpakAggAutomation)

    解决方案

    使用带有hdfs://localhost:54310/<filePath>的完整HDFS路径

    hdfs://localhost:54310/QA/Gajendra/SparkAutomation

  2. # 2 楼答案

    我建议暂时改成777。看看在那一点上是否有效。本地文件系统上的wrt权限存在错误/问题。如果仍然不起作用,请让我们知道是否有任何变化或结果完全相同

  3. # 3 楼答案

    所以,我也遇到了同样的问题,我的设置没有HDFS,Spark在独立模式下运行。我无法使用本机spark方法将spark数据帧保存到NFS共享。该进程以本地用户的身份运行,我尝试写入用户的主文件夹。即使使用777创建子文件夹,我也无法写入该文件夹

    解决方法是使用toPandas()和之后的to_csv()转换数据帧。这神奇地起作用了

  4. # 4 楼答案

    我和你有同样的问题

    我也不想写hdfs,而是想写本地内存共享

    经过一些研究,我发现对于我的案例来说,原因是:有几个节点正在执行,但是,一些节点无法访问您想要写入数据的目录

    因此,解决方案是让目录对所有节点都可用,然后它就可以工作了~

  5. # 5 楼答案

    saveAsTextFile实际上是由Spark执行器处理的。根据您的Spark设置,Spark executors可能以与Spark应用程序驱动程序不同的用户运行。我猜spark应用程序驱动程序会很好地为作业准备目录,但是作为不同用户运行的执行者没有在该目录中写入的权限

    更改为777不会有帮助,因为权限不是由子目录继承的,所以无论如何都会得到755

    尝试以运行Spark的用户的身份运行Spark应用程序

  6. # 6 楼答案

    selinux/apparmor在耍你吗?查看ls -Z和系统日志