从(spring)servlet运行spark时出现不兼容的ClassChangeError
从(spring)web应用程序运行一个简单的spark作业时,我得到一个从(spring)servlet运行spark时出现不兼容的ClassChangeError,spring,servlets,apache-spark,Spring,Servlets,Apache Spark,从(spring)web应用程序运行一个简单的spark作业时,我得到一个不兼容的ClassChangeError。这可能是由于一些不兼容的依赖项,但我找不到是哪个 简单地说,就是异常堆栈 这是: 以下是: org.springframework 那很好 任何想法都将不胜感激。在尝试使用mvn dependency:tree-Dverbose调查依赖冲突后,我发现了一个实用的解决方案: 将war中包含的maven依赖项替换为我用来运行war的spark-assembly-1.1.1-hadoo
不兼容的ClassChangeError
。这可能是由于一些不兼容的依赖项,但我找不到是哪个
简单地说,就是异常堆栈
这是:
以下是:
org.springframework
那很好
任何想法都将不胜感激。在尝试使用mvn dependency:tree-Dverbose调查依赖冲突后,我发现了一个实用的解决方案:
将war中包含的maven依赖项替换为我用来运行war的spark-assembly-1.1.1-hadoop2.4.0.jar
实际上:
在本地maven中安装火花组件罐:
mvn安装:安装文件\
-Dfile=$SPARK_HOME/lib/SPARK-assembly-1.1.1-hadoop2.4.0.jar\
-DgroupId=org.apache.spark-DartifactId=spark程序集jar\
-Dversion=1.1.1-dpackage=jar
将其包含在maven依赖项中:
org.apache.spark
火花装配罐
1.1.1
通过将提供的添加到spark core
、hadoop core
和hadoop client
,将spark和hadoop jar从war中移除
我的理解是,冲突可能是spark和hadoop依赖项之间的冲突,而不是spark/hadoop与spring之间的冲突。但是,使用spark assembly jar可以绕过这个问题,它包含了所有已经构建在一起的东西
这不是一个非常令人满意的解决方案,它添加了一个140MB的jar依赖项,但它可以工作。最好是找到一组合适的spark/hadoop依赖项,这些依赖项实际上可以相互协作
此外,我还可以寻找一种方法,将这个spark assembly
jar包含在servlet容器的类路径中,而不是包含在war中。让我印象深刻的是,您拥有hadoop core:1.2.1
和hadoop client:2.5.2
。这些是相互冲突的版本。另外,在您的另一个项目中,您使用的是spark 1.1.0 vs 1.2.1。我在我的另一个项目中尝试了spark 1.2.1,没有问题。然后我基本上使用了最后一个hadoop客户端和我正在使用的同一版本hadoop的核心。再一次,它在没有spring的情况下工作。mvn依赖关系:树
是否显示冲突?他们是如何解决我的Maven的?我试过了,但是有很多冲突。。。太多了,无法检查每一个,或者我需要一个有效的方法。
// file conversion with spark
// --------------------------
JavaRDD<String> inputRdd = sparkContext.textFile(inputFile).cache();
Function fct = new Function<String,String>() {
@Override
public String call(String line) throws Exception {
return line.toUpperCase();
}
};
JavaRDD<Strineg> outputRdd = inputRdd.map(fct); // *** fail ***
outputRdd.saveAsTextFile(outputDir);
@RequestMapping(method = RequestMethod.GET, value="/upper")
public @ResponseBody boolean upper(@RequestParam(required = true) String inputFile,
@RequestParam(required = true) String outputDir,
@RequestParam(required = false) String master,
@RequestParam(required = false) String namenode) {
if(master==null) master = "local";
SparkUpper.upper(inputFile, outputDir, master, namenode);
return true;
}
<dependencies>
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spark & hadoop -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.10</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-core</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.5.2</version>
</dependency>
</dependencies>