分析hadoop

8ulbf1ek  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(384)

更新:
我已经给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“

lsmd5eda

lsmd5eda1#

hadoop有ASM3.2,而我使用的是ASM5。在asm5中,classvisitor是一个超类,在3.2中它是一个接口。出于某种原因,这个错误是可抛出的(归功于shevek),catch块只捕获异常。hadoop日志中没有捕获到可抛出的错误。所以,调试起来非常困难。
使用jar链接修复asm版本问题,现在一切正常。
如果您使用的是hadoop,但是有些东西不起作用,并且没有日志显示任何错误,那么请尝试捕获throwable。
阿伦

相关问题