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

Scala Spark应用程序抛出javax.servlet.FilterRegistration,scala,intellij-idea,sbt,apache-spark,Scala,Intellij Idea,Sbt,Apache Spark,我正在使用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.apac

我正在使用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.ExceptionInInitializeError中出现异常 在调用。。。原因:java.lang.SecurityException:类 “javax.servlet.FilterRegistration”的签名者信息不匹配 同一包中其他类的签名者信息

异常在此处触发:

val sc = new SparkContext("local", "HBaseTest")
我正在使用IntelliJ Scala/SBT插件


我看到其他人也有这个问题。但这是一个专业的构建。。。我的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"
依赖项应该不匹配。还要确保在编译和运行时拥有相同版本的JAR


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

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

如果您正在使用
hadoopcommon
,那么您可能还需要从
hadoopcommon
中排除
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类出现在3.0中,而且如果您使用JETTY或Java 8,这个jar 2.5会自动添加为依赖项


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

如果您使用IntelliJ IDEA,请尝试以下方法:

  • 右键单击项目根文件夹,选择“打开模块设置”
  • 在新窗口中,选择左侧导航列中的模块
  • 在最右边的列中,选择Dependencies选项卡,查找Maven:javax.servlet:ServletAPI:2.5
  • 最后,只需按ALT+向下键将此项移动到底部 它应该解决这个问题


    此方法来源于

    For me works,具体如下:

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

    Spark单机版有效…这不是问题所在。我需要有这些库,并且我正在使用sbt,所以我希望运行时/编译是相同的,我们应该有两个活动模块,还是只有一个?你有更多关于这方面的信息吗?以防万一,这种方法也适用于maven。