webentwicklung-frage-antwort-db.com.de

Die Spark-Anwendung löst javax.servlet.FilterRegistration aus

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?

20
Marco

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")
36

Wenn Sie IntelliJ IDEA verwenden, versuchen Sie Folgendes:

  1. Klicken Sie mit der rechten Maustaste auf den Stammordner des Projekts und wählen Sie Moduleinstellungen öffnen.
  2. Wählen Sie im neuen Fenster in der linken Navigationsspalte Modules
  3. Wählen Sie in der rechten Spalte die Registerkarte Abhängigkeiten aus, und suchen Sie Maven: javax.servlet: servlet-api: 2.5
  4. Zum Schluss bewegen Sie dieses Element einfach mit ALT + Runter nach unten. 

Es sollte dieses Problem lösen.

Diese Methode stammt aus http://wpcertification.blogspot.ru/2016/01/spark-error-class-javaxservletfilterreg.html

4
Jing He

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

3
Ravi Macha

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.

3
M.Rez

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")))
1
Igorock

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.

1
Juan Alonso

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.

0
Pankaj Narang