Spark应用程序抛出javax.servlet.FilterRegistration

时间:2015-01-22 10:31:04

标签: scala intellij-idea sbt apache-spark

我使用Scala在本地创建和运行Spark应用程序。

我的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插件。

我已经看到其他人也有这个问题suggestion solution。但这是一个maven构建......我的错在哪里?或任何其他建议我如何解决这个问题?

7 个答案:

答案 0 :(得分:36)

查看我对类似问题here的回答。类冲突是因为HBase依赖于org.mortbay.jetty,而Spark依赖于org.eclipse.jetty。我能够通过从HBase中排除org.mortbay.jetty依赖项来解决问题。

如果您提到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")

答案 1 :(得分:4)

如果您使用的是IntelliJ IDEA,请尝试以下操作:

  1. 右键单击项目根文件夹,选择打开模块设置
  2. 在新窗口中,选择左侧导航栏中的模块
  3. 在最右边的列中,选择 Dependencies 选项卡,找到 Maven:javax.servlet:servlet-api:2.5
  4. 最后,按ALT +向下移动此项目到底部。
  5. 应该解决这个问题。

    此方法来自http://wpcertification.blogspot.ru/2016/01/spark-error-class-javaxservletfilterreg.html

答案 2 :(得分:3)

如果在Intellij Idea中发生这种情况,您应该转到项目设置并在模块中找到jar,然后将其删除。然后使用sbt通过shell运行代码。它将获取jar文件本身,然后返回intellij并通过intellij重新运行代码。它以某种方式适用于我并修复错误。我不确定是什么问题,因为它不再出现了。

哦,我也删除了jar文件,并通过maven手动添加了“javax.servlet:javax.servlet-api:3.1.0”,现在我可以看到错误消失了。

答案 3 :(得分:3)

当您使用SBT时,FilterRegistration类出现在3.0中,如果您使用JETTY或Java 8这个JAR 2.5,它会自动添加为依赖项,

修复:Servlet-api-2.5 JAR是那里的混乱,我通过在依赖项中添加servlet-api-3.0 jar解决了这个问题,

答案 4 :(得分:1)

如果您在intellij内部运行,请检查项目设置是否有两个活动模块(一个用于项目,另一个用于sbt)。

导入现有项目时可能出现问题。

答案 5 :(得分:1)

对我来说,我的工作如下:

SELECT *
FROM sliders
ORDER BY
  id = (SELECT MIN(id) FROM sliders WHERE image_url IS NOT NULL) DESC,
  id = (SELECT MIN(id) FROM sliders WHERE video_url IS NOT NULL) DESC,
  id;

答案 6 :(得分: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"

应该存在不匹配的依赖关系。在编译和运行时也要确保你有相同版本的jar。

还可以在spark shell上运行代码来重现吗?我将能够提供更好的帮助。