Reputation: 359
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]
Upvotes: 0
Views: 529
Reputation: 406
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.
Upvotes: 1
Reputation: 8171
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.
Upvotes: 1