剖析 Hadoop

Profiling Hadoop

更新:

我已经给 Karmasphere 的创始人 Shevek 发了邮件寻求帮助。他在 ApacheCon 2011 上做了关于 hadoop 分析的演讲。他建议寻找 Throwable。 Throwable 节目的捕捉块:

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.2 jar,我用的是 5.0。在 5.0 中,ClassVisitor 是一个超级 Class,在 3.2 中它是一个接口。我打算将我的探查器更改为 3.2。有没有其他更好的方法来解决这个问题?

BTW, Shevek is super cool. A Founder and CEO, responding to some anonymous guys emails. Imagine that.

更新结束

我正在尝试分析 Hadoop(JobTracker、名称节点、数据节点等)。使用 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 / 注释掉到 / c-stop*/ 并将 cw 替换为 classFileBuffer,我可以看到第二个 sysout 语句。我取消注释行

的那一刻
ClassVisitor cv = new ClassInfoGatherer(cw);

ClassInfoGatherer 构造函数:

public ClassInfoGatherer(ClassVisitor cv) {
super(ASM5, cv);

}

我没有看到第二个 sysout 语句。

我在这里做错了什么。 Hadoop 吞噬了我的系统输出吗?也试过 sys 错误。即使是这样,为什么我能看到第一个 sysout 语句?

任何建议都会有所帮助。我想我在这里遗漏了一些简单而明显的东西......但无法弄清楚。

已将以下行添加到 hadoop-env.sh

导出 HADOOP_NAMENODE_OPTS="-javaagent:jar 的路径 $HADOOP_NAMENODE_OPTS"

export HADOOP_SECONDARYNAMENODE_OPTS="-jar 的路径 $HADOOP_SECONDARYNAMENODE_OPTS"

导出 HADOOP_DATANODE_OPTS="-javaagent:jar 的路径 $HADOOP_DATANODE_OPTS"

导出 HADOOP_BALANCER_OPTS="-javaagent:jar 的路径 $HADOOP_BALANCER_OPTS"

导出 HADOOP_JOBTRACKER_OPTS="-javaagent:jar 的路径 $HADOOP_JOBTRACKER_OPTS"

Hadoop 有 asm 3.2,而我使用的是 ASM 5。在 ASM5 中,ClassVisitor 是一个超类,在 3.2 中它是一个接口。出于某种原因,错误是一个 Throwable(归功于 Shevek)并且 catch 块仅捕获异常。在任何 hadoop 日志中都没有捕获到可抛出的错误。因此,调试起来非常困难。

使用 jar jar 链接修复了 asm 版本问题,现在一切正常。

如果您正在使用 Hadoop 并且某些东西无法正常工作并且没有日志显示任何错误,那么请尝试捕获 Throwable。

阿润