使用vtune分析hadoop

  • 1.       使用 vtune 分析 tasktracker,jobtracker,datanode

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 确实已经起来了。

 

  • 2.       使用 vtune 分析任务线程TaskRunner

这里需要修改 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 这个线程的分析结果

 

  • 3.      总结

通过上面的修改,可以使用 vtune hadoop 进行不同层面的分析,对 hadop 的优化或许提供很好的思路。

 

你可能感兴趣的:(hadoop)