Ich verwende Scala, um lokal eine Spark-Anwendung zu erstellen und auszuführen.
Mein 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")
Zur Laufzeit bekomme ich die Ausnahme:
Ausnahme im Thread "main" Java.lang.ExceptionInInitializerError beim Aufruf von ... Verursacht durch: Java.lang.SecurityException: class Die Unterzeichnerinformationen von "javax.servlet.FilterRegistration" stimmen nicht mit .__ überein. Unterzeichnerinformationen anderer Klassen im selben Paket
Die Ausnahme wird hier ausgelöst:
val sc = new SparkContext("local", "HBaseTest")
Ich benutze das IntelliJ Scala/SBT Plugin.
Ich habe gesehen, dass andere Leute auch dieses Problem haben Lösungsvorschlag . Aber das ist ein Maven Build ... Ist mein sbt hier falsch? Oder einen anderen Vorschlag, wie ich dieses Problem lösen kann?
Siehe meine Antwort auf eine ähnliche Frage hier . Der Klassenkonflikt kommt zustande, weil HBase von org.mortbay.jetty
und Spark von org.Eclipse.jetty
abhängt. Ich konnte das Problem beheben, indem ich org.mortbay.jetty
-Abhängigkeiten von HBase ausschließe.
Wenn Sie hadoop-common
verwenden, müssen Sie möglicherweise javax.servlet
von hadoop-common
ausschließen. Ich habe ein funktionierendes HBase/Spark-Setup, wobei meine sbt-Abhängigkeiten wie folgt eingerichtet sind:
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")
Wenn Sie IntelliJ IDEA verwenden, versuchen Sie Folgendes:
Es sollte dieses Problem lösen.
Diese Methode stammt aus http://wpcertification.blogspot.ru/2016/01/spark-error-class-javaxservletfilterreg.html
Wenn Sie SBT verwenden, ist die FilterRegistration-Klasse in 3.0 vorhanden. Wenn Sie JETTY oder Java 8 verwenden, wird diese JAR 2.5 automatisch als Abhängigkeit hinzugefügt.
Fix: Servlet-api-2.5-JAR war das Durcheinander dort, ich habe dieses Problem durch Hinzufügen von Servlet-api-3.0-jar in Abhängigkeiten behoben
Wenn dies in Intellij Idea geschieht, sollten Sie zur Projekteinstellung gehen und das Glas in den Modulen finden und es entfernen. Führen Sie dann Ihren Code mit sbt durch Shell aus. Es wird die JAR-Dateien selbst abrufen und dann zu intellij zurückkehren und den Code über intellij erneut ausführen. Es funktioniert irgendwie für mich und behebt den Fehler. Ich bin nicht sicher, was das Problem war, da es nicht mehr auftaucht.
Oh, ich habe auch die JAR-Datei entfernt und "javax.servlet: javax.servlet-api: 3.1.0" durch maven von Hand hinzugefügt. Jetzt kann ich den Fehler sehen.
Für mich arbeitet das Folgende:
libraryDependencies ++= Seq(
"org.Apache.spark" %% "spark-core" % sparkVersion.value % "provided",
"org.Apache.spark" %% "spark-sql" % sparkVersion.value % "provided",
....................................................................
).map(_.excludeAll(ExclusionRule(organization = "javax.servlet")))
Wenn Sie in intellij laufen, prüfen Sie in den Projekteinstellungen, ob Sie zwei aktive Module haben (eines für das Projekt und eines für sbt).
Wahrscheinlich ein Problem beim Importieren eines vorhandenen Projekts.
versuchen Sie, ein einfaches Programm ohne die Abhängigkeiten von hadoop und hbase auszuführen
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"
Die Abhängigkeiten sollten nicht übereinstimmen. Stellen Sie außerdem sicher, dass Sie während des Kompilierens und des Laufens dieselbe Version von Gläsern haben.
Ist es auch möglich, den Code mit Spark Shell zu reproduzieren? Ich werde besser helfen können.