我有简单的scala应用程序和spark依赖项。我只是尝试使用以下代码创建spark上下文。
def main(args: Array[String]) {
var sparkConfig : SparkConf = new SparkConf() ;
sparkConfig.setAppName("ProxySQL").setMaster("local");
var sc = new SparkContext(sparkConfig)
}
当我尝试在main中运行此代码时 - 它会在新的SparkContext(sparkConfig)中抛出安全性执行,并显示以下消息。
Exception in thread "main" java.lang.SecurityException: class "javax.servlet.ServletRegistration"'s signer information does not match signer information of other classes in the same package .
在Eclipse的问题选项卡中,它显示一个警告 描述路径资源位置类型
More than one scala library found in the build path (D:/workspaces/scala/scalaEclipse/eclipse/plugins/org.scala-ide.scala210.jars_4.0.0.201503031935/target/jars/scala-library.jar, C:/Users/prems.bist/.m2/repository/org/scala-lang/scala-library/2.10.4/scala-library-2.10.4.jar).This is not an optimal configuration, try to limit to one Scala library in the build path. SQLWrapper Unknown Scala Classpath Problem
我在Windows机器上安装了2.10.4的scala。 在eclipse中设置的Scala编译器版本是2.10.5。导致此安全例外的原因是什么?这是不兼容的版本问题还是其他什么?我该如何解决?
答案 0 :(得分:11)
问题或多或少与冲突的依赖关系有关。
以下任务解决了我的问题。
转到项目
构建路径 - >订单和导出标签 - >改变顺序 javax.servlet jar 无论是底部还是顶部。
这解决了这个问题。
答案 1 :(得分:2)
好吧,我遵循以下建议:转到项目构建路径 - >订单和导出标签 - >将javax.servlet jar的顺序更改为bottom或top。
我发现我的buidpath libiaries已被更改,看起来很笨(太多小libs),也许这是由maven造成的。
所以我尝试删除所有这些并重新导入lib并选择Project - > Maven - >更新项目!
现在,进展顺利。
答案 2 :(得分:0)
使用main方法的对象名称应与setAppName(" ProxySQL")相同,也可以使用app扩展它,不要使用main方法,但这只适用于你希望我觉得很容易。
package spark.sample
import org.apache.spark.{ SparkContext, SparkConf }
/**
* Created by anquegi on 18/05/15.
*/
object ProxySQL {
def main(args: Array[String]) {
var sparkConfig: SparkConf = new SparkConf();
sparkConfig.setAppName("ProxySQL").setMaster("local");
var sc = new SparkContext(sparkConfig)
}
}
我通常使用和对象喜欢使用Spark
package spark.sample
import org.apache.spark.{ SparkContext, SparkConf }
/**
* Created by anquegi on 18/05/15.
*/
object ProxySQL extends App {
val sparkConfig: SparkConf = new SparkConf();
sparkConfig.setAppName("ProxySQL").setMaster("local[4]");
val sc = new SparkContext(sparkConfig)
}
我更喜欢使用val而不是var
您也可以使用.setMaster("local[4]")
设置主播,而不能只使用一个
答案 3 :(得分:0)
这意味着您没有从应用程序中的某些依赖项中排除Servlet API,并且其中之一每次都会引入它。查看依赖关系树,排除javax.servlet中引入的任何内容。
它应该已经在Spark中可用,并且来自Oracle的特定javax.servlet JAR具有必须删除的签名信息,或者只是排除整个内容。 其中提到了一些库here