Приложение искры бросает 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? Или любое другое предложение, как я могу решить эту проблему?
Ответы
Ответ 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"
Должно быть несоответствие зависимостей. также убедитесь, что во время компиляции и во время выполнения вы используете ту же версию банок.
Также возможно запустить код на искровой оболочке для воспроизведения? Я смогу помочь лучше.