je viens de configurer un cluster AWS EMR (version 5.18 d'EMR avec Spark 2.3.2). Je ssh dans le maître maschine et lance Spark-Shell ou pyspark et obtenir l'erreur suivante:
$ spark-Shell
log4j:ERROR setFile(null,true) call failed.
Java.io.FileNotFoundException: /stderr (Permission denied)
at Java.io.FileOutputStream.open0(Native Method)
at Java.io.FileOutputStream.open(FileOutputStream.Java:270)
at Java.io.FileOutputStream.<init>(FileOutputStream.Java:213)
at Java.io.FileOutputStream.<init>(FileOutputStream.Java:133)
at org.Apache.log4j.FileAppender.setFile(FileAppender.Java:294)
at org.Apache.log4j.FileAppender.activateOptions(FileAppender.Java:165)
at org.Apache.log4j.DailyRollingFileAppender.activateOptions(DailyRollingFileAppender.Java:223)
at org.Apache.log4j.config.PropertySetter.activate(PropertySetter.Java:307)
at org.Apache.log4j.config.PropertySetter.setProperties(PropertySetter.Java:172)
at org.Apache.log4j.config.PropertySetter.setProperties(PropertySetter.Java:104)
at org.Apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.Java:842)
at org.Apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.Java:768)
at org.Apache.log4j.PropertyConfigurator.parseCatsAndRenderers(PropertyConfigurator.Java:672)
at org.Apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.Java:516)
at org.Apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.Java:580)
at org.Apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.Java:526)
at org.Apache.log4j.LogManager.<clinit>(LogManager.Java:127)
at org.Apache.spark.internal.Logging$class.initializeLogging(Logging.scala:120)
at org.Apache.spark.internal.Logging$class.initializeLogIfNecessary(Logging.scala:108)
at org.Apache.spark.deploy.SparkSubmit$.initializeLogIfNecessary(SparkSubmit.scala:71)
at org.Apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:128)
at org.Apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
log4j:ERROR Either File or DatePattern options are not set for appender [DRFA-stderr].
log4j:ERROR setFile(null,true) call failed.
Java.io.FileNotFoundException: /stdout (Permission denied)
at Java.io.FileOutputStream.open0(Native Method)
at Java.io.FileOutputStream.open(FileOutputStream.Java:270)
at Java.io.FileOutputStream.<init>(FileOutputStream.Java:213)
at Java.io.FileOutputStream.<init>(FileOutputStream.Java:133)
at org.Apache.log4j.FileAppender.setFile(FileAppender.Java:294)
at org.Apache.log4j.FileAppender.activateOptions(FileAppender.Java:165)
at org.Apache.log4j.DailyRollingFileAppender.activateOptions(DailyRollingFileAppender.Java:223)
at org.Apache.log4j.config.PropertySetter.activate(PropertySetter.Java:307)
at org.Apache.log4j.config.PropertySetter.setProperties(PropertySetter.Java:172)
at org.Apache.log4j.config.PropertySetter.setProperties(PropertySetter.Java:104)
at org.Apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.Java:842)
at org.Apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.Java:768)
at org.Apache.log4j.PropertyConfigurator.parseCatsAndRenderers(PropertyConfigurator.Java:672)
at org.Apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.Java:516)
at org.Apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.Java:580)
at org.Apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.Java:526)
at org.Apache.log4j.LogManager.<clinit>(LogManager.Java:127)
at org.Apache.spark.internal.Logging$class.initializeLogging(Logging.scala:120)
at org.Apache.spark.internal.Logging$class.initializeLogIfNecessary(Logging.scala:108)
at org.Apache.spark.deploy.SparkSubmit$.initializeLogIfNecessary(SparkSubmit.scala:71)
at org.Apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:128)
at org.Apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
log4j:ERROR Either File or DatePattern options are not set for appender [DRFA-stdout].
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
18/11/04 12:24:32 ERROR SparkContext: Error initializing SparkContext.
Java.lang.IllegalArgumentException: Required executor memory (4608+460 MB) is above the max threshold (3072 MB) of this cluster! Please check the values of 'yarn.scheduler.maximum-allocation-mb' and/or 'yarn.nodemanager.resource.memory-mb'.
at org.Apache.spark.deploy.yarn.Client.verifyClusterResources(Client.scala:318)
at org.Apache.spark.deploy.yarn.Client.submitApplication(Client.scala:166)
at org.Apache.spark.scheduler.cluster.YarnClientSchedulerBackend.start(YarnClientSchedulerBackend.scala:57)
at org.Apache.spark.scheduler.TaskSchedulerImpl.start(TaskSchedulerImpl.scala:164)
at org.Apache.spark.SparkContext.<init>(SparkContext.scala:500)
at org.Apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2493)
at org.Apache.spark.sql.SparkSession$Builder$$anonfun$7.apply(SparkSession.scala:934)
at org.Apache.spark.sql.SparkSession$Builder$$anonfun$7.apply(SparkSession.scala:925)
at scala.Option.getOrElse(Option.scala:121)
at org.Apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:925)
at org.Apache.spark.repl.Main$.createSparkSession(Main.scala:103)
at $line3.$read$$iw$$iw.<init>(<console>:15)
at $line3.$read$$iw.<init>(<console>:43)
at $line3.$read.<init>(<console>:45)
at $line3.$read$.<init>(<console>:49)
at $line3.$read$.<clinit>(<console>)
at $line3.$eval$.$print$lzycompute(<console>:7)
at $line3.$eval$.$print(<console>:6)
at $line3.$eval.$print(<console>)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.lang.reflect.Method.invoke(Method.Java:498)
at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:786)
at scala.tools.nsc.interpreter.IMain$Request.loadAndRun(IMain.scala:1047)
at scala.tools.nsc.interpreter.IMain$WrappedRequest$$anonfun$loadAndRunReq$1.apply(IMain.scala:638)
at scala.tools.nsc.interpreter.IMain$WrappedRequest$$anonfun$loadAndRunReq$1.apply(IMain.scala:637)
at scala.reflect.internal.util.ScalaClassLoader$class.asContext(ScalaClassLoader.scala:31)
at scala.reflect.internal.util.AbstractFileClassLoader.asContext(AbstractFileClassLoader.scala:19)
at scala.tools.nsc.interpreter.IMain$WrappedRequest.loadAndRunReq(IMain.scala:637)
at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:569)
at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:565)
at scala.tools.nsc.interpreter.ILoop.interpretStartingWith(ILoop.scala:807)
at scala.tools.nsc.interpreter.ILoop.command(ILoop.scala:681)
at scala.tools.nsc.interpreter.ILoop.processLine(ILoop.scala:395)
at org.Apache.spark.repl.SparkILoop$$anonfun$initializeSpark$1$$anonfun$apply$mcV$sp$1$$anonfun$apply$mcV$sp$2.apply(SparkILoop.scala:79)
at org.Apache.spark.repl.SparkILoop$$anonfun$initializeSpark$1$$anonfun$apply$mcV$sp$1$$anonfun$apply$mcV$sp$2.apply(SparkILoop.scala:79)
at scala.collection.immutable.List.foreach(List.scala:381)
at org.Apache.spark.repl.SparkILoop$$anonfun$initializeSpark$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(SparkILoop.scala:79)
at org.Apache.spark.repl.SparkILoop$$anonfun$initializeSpark$1$$anonfun$apply$mcV$sp$1.apply(SparkILoop.scala:79)
at org.Apache.spark.repl.SparkILoop$$anonfun$initializeSpark$1$$anonfun$apply$mcV$sp$1.apply(SparkILoop.scala:79)
at scala.tools.nsc.interpreter.ILoop.savingReplayStack(ILoop.scala:91)
at org.Apache.spark.repl.SparkILoop$$anonfun$initializeSpark$1.apply$mcV$sp(SparkILoop.scala:78)
at org.Apache.spark.repl.SparkILoop$$anonfun$initializeSpark$1.apply(SparkILoop.scala:78)
at org.Apache.spark.repl.SparkILoop$$anonfun$initializeSpark$1.apply(SparkILoop.scala:78)
at scala.tools.nsc.interpreter.IMain.beQuietDuring(IMain.scala:214)
at org.Apache.spark.repl.SparkILoop.initializeSpark(SparkILoop.scala:77)
at org.Apache.spark.repl.SparkILoop.loadFiles(SparkILoop.scala:110)
at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply$mcZ$sp(ILoop.scala:920)
at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:909)
at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:909)
at scala.reflect.internal.util.ScalaClassLoader$.savingContextLoader(ScalaClassLoader.scala:97)
at scala.tools.nsc.interpreter.ILoop.process(ILoop.scala:909)
at org.Apache.spark.repl.Main$.doMain(Main.scala:76)
at org.Apache.spark.repl.Main$.main(Main.scala:56)
at org.Apache.spark.repl.Main.main(Main.scala)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.lang.reflect.Method.invoke(Method.Java:498)
at org.Apache.spark.deploy.JavaMainApplication.start(SparkApplication.scala:52)
at org.Apache.spark.deploy.SparkSubmit$.org$Apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:894)
at org.Apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:198)
at org.Apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:228)
at org.Apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:137)
at org.Apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
18/11/04 12:24:33 WARN YarnSchedulerBackend$YarnSchedulerEndpoint: Attempted to request executors before the AM has registered!
18/11/04 12:24:33 WARN MetricsSystem: Stopping a MetricsSystem that is not running
Java.lang.IllegalArgumentException: Required executor memory (4608+460 MB) is above the max threshold (3072 MB) of this cluster! Please check the values of 'yarn.scheduler.maximum-allocation-mb' and/or 'yarn.nodemanager.resource.memory-mb'.
at org.Apache.spark.deploy.yarn.Client.verifyClusterResources(Client.scala:318)
at org.Apache.spark.deploy.yarn.Client.submitApplication(Client.scala:166)
at org.Apache.spark.scheduler.cluster.YarnClientSchedulerBackend.start(YarnClientSchedulerBackend.scala:57)
at org.Apache.spark.scheduler.TaskSchedulerImpl.start(TaskSchedulerImpl.scala:164)
at org.Apache.spark.SparkContext.<init>(SparkContext.scala:500)
at org.Apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2493)
at org.Apache.spark.sql.SparkSession$Builder$$anonfun$7.apply(SparkSession.scala:934)
at org.Apache.spark.sql.SparkSession$Builder$$anonfun$7.apply(SparkSession.scala:925)
at scala.Option.getOrElse(Option.scala:121)
at org.Apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:925)
at org.Apache.spark.repl.Main$.createSparkSession(Main.scala:103)
... 55 elided
<console>:14: error: not found: value spark
import spark.implicits._
^
<console>:14: error: not found: value spark
import spark.sql
^
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.3.2
/_/
Using Scala version 2.11.8 (OpenJDK 64-Bit Server VM, Java 1.8.0_181)
Type in expressions to have them evaluated.
Type :help for more information.
Je suis nouveau chez Spark et chez EMR et je ne sais pas quoi faire. Y at-il une étape de configuration que j’ai manquée ou quoi que ce soit que j’ai à fournir pour que cela fonctionne?
Merci de votre aide!
Nous avons également rencontré ce problème et espérons que certains ingénieurs d’AWS ou de Spark le liront. J'ai réduit cela au fichier /etc/spark/conf/log4j.properties
et à la configuration des enregistreurs à l'aide de la propriété système ${spark.yarn.app.container.log.dir}
. Cette valeur est évaluée à null
et le répertoire de journalisation est maintenant évalué à /stdout
et /stderr
au lieu du /mnt/var/log/hadoop-yarn/containers/<app_id>/<container_id>/(stdout|stderr)
souhaité, ce qui a fonctionné dans EMR <5.18.0.
Solution n ° 1 (non idéale): si vous définissez cette propriété sur un chemin statique auquel l'utilisateur hadoop a accès, comme /var/log/hadoop-yarn/stderr
, tout fonctionne correctement. Cela casse probablement des choses comme le serveur d’historique et un nombre inconnu d’autres objets, mais spark-Shell et pyspark peuvent démarrer sans erreur.
UPDATESolution de contournement n ° 2 (inversion): je ne sais pas pourquoi je ne l'avais pas fait plus tôt, mais comparé à un cluster 5.13, l'intégralité des appenders DRFA-stderr et DRFA-stdout était inexistante. Si vous commentez ces sections, les supprimez ou copiez simplement le fichier log4j.properties du modèle, ce problème disparaît également (encore une fois, impact inconnu sur le reste des services). Je ne suis pas sûr de l'origine de cette section. La configuration principale des pensions n'ayant pas ces ajouts, elle semble donc être la propriété des distributions AWS.
Si vous examinez le fichier /etc/spark/conf/log4j.properties
, vous constaterez qu'il existe nouvelle configuration permettant de générer les journaux Spark Streaming toutes les heures (probablement comme suggéré ici ).
Le problème se produit car la propriété système ${spark.yarn.app.container.log.dir}
n'est pas définie dans le processus du pilote Spark. La propriété est éventuellement définie sur le répertoire de journal du conteneur de Yarn, mais cela se produit ultérieurement (regardez ici et ici ).
Afin de corriger cette erreur dans le pilote Spark, ajoutez ce qui suit à votre commande spark-submit
ou spark-Shell
:
--driver-Java-options='-Dspark.yarn.app.container.log.dir=/mnt/var/log/hadoop'
Veuillez noter que les fichiers /mnt/var/log/hadoop/stderr
et /mnt/var/log/hadoop/stdout
seront réutilisés par tous les processus (Spark Streaming) démarrés sur le même nœud.
afin de résoudre ce problème, vous pouvez ajouter une configuration au format JSON sur le provisionnement emr. Nous utilisons un code comme celui-ci
{
"Classification": "yarn-site",
"Configurations": [
],
"Properties": {
"spark.yarn.app.container.log.dir": "/var/log/hadoop-yarn"
}
}