1.1在 conf/hadoop-env.sh 中添加如下修改,这样在 vtune 的结果中能看到 jit 信息。
export AMPLXE_EXPERIMENTAL=1
1.2在 bin/hadoop 中,将如下语句进行替换。
exec "$JAVA" $JAVA_HEAP_MAX $HADOOP_OPTS -classpath "$CLASSPATH" $CLASS "$@"
替换如下,以分析 tasktracker 为例,分析其他进程,作相应的修改即可。
if [ "$COMMAND" = "tasktracker" ] ; then exec "/home/chengtao/soft/intel/vtune_amplifier_xe_2011/bin64/amplxe-cl" -collect hotspots -r /home/chengtao/test_tasktracker "$JAVA" $JAVA_HEAP_MAX $HADOOP_OPTS -classpath "$CLASSPATH" $CLASS "$@" else exec "$JAVA" $JAVA_HEAP_MAX $HADOOP_OPTS -classpath "$CLASSPATH" $CLASS "$@" fi
这样修改的作用在于,让 vtune 启动相应的线程,能够收集数据。
1.3在 bin/hadoop-daemon.sh 中,将下面语句进行替换
echo $! > $pid
替换内容如下
if [ "$command" = "tasktracker" ];then sleep 3 ps aux | grep -v "vtune" | grep "TaskTracker" | awk '{if(NR==1)print $2}' > $pid else echo $! > $pid fi
这样修改的作用在于,将实际起来的 tasktracker id 写到 $pid 中,否则写入的是 vtune 的进程的 id ,在运行 bin/stop-all.sh 的时候, tasktracker 的进程是 stop 不掉的。 Sleep 3 是为了等 tasktracker 确实已经起来了。
这里需要修改 hadoop 的代码,使得 taskrunner 启动的时候,是试用 vtune 起来的。代码的具体修改是在 mapred/org/apache/hadoop/mapred/TaskRunner.java 这个文件中。在vargs.add(jvm.toString()); 之前添加。
vargs.add("/home/hadoop/vtune/vtune_amplifier_xe_2011/bin64/amplxe-cl"); vargs.add("-collect"); vargs.add("hotspots"); vargs.add("-r"); vargs.add("/home/hadoop/" + taskid.toString());
这样就可以分析实际跑任务的线程了。会在 /home/hadoop 目录下出现较多的 taskid 目录,每个目录下对应着 taskid 这个线程的分析结果
通过上面的修改,可以使用 vtune 对 hadoop 进行不同层面的分析,对 hadop 的优化或许提供很好的思路。