2015-01-22 4 views
19

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

Мой 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") 

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

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

Исключение срабатывает здесь:

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

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

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

ответ

34

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

Если вы тянете hadoop-common, вам также может потребоваться исключить javax.servlet из hadoop-common. У меня есть рабочая Hbase установка/Спарк с моей зависимости 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") 
+0

На всякий случай, если кто-то заботится, этот подход работает и с maven. – hba

0

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

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

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

+0

Спарк автономных работ .... это не проблема. Мне нужно иметь эти библиотеки, и я использую sbt - поэтому я ожидаю, что время выполнения/компиляция будет одинаковым. – Marco

1

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

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

+0

у нас должны быть два активных модуля или только один? У вас есть дополнительная информация об этом? –

3

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

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

2

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

Fix: сервлет-апи-2,5 JAR был бардак там, я решил эту проблему, добавив сервлет-апи-3.0 баночку в зависимости,

4

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

  1. правой кнопкой мыши корневую папку проекта, выберите Открыть настройки модуля
  2. в новом окне выберите модули в левой колонке навигации
  3. в крайнем правом столбце выберите зависимостями вкладку, найти Maven: javax.servlet: сервлет-апи: 2,5
  4. Наконец, просто переместить этот элемент в нижней части, нажав ALT + Down.

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

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

+0

работал для меня. благодаря – Deepakkumar

Смежные вопросы