2016-03-03 33 views
7

我目前运行在Tomcat的一个Java星火应用程序和接收以下异常的一半:上线星火saveAsTextFile()导致Mkdirs未能创建目录

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/file.json/_temporary/0/,然后运行到看起来像是权限问题部分路径_temporary/attempt_201603031703_0001_m_000000_5本身,但我给tomcat用户权限(chown -R tomcat:tomcat tmp/chmod -R 755 tmp/)到tmp /目录。有谁知道会发生什么?

感谢

编辑为@javadba:

[[email protected] 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 . 

[[email protected] tmp]# cd file.json/ 
[[email protected] 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 . 

[[email protected] file.json]# cd _temporary/ 
[[email protected] _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 . 

[[email protected] _temporary]# cd 0/ 
[[email protected] 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 . 

的例外catalina.out的

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 
+0

你可以发布你如何提交你的应用程序?什么主人?你有没有使用猜测? –

回答

2

我建议尝试更改为777暂时的。看看它在那个时候是否有效。本地文件系统上存在错误/问题权限。如果这仍然不起作用,让我们知道是否有任何改变或完全相同的结果。

+0

尝试,以及755之前的结果是不幸的。 – DeeVu

+0

请向我们展示'ls -lrta/opt/folder/tmp/file.json/_temporary/0/_temporary的输出' – javadba

+0

对不起。添加了更新。就是这样。它不能通过'0 /'mkdir看起来似乎是 – DeeVu

1

难道是selinux/apparmor玩弄你一个把戏吗?请使用ls -Z和系统日志进行检查。

8

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

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

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

+0

最可能的回应。我只是将我的应用程序设置为使用HDFS/S3作为解决方法。没有遇到权限问题,如果我有机会回溯并确认这一点。 – DeeVu

+0

你如何在同一用户下运行火花执行器? – thebeancounter

0

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

解决方法是将数据框转换为toPandas(),然后to_csv()。这神奇的作品。

相关问题