Подтвердить что ты не робот

Приложение искры бросает javax.servlet.FilterRegistration

Я использую Scala для создания и запуска приложения Spark локально.

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

Во время выполнения я получаю исключение:

Исключение в потоке "main" java.lang.ExceptionInInitializerError во время вызова... Вызывается: java.lang.SecurityException: class Информация о подписчике "javax.servlet.FilterRegistration" не соответствует подписывающая информация других классов в одном пакете

Здесь вызывается исключение:

val sc = new SparkContext("local", "HBaseTest")

Я использую плагин IntelliJ Scala/SBT.

Я видел, что у других людей также есть эта проблема предложение для решения. Но это сборка maven... Не так ли здесь sbt? Или любое другое предложение, как я могу решить эту проблему?

4b9b3361

Ответ 1

См. мой ответ на аналогичный вопрос здесь. Классовый конфликт возникает из-за того, что HBase зависит от org.mortbay.jetty, а Spark зависит от org.eclipse.jetty. Я смог решить проблему, исключив org.mortbay.jetty зависимости из HBase.

Если вы втягиваете hadoop-common, вам также может потребоваться исключить javax.servlet из hadoop-common. У меня есть рабочая настройка HBase/Spark с моими зависимостями sbt, настроенными следующим образом:

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

Ответ 2

Если вы используете IntelliJ IDEA, попробуйте следующее:

  • Щелкните правой кнопкой мыши корневую папку проекта, выберите "Открыть параметры модуля"
  • В новом окне выберите "Модули" в левой колонке навигации
  • В столбце справа выберите вкладку "Зависимости", найдите Maven: javax.servlet: servlet-api: 2.5
  • Наконец, просто переместите этот элемент вниз, нажав ALT + Вниз.

Он должен решить эту проблему.

Этот метод пришел из http://wpcertification.blogspot.ru/2016/01/spark-error-class-javaxservletfilterreg.html

Ответ 3

Если это происходит в Intellij Idea, вы должны перейти к настройке проекта и найти банку в модулях и удалить ее. Затем запустите свой код с помощью sbt через оболочку. Он получит сами файлы jar, а затем вернется к intellij и снова запустит код через intellij. Это как-то работает для меня и исправляет ошибку. Я не уверен, в чем проблема, поскольку она больше не появляется.

О, я также удалил файл jar и добавил "javax.servlet: javax.servlet-api: 3.1.0" через maven вручную, и теперь я вижу, что ошибка исчезла.

Ответ 4

Если вы работаете внутри intellij, проверьте настройки проекта, если у вас есть два активных модуля (один для проекта и другой для sbt).

Вероятно, проблема при импорте существующего проекта.

Ответ 5

Когда вы используете SBT, класс FilterRegistration присутствует в версии 3.0, а также если вы используете JETTY или Java 8, этот JAR 2.5 автоматически добавляет в качестве зависимости,

Исправлено: Servlet-api-2.5 JAR был там беспорядок, я решил эту проблему, добавив в зависимости от сервлета-api-3.0 jar,

Ответ 6

попробуйте запустить простую программу без зависимостей hadoop и 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"

Должно быть несоответствие зависимостей. также убедитесь, что во время компиляции и во время выполнения вы используете ту же версию банок.

Также возможно запустить код на искровой оболочке для воспроизведения? Я смогу помочь лучше.