剖析 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。
阿润
更新:
我已经给 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。
阿润