L'écriture de fichiers sur le système local avec une Étincelle dans le mode Cluster
Je sais que c'est une drôle de façon de l'utilisation de Spark, mais je vais essayer d'enregistrer un dataframe pour le système de fichiers local (pas hdfs) à l'aide de l'Étincelle même si je suis dans cluster mode
. Je sais que je peux utiliser client mode
mais je ne souhaitez exécuter dans cluster mode
et ne se soucient pas qui nœud (sur 3) de l'application va s'exécuter sur le conducteur.
Le code ci-dessous est le pseudo-code de ce que je suis en train de faire.
//create dataframe
val df = Seq(Foo("John", "Doe"), Foo("Jane", "Doe")).toDF()
//save it to the local file system using 'file://' because it defaults to hdfs://
df.coalesce(1).rdd.saveAsTextFile(s"file://path/to/file")
Et c'est de cette façon que je vous soumets l'étincelle de l'application.
spark-submit --class sample.HBaseSparkRSample --master yarn-cluster hbase-spark-r-sample-assembly-1.0.jar
Cela fonctionne bien si je suis dans local mode
mais ne pas en yarn-cluster mode
.
Par exemple, java.io.IOException: Mkdirs failed to create file
se produit avec le code ci-dessus.
J'ai changé le df.coalesce(1)
partie de df.collect
et a tenté d'enregistrer un fichier à l'aide de la plaine de la Scala, mais il a fini avec un Permission denied
.
J'ai aussi essayé:
spark-submit
avecroot
utilisateurchown
edyarn:yarn
,yarn:hadoop
,spark:spark
- a donné
chmod 777
de répertoires liés à
mais pas de chance.
Je suppose que cela a à voir quelque chose avec clusters
, drivers and executors
, et la user
qui essaie d'écrire pour le système de fichiers local, mais je suis un peu coincé dans la résolution de ce problème par moi-même.
Je suis en utilisant:
- Étincelle: 1.6.0-cdh5.8.2
- Scala: 2.10.5
- Hadoop: 2.6.0-cdh5.8.2
Tout soutien est le bienvenu et merci d'avance.
Certains des articles que j'ai essayé:
- "Étincelle saveAsTextFile() résultats dans Mkdirs n'a pas pu créer de la moitié du répertoire" -> Essayé de changer les utilisateurs, mais rien n'a changé
- "Impossible d'enregistrer le CA en tant que fichier texte de système de fichiers local" ->
chmod
ne m'a pas aidé
Édité (2016/11/25)
C'est l'Exception-je obtenir.
java.io.IOException: Mkdirs failed to create file:/home/foo/work/rhbase/r/input/input.csv/_temporary/0/_temporary/attempt_201611242024_0000_m_000000_0 (exists=false, cwd=file:/yarn/nm/usercache/foo/appcache/application_1478068613528_0143/container_e87_1478068613528_0143_01_000001)
at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:449)
at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:435)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:920)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:813)
at org.apache.hadoop.mapred.TextOutputFormat.getRecordWriter(TextOutputFormat.java:135)
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:214)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
16/11/24 20:24:12 WARN scheduler.TaskSetManager: Lost task 0.0 in stage 0.0 (TID 0, localhost): java.io.IOException: Mkdirs failed to create file:/home/foo/work/rhbase/r/input/input.csv/_temporary/0/_temporary/attempt_201611242024_0000_m_000000_0 (exists=false, cwd=file:/yarn/nm/usercache/foo/appcache/application_1478068613528_0143/container_e87_1478068613528_0143_01_000001)
at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:449)
at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:435)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:920)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:813)
at org.apache.hadoop.mapred.TextOutputFormat.getRecordWriter(TextOutputFormat.java:135)
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:214)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
OriginalL'auteur tkrhgch | 2016-11-24
Vous devez vous connecter pour publier un commentaire.
Je vais répondre à ma propre question parce que finalement, aucune des réponses ne semblent pas à résoudre mon problème. Néanmoins, merci pour toutes ces réponses et de m'indiquer des solutions de rechange que je puisse vérifier.
Je pense que @Ricardo était le plus proche, en mentionnant l'utilisateur de la bougie d'application. J'ai vérifié
whoami
avecProcess("whoami")
et l'utilisateur a étéyarn
. Le problème est probablement que j'ai essayé de sortie de/home/foo/work/rhbase/r/input/input.csv
et bien que/home/foo/work/rhbase
a été possédé paryarn:yarn
,/home/foo
a été possédé parfoo:foo
. Je n'ai pas vérifié dans le détail, mais cela peut avoir été la cause de cettepermission
problème.Quand j'ai frappé
pwd
dans mon application Spark avecProcess("pwd")
, la sortie de/yarn/path/to/somewhere
. J'ai donc décidé de sortie de mon fichier/yarn/input.csv
et il a réussi, malgré decluster mode
.Je peut probablement conclure que c'était un simple problème d'autorisation. Toute autre solution serait la bienvenue, mais pour le moment, c'était la façon de comment j'ai résolu cette question.
OriginalL'auteur tkrhgch
Utilisation forEachPartition méthode, puis pour chaque partition de système de fichiers de l'objet et d'en écrire un par un enregistrement à elle, est ci-dessous l'exemple de code ici, je suis en train d'écrire à hdfs, au lieu de cela, vous pouvez utiliser le système de fichiers local ainsi
OriginalL'auteur SanthoshPrasad
Si vous exécutez le travail que
yarn-cluster mode
, le conducteur sera en cours d'exécution dans toute la machine qui est géré par le FIL, donc sisaveAsTextFile
a chemin de fichier local, puis il va stocker le résultat de la machine où le pilote est en cours d'exécution.Essayez d'exécuter le travail comme
yarn-client mode
de sorte que le pilote s'exécute dans la machine clientyarn-cluster mode
. J'ai 3 nœuds et je n'aime pas le nœud le pilote sera en.mais quel que soit le nœud pilote est en cours d'exécution, il n'y a que le fichier sera créé 🙂
pourquoi ne pouvez-vous pas stocker les données dans hdfs chemin? vous pouvez exécuter en tant que fil-mode cluster
le problème est que
saveAsTextFile
jette unpermission denied
exception et le pilote nœud ne parvient pas à écrire sur le système de fichiers local. Et j'ai unshell script
qui ne peut que lire le système de fichiers local. C'est pourquoi je ne peux pas utiliser hdfs... En plus, je ne peux modifier le script. Je sais que c'est une drôle de façon de l'utilisation de Spark.Pouvez-vous envoyer le log complet sur erreur permission denied
OriginalL'auteur Nirmal Ram
Veuillez vous référer à l'étincelle de la documentation pour comprendre l'utilisation de
--master
option dansspark-submit
.--master local
est censé être utilisé lors de l'exécution à l'échelle locale.--master yarn --deploy-mode cluster
est censé être utilisés lorsqu'ils sont effectivement en cours d'exécution sur un fil de cluster.Reportez-vous cette et cette.
yarn-cluster
paramètre. Je vais modifier ma question, mais je ne veux exécuter en mode cluster, mais souhaitez enregistrer dans le système de fichiers local, même si je ne sais pas qui nœud, il va être.OriginalL'auteur akaHuman
Vérifier si vous essayez d'exécuter/écrire le fichier avec un utilisateur autre que l'Étincelle de service.
Sur cette situation, vous pouvez résoudre le problème de permission d'en préréglant le répertoire des Acl. Exemple:
(modifier "l'étincelle" pour votre groupe d'utilisateurs d'essayer d'écrire le fichier)
OriginalL'auteur Ricardo