web-dev-qa-db-fra.com

Impossible d'obtenir un SparkContext dans le nouveau cluster AWS EMR

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!

15
Daniel Dev

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.

4
Diffuser

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.

3
michael

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"
    }
  }
0
Dima Lukyanchikov