我有一个使用Spark SQL的Java应用程序(Spark 1.5.2使用本地模式),但我无法执行任何SQL命令而不出错。
这是我正在执行的代码:
//confs
SparkConf sparkConf = new SparkConf();
sparkConf.set("spark.master","local");
sparkConf.set("spark.app.name","application01");
sparkConf.set("spark.driver.host","10.1.1.36");
sparkConf.set("spark.driver.port", "51810");
sparkConf.set("spark.executor.port", "51815");
sparkConf.set("spark.repl.class.uri","http://10.1.1.36:46146");
sparkConf.set("spark.executor.instances","2");
sparkConf.set("spark.jars","");
sparkConf.set("spark.executor.id","driver");
sparkConf.set("spark.submit.deployMode","client");
sparkConf.set("spark.fileserver.uri","http://10.1.1.36:47314");
sparkConf.set("spark.localProperties.clone","true");
sparkConf.set("spark.app.id","app-45631207172715-0002");
//Initialize contexts
JavaSparkContext sparkContext = new JavaSparkContext(sparkConf);
SQLContext sqlContext = new SQLContext(sparkContext);
//execute command
sqlContext.sql("show tables").show();
pom.xml中的Spark依赖关系如下所示:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.10</artifactId>
<version>1.5.2</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.10</artifactId>
<version>1.5.2</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_2.10</artifactId>
<version>1.5.2</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-repl_2.10</artifactId>
<version>1.5.2</version>
</dependency>
这是我得到的错误:
java.lang.NoSuchMethodError: com.fasterxml.jackson.module.scala.deser.BigDecimalDeserializer$.handledType()Ljava/lang/Class;
堆栈跟踪就在这里。
我的应用程序是一个在Tomcat7上运行的web应用程序。我没有任何其他配置文件。我可能做错了什么?这可能是一些依赖冲突,因为我可以在一个干净的项目中运行相同的代码?
编辑:我发现了一个问题,该问题提供了有关该问题的更多信息。
在这种情况下,由于maven依赖冲突,发生了NoSuchMethodError。
项目在编译时使用的库不可用,或者运行时正在使用该库的某些其他版本。
我尝试了很多方法来解决这个冲突问题,最终以下对我有效-
只需添加jackson.databind的正确依赖版本作为pom.xml中的第一个依赖即可。
请使用版本2.4.x或更高版本的jackson.databind依赖项。
注意:这只适用于Maven 2.0.9及以上版本。
为什么会这样
在Maven 2.0.9中,添加了可传递依赖项的新特性。
依赖中介-这确定当遇到工件的多个版本时将使用依赖的哪个版本。目前,Maven 2.0只支持使用"最接近的定义",这意味着它将在依赖关系树中使用与您的项目最接近的依赖关系的版本。您总是可以通过在项目的POM中明确声明某个版本来保证它。请注意,如果两个依赖版本在依赖树中的深度相同,那么在Maven 2.0.8之前,还没有定义哪一个版本会获胜,但自Maven 2.0.9以来,重要的是声明中的顺序:第一个声明获胜
Maven传递依赖
BigDecimalDeserializer直到2.4才被引入FasterXML/jackson模块scala。确认以下内容:
- 编译时使用的jar在运行时位于类路径上
- Spark SQL的pom.xml文件中的
${fasterxml.jackson.version}
为2.4.x或更高版本
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.4.4</version> </dependency>