更新:
我已经给karmasphere的创始人shevek发了邮件寻求帮助。他在ApacheCon2011上做了一个关于hadoop评测的演讲。他建议找一个可以扔掉的。可丢弃节目的挡块:
localhost: java.lang.IncompatibleClassChangeError: class com.kannan.mentor.sourcewalker.ClassInfoGatherer has interface org.objectweb.asm.ClassVisitor as super class
localhost: at java.lang.ClassLoader.defineClass1(Native Method)
localhost: at java.lang.ClassLoader.defineClass(ClassLoader.java:792)
hadoop有asm3.2jar,我使用的是5.0。在5.0中,classvisitor是一个超类,在3.2中它是一个接口。我计划将我的探查器更改为3.2。有没有其他更好的方法来解决这个问题?
顺便说一句,谢维克超级酷。一位创始人兼首席执行官,回复一些匿名的邮件。想象一下。
结束更新
我正在尝试分析hadoop(jobtracker、name节点、data节点等)。使用asm5创建了探查器。在 Spring 测试,一切正常。
然后在hadoop上以伪分布式模式测试profiler。
@Override
public byte[] transform(ClassLoader loader, String className,
Class<?> classBeingRedefined, ProtectionDomain protectionDomain,
byte[] classfileBuffer) throws IllegalClassFormatException {
try {
/*1*/ System.out.println(" inside transformer " + className);
ClassReader cr = new ClassReader(classfileBuffer);
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
/* c-start */ // CheckClassAdapter cxa = new CheckClassAdapter(cw);
ClassVisitor cv = new ClassInfoGatherer(cw);
/* c-end */ cr.accept(cv, ClassReader.EXPAND_FRAMES);
byte[] b = cw.toByteArray();
/*2*/System.out.println(" inside transformer - returning" + b.length);
return b;
} catch (Exception e) {
System.out.println( " class might not be found " + e.getMessage()) ;
try {
throw new ClassNotFoundException(className, e);
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
return null;
}
我可以看到打印的第一个sysout语句,但看不到第二个。也没有错误。如果我将/c-start/to/c-stop/注解掉,并用classfilebuffer替换cw,我可以看到第二个sysout语句。在我取消注解行的那一刻
ClassVisitor cv = new ClassInfoGatherer(cw);
classinfogatherer构造函数:
public ClassInfoGatherer(ClassVisitor cv) {
super(ASM5, cv);
}
我没有看到第二个sysout语句。
我做错什么了。hadoop正在吞下我的系统输出。我也犯了错误。即使是这样,为什么我可以看到第一个sysout语句?
任何建议都会有帮助。我想我遗漏了一些简单而明显的东西…但是我想不出来。
hadoop-env.sh中添加了以下行
导出hadoop\u namenode\u opts=“-javaagent:path to jar$hadoop\u namenode\u opts“
export hadoop\u secondarynamenode\u opts=“-path to jar$hadoop\u secondarynamenode\u opts”
导出hadoop\u datanode\u opts=“-javaagent:path to jar$hadoop\u datanode\u opts“
导出hadoop\u balancer\u opts=“-javaagent:path to jar$hadoop\u balancer\u opts“
导出hadoop\u jobtracker\u opts=“-javaagent:path to jar$hadoop\u jobtracker\u opts“
1条答案
按热度按时间lsmd5eda1#
hadoop有ASM3.2,而我使用的是ASM5。在asm5中,classvisitor是一个超类,在3.2中它是一个接口。出于某种原因,这个错误是可抛出的(归功于shevek),catch块只捕获异常。hadoop日志中没有捕获到可抛出的错误。所以,调试起来非常困难。
使用jar链接修复asm版本问题,现在一切正常。
如果您使用的是hadoop,但是有些东西不起作用,并且没有日志显示任何错误,那么请尝试捕获throwable。
阿伦