在Starfish做profile会输入如下命令: ./bin/profile hadoop jar ...*.jar <MainClass> <args...>。根据这个命令查看/bin/profile目录下面的profile文件。前面对命令格式的处理不做解释。直接看最后
# Specify the Java agent
HADOOP_OPTS="${HADOOP_OPTS} -javaagent:${MASTER_BTRACE_DIR}/btrace-agent.jar=dumpClasses=false,debug=false,unsafe=true,probeDescPath=.,noServer=true,stdout,script=${MASTER_BTRACE_DIR}/BTraceJobProfiler.class"
# Export the required hadoop parameters
export HADOOP_OPTS
export HADOOP_CLASSPATH
# Execute the hadoop command
${HADOOP_HOME}/bin/hadoop "$@"
上面可以看出用到了javaagent。javaagent是在你的main方法前的一个拦截器(interceptor),就是在main方法执行之前执行agent的代码。在javaagent中要注意的是写完代理类之后打包成jar包,在jar包里面的META-INF/MAINIFEST.MF必须包含Premain-Class这个属性。指出在main方法之前调用的代理类。不过Starfish中用到的是Btrace代理类,这个在Btrace-agent.jar中已经弄好了。script指出了真正的跟踪程序,BtraceJobProfiler.class。开始看这个源码。