从(spring)servlet运行spark时出现不兼容的ClassChangeError

从(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

从(spring)web应用程序运行一个简单的spark作业时,我得到一个
不兼容的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>