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
# 1 楼答案
我也遇到了同样的问题,通过使用完整的HDFS路径,我的问题得到了解决:
错误
解决方案
使用带有
hdfs://localhost:54310/<filePath>
的完整HDFS路径# 2 楼答案
我建议暂时改成
777
。看看在那一点上是否有效。本地文件系统上的wrt权限存在错误/问题。如果仍然不起作用,请让我们知道是否有任何变化或结果完全相同# 3 楼答案
所以,我也遇到了同样的问题,我的设置没有HDFS,Spark在独立模式下运行。我无法使用本机spark方法将spark数据帧保存到NFS共享。该进程以本地用户的身份运行,我尝试写入用户的主文件夹。即使使用777创建子文件夹,我也无法写入该文件夹
解决方法是使用
toPandas()
和之后的to_csv()
转换数据帧。这神奇地起作用了# 4 楼答案
我和你有同样的问题
我也不想写hdfs,而是想写本地内存共享
经过一些研究,我发现对于我的案例来说,原因是:有几个节点正在执行,但是,一些节点无法访问您想要写入数据的目录
因此,解决方案是让目录对所有节点都可用,然后它就可以工作了~
# 5 楼答案
saveAsTextFile
实际上是由Spark执行器处理的。根据您的Spark设置,Spark executors可能以与Spark应用程序驱动程序不同的用户运行。我猜spark应用程序驱动程序会很好地为作业准备目录,但是作为不同用户运行的执行者没有在该目录中写入的权限更改为777不会有帮助,因为权限不是由子目录继承的,所以无论如何都会得到755
尝试以运行Spark的用户的身份运行Spark应用程序
# 6 楼答案
是
selinux/apparmor
在耍你吗?查看ls -Z
和系统日志