2016-03-03 9 views
7

Ja obecnie pracuje Java Spark aplikacji w Tomcat i odbieranie następujący wyjątek:Spark saveAsTextFile() powoduje Mkdirs udało się stworzyć dla połowie katalogu

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

na linii

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

Problem polega na tym, że/opt/folder/tmp/już istnieje i pomyślnie tworzy do /opt/folder/tmp/file.json/_temporary/0/, a następnie uruchamia się coś, co wygląda jak problem z uprawnieniami część ścieżki _temporary/attempt_201603031703_0001_m_000000_5 sam, ale dałem uprawnienia użytkownika tomcat (chown -R tomcat:tomcat tmp/ i chmod -R 755 tmp/) do katalogu tmp /. Czy ktoś wie, co może się dziać?

Dzięki

Edycja dla @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 . 

Wyjątkiem w 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

Czy możesz napisać, jak przesłać wniosek? co mistrz? i czy używasz spekulacji przez przypadek? –

Odpowiedz

2

Proponuję spróbować zmienić 777 tymczasowo. Sprawdź, czy działa w tym momencie. Wystąpiły błędy/problemy dotyczące uprawnień do lokalnego systemu plików. Jeśli to nadal nie działa, daj nam znać, czy coś się zmieniło, czy dokładnie taki sam wynik.

+0

Próbowałem, że również przed 755 wynik jest taki sam niestety. – DeeVu

+0

proszę pokazać nam wyjście 'ls-lrta/opt/folder/tmp/file.json/_temporary/0/_temporary' – javadba

+0

Przepraszamy za opóźnienie. Dodano aktualizację. To tak daleko, jak to możliwe. Nie może mkdir minąć '0 /' wydawałoby się, że najprawdopodobniej odpowiedź brzmi: – DeeVu

1

Czy to może być selinux/apparmor, który odtworzy ci sztuczkę? Sprawdź z ls -Z i logami systemowymi.

8

saveAsTextFile jest rzeczywiście przetwarzane przez executorów Spark. W zależności od konfiguracji Sparka, executory Spark mogą działać jako inny użytkownik niż twój sterownik aplikacji Spark. Domyślam się, że sterownik aplikacji iskry przygotowuje katalog dla zadania dobrze, ale wtedy executory działające jako inny użytkownik nie mają uprawnień do zapisu w tym katalogu.

Zmiana na 777 nie pomoże, ponieważ uprawnienia nie są dziedziczone przez katalogi potomne, więc i tak otrzymasz 755.

Spróbuj uruchomić aplikację Spark jako ten sam użytkownik, który uruchamia Spark.

+0

. Właśnie skonfigurowałem swoją aplikację, aby używać HDFS/S3 jako obejścia. Nie napotkali problemów z uprawnieniami, jeśli otrzymam szansę na Ill backtrack i potwierdzam to. – DeeVu

+0

w jaki sposób uruchamiasz executory iskier pod tym samym użytkownikiem? – thebeancounter

0

Wystąpił ten sam problem, ponieważ w moim setupie nie ma HDFS, a Spark działa w trybie autonomicznym. Nie byłem w stanie uratować iskiernych ramek danych do udziału NFS przy użyciu rodzimych metod Sparka. Proces działa jako użytkownik lokalny i staram się pisać do folderu domowego użytkownika. Nawet podczas tworzenia podfolderu z 777 nie mogę pisać do folderu.

Sposób obejścia tego problemu polega na przekonwertowaniu ramki danych na toPandas(), a następnie na . To działa w magiczny sposób.

Powiązane problemy