Search code examples
apache-stormgridgaintrident

Gridgain exception java.lang.IncompatibleClassChangeError: Implementing class


I am using Trident storm and trying to start a grid instance within a function prepare method. The same config file works well with local cluster.. When i submit it in remore cluster i get the error.

Code:

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

  }

Error

 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]

Solution

  • It looks like you have multiple incompatible versions of Log4j jars in your remote cluster application classpath (most likely, one of them is GridGain dependency and the other one is already existing your application dependency).

    You will need to use the same version of Log4j as GridGain does or configure GridGain to use non-log4j logging. For example, if you want to keep your version of Log4j, you can use GridSlf4jLogger and proper SLF4j-to-Log4j binding.