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

Spark application throws javax.servlet.FilterRegistration

我正在使用 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")

在 运行 期间我得到异常:

Exception in thread "main" java.lang.ExceptionInInitializerError during calling of... Caused by: java.lang.SecurityException: class "javax.servlet.FilterRegistration"'s signer information does not match signer information of other classes in the same package

此处触发异常:

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

我正在使用 IntelliJ Scala/SBT 插件。

我看到其他人也有这个问题suggestion solution。但这是一个 Maven 构建......我的 sbt 在这里错了吗?或者有什么其他建议可以解决这个问题吗?

尝试运行创建一个不依赖 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"

依赖项应该不匹配。还要确保在编译时和 运行.

时具有相同版本的 jars

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

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

如果您要加入 hadoop-common,那么您可能还需要从 hadoop-common 中排除 javax.servlet。我有一个有效的 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")

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

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

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

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

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

修复:Servlet-api-2.5 JAR 是一团糟,我通过在依赖项中添加 servlet-api-3.0 jar 解决了这个问题,

如果您使用的是 IntelliJ IDEA,试试这个:

  1. 右键单击项目根文件夹,选择打开模块设置
  2. 在新的window中,选择左侧导航栏模块
  3. 在最右边的列中,select Dependencies 选项卡,找到 Maven: javax.servlet:servlet-api: 2.5
  4. 最后,只需按 ALT+Down 将此项移动到底部即可。

应该可以解决这个问题。

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

我的工作如下:

libraryDependencies ++= Seq(
    "org.apache.spark" %% "spark-core" % sparkVersion.value % "provided",
    "org.apache.spark" %% "spark-sql"  % sparkVersion.value % "provided",
    ....................................................................
).map(_.excludeAll(ExclusionRule(organization = "javax.servlet")))