2016-03-03 11 views
7

Sono attualmente in esecuzione una scintilla applicazione Java in Tomcat e ricevendo la seguente eccezione:Spark saveAsTextFile() si traduce in mkdirs non è riuscito a creare per la metà della directory

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

sulla linea

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

Il problema è che/opt/folder/tmp/esiste già e crea con successo fino a /opt/folder/tmp/file.json/_temporary/0/ e quindi viene eseguito in quello che sembra un problema di autorizzazione con il resto parte del percorso _temporary/attempt_201603031703_0001_m_000000_5 stesso, ma ho dato le autorizzazioni utente tomcat (chown -R tomcat:tomcat tmp/ e chmod -R 755 tmp/) alla directory tmp /. Qualcuno sa cosa potrebbe accadere?

Grazie

Modifica per @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 . 

L'eccezione in 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

puoi pubblicare come si invia la domanda? quale maestro? e usi la speculazione per caso? –

risposta

2

suggerisco di provare a cambiare a 777 temporanea. Vedi se funziona a quel punto. Ci sono stati errori di bug/problemi sul file system locale. Se ciò non funziona, fateci sapere se qualcosa è cambiato o esattamente lo stesso risultato.

+0

Ho provato che anche prima del 755 il risultato è lo stesso, purtroppo. – DeeVu

+0

per favore mostraci l'output di 'ls -lrta/opt/folder/tmp/file.json/_temporary/0/_temporary' – javadba

+0

Ci scusiamo per il ritardo. Aggiunto l'aggiornamento. Questo è quanto lontano. Non può mkdir oltre '0 /' sembrerebbe – DeeVu

1

Potrebbe essere selinux/apparmor che ti fa un trucco? Verificare con ls -Z e registri di sistema.

8

saveAsTextFile viene elaborato dagli esecutori Spark. A seconda della configurazione di Spark, gli executors di Spark possono essere eseguiti come diverso utente rispetto al driver dell'applicazione Spark. Immagino che il driver dell'applicazione spark preparhi bene la directory per il lavoro, ma poi gli executors che girano come un utente diverso non hanno i diritti per scrivere in quella directory.

Cambiare in 777 non sarà d'aiuto, perché le autorizzazioni non sono ereditate dalle cartelle figlio, quindi otterresti comunque 755.

Prova a eseguire l'applicazione Spark come lo stesso utente che esegue Spark.

+0

La risposta più probabile. Ho appena impostato la mia applicazione per utilizzare HDFS/S3 come soluzione. Non ho avuto problemi con i permessi, se ho la possibilità di tornare indietro e confermare questo. – DeeVu

+0

come si eseguono gli spark executor con lo stesso utente? – thebeancounter

0

Quindi, ho riscontrato lo stesso problema, con il mio setup non ci sono HDFS e Spark è in esecuzione in modalità stand-alone. Non sono stato in grado di salvare i datafram spark in una condivisione NFS utilizzando i metodi nativi di Spark. Il processo viene eseguito come utente locale e cerco di scrivere nella cartella principale dell'utente. Anche quando si crea una sottocartella con 777 non riesco a scrivere nella cartella.

Per ovviare al problema, convertire il dataframe con toPandas() e successivamente to_csv(). Questo funziona magicamente.

Problemi correlati