0

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]
user3072054
  • 339
  • 2
  • 6
  • 17

2 Answers2

1

This might be a compilation issue. Try to do a clean build. It could possibly because of mismatch in .class file between all dependent classes.

The IncompatibleClassChangeError extends the LinkageError, which is related to problems rising from a base class that changes after the compilation of a child class.

more on this : http://examples.javacodegeeks.com/java-basics/exceptions/java-lang-incompatibleclasschangeerror-how-to-resolve-incompatible-class-change-error/

user2720864
  • 8,015
  • 5
  • 48
  • 60
  • Thank you.. It was due to multiple log4j jars within the project. I did a clean up of those and put in the gridgain verison and it worked fine. – user3072054 Jan 09 '15 at 21:09
1

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.

Alexey
  • 406
  • 3
  • 6