无法在Apache Spark SQL 1.5.2的SQLContext中运行查询,获取java.lang.NoSuchMethodError

时间:2015-12-09 16:35:47

标签: apache-spark apache-spark-sql

我有一个使用 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;

堆栈跟踪here

我的应用程序是在Tomcat 7上运行的Web应用程序。我没有任何其他配置文件。我能做错什么?可能是一些依赖冲突,因为我能够在一个干净的项目中运行相同的代码吗?

编辑:我发现issue可以提供有关此问题的更多信息。

2 个答案:

答案 0 :(得分:5)

在这种情况下,由于 maven依赖冲突而发生NoSuchMethodError。

项目在编译期间使用的库要么不可用,要么在运行时使用其他版本的库。

我尝试了许多方法来解决这个冲突问题,最后跟着为我工作了 -

只需将jackson.databind的正确依赖版本添加为pom.xml中的第一个依赖项。

使用版本2.4.x或更高版本的jackson.databind依赖。

注意:这仅适用于Maven 2.0.9及更高版本。

为什么这会起作用?

在Maven 2.0.9中,添加了传递依赖的新功能。

  

依赖关系中介 - 此 确定在遇到工件的多个版本时将使用哪个版本的依赖关系 。目前,Maven 2.0仅支持使用&#34;最近的定义&#34;这意味着它将在依赖树中使用与项目最接近的依赖项的版本。您可以通过在项目的POM中明确声明版本来保证版本。请注意,如果两个依赖项版本在依赖关系树中处于相同的深度,那么直到Maven 2.0.8没有定义哪一个会赢,但是 ,因为Maven 2.0.9它的顺序是重要的声明:第一个声明获胜。

Maven Transitive Dependency

答案 1 :(得分:1)

BigDecimalDeserializer wasn't introduced to FasterXML/jackson-module-scala until 2.4。确认以下内容:

  1. 您编译的相同jar在运行时位于类路径上。
  2. pom.xml file for Spark SQL中的
  3. ${fasterxml.jackson.version}为2.4.x或更高版本。
  4. <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.4.4</version>
    </dependency>