J'utilise Scala pour créer et exécuter une application Spark localement.
Mon build.sbt:
name : "SparkDemo"
version : "1.0"
scalaVersion : "2.10.4"
libraryDependencies += "org.Apache.spark" %% "spark-core" % "1.2.0" exclude("org.Apache.hadoop", "hadoop-client")
libraryDependencies += "org.Apache.spark" % "spark-sql_2.10" % "1.2.0"
libraryDependencies += "org.Apache.hadoop" % "hadoop-common" % "2.6.0" excludeAll(
ExclusionRule(organization = "org.Eclipse.jetty"))
libraryDependencies += "org.Apache.hadoop" % "hadoop-mapreduce-client-core" % "2.6.0"
libraryDependencies += "org.Apache.hbase" % "hbase-client" % "0.98.4-hadoop2"
libraryDependencies += "org.Apache.hbase" % "hbase-server" % "0.98.4-hadoop2"
libraryDependencies += "org.Apache.hbase" % "hbase-common" % "0.98.4-hadoop2"
mainClass in Compile := Some("demo.TruckEvents")
Pendant l'exécution, j'obtiens l'exception:
Exception dans le fil "principal" Java.lang.ExceptionInInitializerError lors de l'appel de ... Causée par: Java.lang.SecurityException: class Les informations sur le signataire "javax.servlet.FilterRegistration" ne correspondent pas informations de signataire d'autres classes dans le même package
L'exception est déclenchée ici:
val sc = new SparkContext("local", "HBaseTest")
J'utilise le plugin IntelliJ Scala/SBT.
J'ai vu que d'autres personnes ont aussi ce problème solution suggérée . Mais c’est une construction maven ... Est-ce que mon problème est faux ici? Ou toute autre suggestion comment je peux résoudre ce problème?
Voir ma réponse à une question similaire ici . Le conflit de classe survient parce que HBase dépend de org.mortbay.jetty
et Spark dépend de org.Eclipse.jetty
. J'ai pu résoudre le problème en excluant les dépendances org.mortbay.jetty
de HBase.
Si vous extrayez hadoop-common
, vous devrez peut-être également exclure javax.servlet
de hadoop-common
. J'ai une configuration de travail HBase/Spark avec mes dépendances sbt configurées comme suit:
val clouderaVersion = "cdh5.2.0"
val hadoopVersion = s"2.5.0-$clouderaVersion"
val hbaseVersion = s"0.98.6-$clouderaVersion"
val sparkVersion = s"1.1.0-$clouderaVersion"
val hadoopCommon = "org.Apache.hadoop" % "hadoop-common" % hadoopVersion % "provided" excludeAll ExclusionRule(organization = "javax.servlet")
val hbaseCommon = "org.Apache.hbase" % "hbase-common" % hbaseVersion % "provided"
val hbaseClient = "org.Apache.hbase" % "hbase-client" % hbaseVersion % "provided"
val hbaseProtocol = "org.Apache.hbase" % "hbase-protocol" % hbaseVersion % "provided"
val hbaseHadoop2Compat = "org.Apache.hbase" % "hbase-hadoop2-compat" % hbaseVersion % "provided"
val hbaseServer = "org.Apache.hbase" % "hbase-server" % hbaseVersion % "provided" excludeAll ExclusionRule(organization = "org.mortbay.jetty")
val sparkCore = "org.Apache.spark" %% "spark-core" % sparkVersion % "provided"
val sparkStreaming = "org.Apache.spark" %% "spark-streaming" % sparkVersion % "provided"
val sparkStreamingKafka = "org.Apache.spark" %% "spark-streaming-kafka" % sparkVersion exclude("org.Apache.spark", "spark-streaming_2.10")
Si vous utilisez IntelliJ IDEA, essayez ceci:
Cela devrait résoudre ce problème.
Cette méthode est issue de http://wpcertification.blogspot.ru/2016/01/spark-error-class-javaxservletfilterreg.html
Lorsque vous utilisez SBT, la classe FilterRegistration est présente dans la version 3.0 et, si vous utilisez JETTY ou Java 8, ce JAR 2.5 est automatiquement ajouté en tant que dépendance.
Corrigé: JAR Servlet-api-2.5 était le bazar là-bas, j'ai résolu ce problème en ajoutant jar servlet-api-3.0 dans les dépendances,
Si cela se produit dans Intellij Idea, vous devez aller dans les paramètres du projet, trouver le fichier jar dans les modules et le supprimer. Ensuite, exécutez votre code avec sbt via Shell. Il récupérera les fichiers jar, puis retournera à intellij et relancera le code via intellij. Cela fonctionne en quelque sorte pour moi et corrige l'erreur. Je ne sais pas quel était le problème car il ne se présente plus.
J'ai également supprimé le fichier jar et ajouté "javax.servlet: javax.servlet-api: 3.1.0" via maven à la main et je peux maintenant voir l'erreur disparaître.
Pour moi, fonctionne comme suit:
libraryDependencies ++= Seq(
"org.Apache.spark" %% "spark-core" % sparkVersion.value % "provided",
"org.Apache.spark" %% "spark-sql" % sparkVersion.value % "provided",
....................................................................
).map(_.excludeAll(ExclusionRule(organization = "javax.servlet")))
Si vous utilisez intellij, veuillez vérifier les paramètres du projet si vous avez deux modules actifs (un pour le projet et un autre pour sbt).
Probablement un problème lors de l'importation d'un projet existant.
essayez de lancer un programme simple sans les dépendances hadoop et hbase
libraryDependencies += "org.Apache.hadoop" % "hadoop-common" % "2.6.0" excludeAll(ExclusionRule(organization = "org.Eclipse.jetty"))
libraryDependencies += "org.Apache.hadoop" % "hadoop-mapreduce-client-core" % "2.6.0"
libraryDependencies += "org.Apache.hbase" % "hbase-client" % "0.98.4-hadoop2"
libraryDependencies += "org.Apache.hbase" % "hbase-server" % "0.98.4-hadoop2"
libraryDependencies += "org.Apache.hbase" % "hbase-common" % "0.98.4-hadoop2"
Il devrait y avoir une discordance des dépendances. Assurez-vous également que vous avez la même version des fichiers jar lors de la compilation et de l'exécution.
Est-il également possible d'exécuter le code sur spark Shell pour le reproduire? Je vais pouvoir aider mieux.