apache spark: erreur de version d’Akka par le build jar avec toutes les dépendances

J’ai construit un fichier JAR à partir de mon application spark avec maven (MVN Clean Comstack Assembly: single) et le fichier pom suivant:

 4.0.0 mgm.tp.bigdata ma-spark 0.0.1-SNAPSHOT jar ma-spark http://maven.apache.org  UTF-8    cloudera https://repository.cloudera.com/artifactory/cloudera-repos/     junit junit 3.8.1 test   org.apache.spark spark-core_2.10 1.1.0-cdh5.2.5   mgm.tp.bigdata ma-commons 0.0.1-SNAPSHOT      maven-assembly-plugin    mgm.tp.bigdata.ma_spark.SparkMain    jar-with-dependencies       

si je lance mon application avec java -jar ma-spark-0.0.1-SNAPSHOT-jar-with-dependencies.jar sur le terminal, le message d’erreur suivant s’affiche:

 VirtualBox:~/Schreibtisch$ java -jar ma-spark-0.0.1-SNAPSHOT-jar-with-dependencies.jar 2015-Jun-02 12:53:36,348 [main] org.apache.spark.util.Utils WARN - Your hostname, proewer-VirtualBox resolves to a loopback address: 127.0.1.1; using 10.0.2.15 instead (on interface eth0) 2015-Jun-02 12:53:36,350 [main] org.apache.spark.util.Utils WARN - Set SPARK_LOCAL_IP if you need to bind to another address 2015-Jun-02 12:53:36,401 [main] org.apache.spark.SecurityManager INFO - Changing view acls to: proewer 2015-Jun-02 12:53:36,402 [main] org.apache.spark.SecurityManager INFO - Changing modify acls to: proewer 2015-Jun-02 12:53:36,403 [main] org.apache.spark.SecurityManager INFO - SecurityManager: authentication disabled; ui acls disabled; users with view permissions: Set(proewer); users with modify permissions: Set(proewer) Exception in thread "main" com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'akka.version' at com.typesafe.config.impl.SimpleConfig.findKey(SimpleConfig.java:115) at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:136) at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:142) at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:150) at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:155) at com.typesafe.config.impl.SimpleConfig.getSsortingng(SimpleConfig.java:197) at akka.actor.ActorSystem$Settings.(ActorSystem.scala:136) at akka.actor.ActorSystemImpl.(ActorSystem.scala:470) at akka.actor.ActorSystem$.apply(ActorSystem.scala:111) at akka.actor.ActorSystem$.apply(ActorSystem.scala:104) at org.apache.spark.util.AkkaUtils$.org$apache$spark$util$AkkaUtils$$doCreateActorSystem(AkkaUtils.scala:121) at org.apache.spark.util.AkkaUtils$$anonfun$1.apply(AkkaUtils.scala:54) at org.apache.spark.util.AkkaUtils$$anonfun$1.apply(AkkaUtils.scala:53) at org.apache.spark.util.Utils$$anonfun$startServiceOnPort$1.apply$mcVI$sp(Utils.scala:1454) at scala.collection.immutable.Range.foreach$mVc$sp(Range.scala:141) at org.apache.spark.util.Utils$.startServiceOnPort(Utils.scala:1450) at org.apache.spark.util.AkkaUtils$.createActorSystem(AkkaUtils.scala:56) at org.apache.spark.SparkEnv$.create(SparkEnv.scala:156) at org.apache.spark.SparkContext.(SparkContext.scala:203) at org.apache.spark.api.java.JavaSparkContext.(JavaSparkContext.scala:53) at mgm.tp.bigdata.ma_spark.SparkMain.main(SparkMain.java:38) 

Ce que je fais mal?

Cordialement, Paul

C’est ce que vous faites mal:

je lance mon application avec java -jar ma-spark-0.0.1-SNAPSHOT-jar-with-dependencies.jar

Une fois votre application créée, vous devez la lancer à l’aide du script spark-submit. Ce script prend en charge la configuration du chemin de classe avec Spark et ses dépendances. Il peut prendre en charge différents gestionnaires de cluster et modes de déploiement pris en charge par Spark:

 ./bin/spark-submit \ --class  --master  \ --deploy-mode  \ --conf = \ ... # other options  \ [application-arguments] 

Je vous conseille vivement de lire la documentation officielle sur la soumission d’une demande .

Cela est probablement dû au fait que le fichier de configuration akka de akka jar a été ignoré ou omis lors de l’emballage du pot.

Vous pouvez essayer un autre plug-in appelé maven-shade-plugin. Et dans le fichier pom.xml, vous devez spécifier comment résoudre les conflits de ressources portant le même nom. Voici un exemple –

   org.apache.maven.plugins maven-shade-plugin 2.1   package  shade   false false    my.package.etc....:*     *:*  META-INF/*.SF META-INF/*.DSA META-INF/*.RSA      reference.conf       

Veuillez noter la section où il demande au plug-in shade d’append le contenu au lieu de le remplacer.

Cela a fonctionné pour moi.

   org.apache.maven.plugins maven-shade-plugin 1.5   package  shade   true allinone   *:*     *:*  META-INF/*.SF META-INF/*.DSA META-INF/*.RSA      reference.conf   META-INF/spring.handlers   META-INF/spring.schemas    com.echoed.chamber.Main        

ConfigException $ Erreur manquante indique que le fichier de configuration akka, c’est-à-dire que le fichier reference.conf n’est pas fourni dans le fichier jar de l’application. La raison pourrait en être que, lorsque plusieurs fichiers portant le même nom sont disponibles dans différents fichiers jar dépendants, la stratégie par défaut vérifie s’ils sont tous identiques. Sinon, alors ce fichier sera omis.

J’ai eu le même problème et je l’ai résolu comme suit:

Générer le fichier reference.conf fusionné à l’ aide d’AppendingTransformer: Par fichier fusionné reference.conf, j’entends par là que tous les modules dépendants, tels que akka-core, akka-http, akka-remoting, etc. Nous ajoutons AppendingTransformer dans un fichier pom comme suit:

   reference.conf  

mvn clean install va maintenant générer le gros fichier jar avec le fichier reference.conf fusionné.

Toujours la même erreur: spark-submit donnait toujours la même erreur lorsque j’ai déployé mon application spark dans EMR.

Raison: étant donné que HDFS est le système de fichiers configuré, les travaux Spark sur un cluster EMR sont lus à partir de HDFS par défaut. Donc, le fichier que vous voulez utiliser doit déjà exister dans HDFS. J’ai ajouté le fichier reference.conf à hdfs en utilisant l’approche suivante:

 1. Extract reference.conf file from app.jar into /tmp folder `cd /tmp` `jar xvf path_to_application.jar reference.conf` 2. Copy extracted reference.conf from local-path (in this case /tmp) to HDFS-path (ex: /user/hadoop) `hdfs dfs -put /tmp/reference.conf /user/hadoop` 3. Load config as follows: `val parsedConfig = ConfigFactory.parseFile(new File("/user/hadoop/reference.conf"))` `val config = COnfigFactory.load(par)` 

Solution alternative:

  • Extrayez le fichier reference.conf du fichier app.jar et copiez-le sur tous les noeuds du cluster EMR dans le même chemin pour les pilotes et les exécuteurs.
  • ConfigFactory.parseFile(new File(“file:///tmp/reference.conf”)) lira désormais reference.conf à partir du système de fichiers local. J’espère que cela vous aidera et vous fera gagner du temps de débogage !!