Spark saveAsTextFile() Ergebnisse in Mkdirs Fehler beim erstellen der Hälfte der directory
Ich bin derzeit ein Java-Spark-Anwendung in tomcat ein und erhalten die folgende Ausnahme:
Caused by: java.io.IOException: Mkdirs failed to create file:/opt/folder/tmp/file.json/_temporary/0/_temporary/attempt_201603031703_0001_m_000000_5
auf der Linie
text.saveAsTextFile("/opt/folder/tmp/file.json") //where text is a JavaRDD<String>
Das Problem ist, dass /opt/Ordner/tmp/schon existiert und erfolgreich schafft bis zu /opt/Ordner/tmp/Datei.json/_temporary/0/und dann läuft es in das, was aussieht wie ein Berechtigungsproblem mit dem restlichen Teil des Pfades _temporary/attempt_201603031703_0001_m_000000_5
sich, aber ich gab den tomcat-Benutzer die Berechtigungen (chown -R tomcat:tomcat tmp/
und chmod -R 755 tmp/
), um den tmp/- Verzeichnis. Weiß jemand, was könnte passiert sein?
Dank
Edit für @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 .
Ausnahme in catalina.aus
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
- können Sie nach, wie Sie Ihre Anwendung Einreichen? was Meister? und nutzen Sie der Spekulation keine chance?
Du musst angemeldet sein, um einen Kommentar abzugeben.
saveAsTextFile
ist wirklich verarbeitet Spark-Vollzieher. Je nach Funke setup, Spark Vollzieher ausgeführt werden kann, als ein verschiedene Benutzer als Ihre Spark-application-Treiber. Ich denke das spark-application-Treiber legt das Verzeichnis für die job gut, aber dann hat der Testamentsvollstrecker die Ausführung als anderen Benutzer haben keine Rechte zum schreiben in diesem Verzeichnis.Ändern auf 777 hilft nichts, weil die Berechtigungen nicht vererbt Kind dirs, so dass Sie bekommen würde, 755 sowieso.
Versuchen Sie, Ihr Funke-Anwendung als derselbe Benutzer, der läuft deine Funke.
Ich schlage vor, zu versuchen
777
vorübergehend . Sehen, ob es funktioniert an dieser Stelle. Es wurden Fehler/Probleme wrt Berechtigungen auf dem lokalen Dateisystem. Wenn das immer noch nicht funktioniert, lassen Sie es uns wissen, wenn etwas geändert oder genau das gleiche Ergebnis.ls -lrta /opt/folder/tmp/file.json/_temporary/0/_temporary
0/
es scheintKönnte es sein
selinux/apparmor
spielt Ihnen einen Streich? Überprüfen Sie mitls -Z
- und system-logs.So, ich habe das gleiche Problem Auftritt, mit meinem setup gibt es keine HDFS und Spark läuft im stand-alone-Modus. Ich habe nicht in der Lage zu speichern Funke dataframes, um eine NFS-Freigabe über den nativen Spark-Methoden. Der Prozess läuft als lokaler Benutzer an, und ich versuche zu schreiben, um die Benutzer home-Ordner. Auch beim erstellen einen Unterordner mit 777 kann ich nicht schreiben zu dem Ordner.
Den workaround für das umwandeln der dataframe mit
toPandas()
und nach, dassto_csv()
. Dieser magisch zu arbeiten.Ich habe auch das gleiche problem Und das Problem wurde gelöst, indem mit voller hdfs Weg.
Fehler
Lösung=:- volle hdfs-Pfad mit hdfs://localhost:54310/
Ich habe das gleiche Problem wie Ihr.
Ich wollte auch nicht zu schreiben auf hdfs, sondern zu einem lokalen Speicher teilen.
Nach einigen Forschung, fand ich, dass in meinem Fall der Grund ist: gibt es mehrere Knoten ausführen, aber einige der Knoten hat keinen Zugriff auf das Verzeichnis, wo Sie wollen, schreiben Sie Ihre Daten.
Also die Lösung ist, das Verzeichnis für alle Knoten verfügbar, und dann klappt es~
dies ist tricky, aber einfach zu lösen. Muss man konfigurieren-job.local.dir-variable zeigt auf working directory. Folgender code funktioniert mit dem schreiben von CSV-Datei: