2015-01-08 4 views
0

Я использую бурю Trident и пытаюсь запустить экземпляр сетки в методе подготовки функции. Один и тот же файл конфигурации хорошо работает с локальным кластером. Когда я отправляю его в кластер remore, я получаю сообщение об ошибке.Исключение Gridgain java.lang.IncompatibleClassChangeError: Реализация класса

Код:

public class MemoryGrid extends BaseFunction { 

private static final long serialVersionUID = -4574506761580804738L; 
private static final String configFileLocation = "file:///home/path/config.xml"; 
MemGridDAO memgriddao; 
public void prepare(Map conf, TridentOperationContext context){ 
    this.memgriddao = new MemGridDAO (configFileLocation); 
} 
public void execute(TridentTuple tuple, TridentCollector collector) { 
    try { 
     memgriddao.put("cahcename",tuple.getValue(0),tuple.getValue(1)); 
    } catch (GridException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    collector.emit(null); 
} 

public class MemGridDAO { 

    public MemGridDAO(String configFile){ 

    Grid grid = GridGain.start(configFile); 
    } 

    } 

Ошибка

java.lang.IncompatibleClassChangeError: Implementing class 
    at java.lang.ClassLoader.defineClass1(Native Method) ~[na:1.7.0_45] 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:800) ~[na:1.7.0_45] 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) ~[na:1.7.0_45] 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) ~[na:1.7.0_45] 
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71) ~[na:1.7.0_45] 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361) ~[na:1.7.0_45] 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) ~[na:1.7.0_45] 
    at java.security.AccessController.doPrivileged(Native Method) ~[na:1.7.0_45] 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) ~[na:1.7.0_45] 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425) ~[na:1.7.0_45] 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) ~[na:1.7.0_45] 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) ~[na:1.7.0_45] 
    at java.lang.Class.forName0(Native Method) ~[na:1.7.0_45] 
    at java.lang.Class.forName(Class.java:190) ~[na:1.7.0_45] 
    at org.gridgain.grid.util.GridUtils.addLog4jNoOpLogger(GridUtils.java:7697) ~[stormjar.jar:na] 
    at org.gridgain.grid.kernal.GridGainEx.start(GridGainEx.java:732) ~[stormjar.jar:na] 
    at org.gridgain.grid.kernal.GridGainEx.start(GridGainEx.java:677) ~[stormjar.jar:na] 
    at org.gridgain.grid.kernal.GridGainEx.start(GridGainEx.java:524) ~[stormjar.jar:na] 
    at org.gridgain.grid.kernal.GridGainEx.start(GridGainEx.java:494) ~[stormjar.jar:na] 
    at org.gridgain.grid.GridGain.start(GridGain.java:314) ~[stormjar.jar:na] 

ответ

1

Похоже, у вас есть несколько несовместимых версий LOG4J банки в удаленном пути к классам приложений кластера (скорее всего, один из них является GridGain зависимость, а другой уже существующие приложения зависимость).

Вам понадобится использовать ту же версию Log4j, что и GridGain, или настроить GridGain для использования log-log log-log. Например, если вы хотите сохранить свою версию Log4j, вы можете использовать GridSlf4jLogger и правильную привязку SLF4j-to-Log4j.

1

Это может быть проблема компиляции. Попробуйте сделать чистую сборку. Это возможно из-за несоответствия файла .class между всеми зависимыми классами.

IncompatibleClassChangeError расширяет LinkageError, что связано с проблемами, возникающими из базового класса, который изменяется после компиляции дочернего класса.

более

на этом: http://examples.javacodegeeks.com/java-basics/exceptions/java-lang-incompatibleclasschangeerror-how-to-resolve-incompatible-class-change-error/

+0

Спасибо .. Это было связано с несколькими банками log4j в рамках проекта. Я очистил их и положил в сетку, и все получилось отлично. – user3072054

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