无法在Apache Spark SQL 1.5.2的SQLContext中运行查询,出现java.lang.NoSuchMethodError错误。

4

我有一个使用Spark SQLSpark 1.5.2使用本地模式)的Java应用程序,但是无法执行任何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;
堆栈跟踪这里
我的应用程序是运行在Tomcat 7上的Web应用程序。我没有其他配置文件。我做错了什么吗?可能是某些依赖冲突吗,因为我能够在干净的项目中运行相同的代码吗? 编辑:我找到了一个问题,它提供了有关该问题的更多信息。

您的类路径中是否已有com.fasterxml.jackson.module.scala.deser.BigDecimalDeserializer? - Myles Baker
当我卸载所有的Spark依赖时,我发现我的两个jackson jars(可能来自其他依赖项): jackson-core-asl-1.9.12.jarjackson-mapper-asl-1.9.12.jar。如果你访问这些链接,可以看到这些包已经被移动到了com.fasterxml.jackson.core,即存在冲突的依赖项。我唯一的选择是找出哪个maven依赖项拥有这些包并进行升级。 - matheusr
2个回答

5
在这种情况下,由于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传递性依赖

1

这是 我的Maven依赖树截图,看起来没问题,对吗? - matheusr
我以前在Eclipse中处理Spark应用程序的类路径问题时遇到过问题(实际上已经转向使用IntellijIDEA来处理Spark / Scala应用程序)。无论如何,让我检查一下依赖层次结构,看看我能找到什么。你可以尝试从命令行构建并查看是否出现编译错误吗? - Myles Baker
这是mvn clean install输出,我没有收到任何错误。 - matheusr
当您执行此jar文件时会发生什么?在Eclipse中,您的类路径似乎有一些额外的jar文件。 - Myles Baker
让我们在聊天中继续这个讨论 - Myles Baker
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接