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:
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 !!