2015-03-04 3 views
0

При запуске простой искровой работы из (весеннего) веб-приложения я получаю IncompatibleClassChangeError. Вероятно, это связано с некоторыми несовместимыми зависимостями, но я не могу найти, что.IncompatibleClassChangeError при запуске искры из (пружинного) сервлета

Проще говоря, this is the issue с стеком исключений.

Вот the failing code:

// 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); 

И это называется из a simple spring servlet:

@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; 
} 

А вот the (maven) dependencies:

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

Самое странное в том, что в основном делать то же самое, с одинаковыми искровыми зависимостями, но называемое fr om сервлет, как в this project, который отлично работает.

Любая идея была бы принята с благодарностью.

+0

Что для меня значит, что у вас есть 'hadoop-core: 1.2.1' с' hadoop-client: 2.5.2'. Это противоречивые версии. Кроме того, в вашем другом проекте вы используете искру 1.1.0 против 1.2.1. – climbage

+0

Я пробовал с искрой 1.2.1 в моем другом проекте без проблем. Затем я в основном взял последний клиент из базы данных и ядро ​​той же версии hadoop, которую я использую.Еще раз он работает без весны ... –

+0

Зависит ли конфликт 'mvn: tree' show? И как они разрешили мой Maven? –

ответ

0

После попытки исследовать конфликт зависимостей, используя mvn dependency:tree -Dverbose, которое показало, слишком многие из них, я нашел практическое решение:

Replace зависимости Maven включенные в войне в spark-assembly-1.1.1-hadoop2.4.0.jar, что я использовал, чтобы запустить свой previous non-spring code.

На практике:

  1. установить банку с искровым сборки в местной мавена:

    mvn install:install-file \ -Dfile=$SPARK_HOME/lib/spark-assembly-1.1.1-hadoop2.4.0.jar \ -DgroupId=org.apache.spark -DartifactId=spark-assembly-jar \ -Dversion=1.1.1 -Dpackaging=jar

  2. включить его в зависимости Maven:

    <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-assembly-jar</artifactId> <version>1.1.1</version> </dependency>

  3. удалите искру и банку с оружием от войны, добавив <scope>provided</scope> в spark-core, hadoop-core и hadoop-client.

Я понимаю, что конфликт может быть между зависимостями искры и адуопа, а не от искры/хауопа против весны. Но это обходит, используя банку с искровой сборкой, которая содержит все, что было построено вместе.

Это не очень приятное решение, и оно добавляет 140-мегабайтную зависимость, но это работает. Было бы лучше найти подходящий набор зависимостей искры/хауопа, которые действительно работают друг с другом.

Кроме того, я мог бы найти способ включить этот баннер spark-assembly в путь класса контейнера сервлетов, а не в войну.

Смежные вопросы