对hadoop进行远程debug

在对hadoop的代码进行hack或者编写自己的mapreduce程序的时候,经常需要对代码进行debug,但是由于hadoop是一个分布式的系统,而且很多的进程都是多线程的,对它的代码进行debug就变得很麻烦,而且运用IBM之前contrib的哪个eclipse-plugin工具也很不方便,至今我仍然没有用那玩意跟到过任何进入hadoop内部的代码。不过由于java当中本身就通过jdwp提供了远程debug的功能,所以不妨用jdwp来debug hadoop的关键进程。
方法:
在${HADOOP_HOME}/bin 目录下,保存了用来启动和停止所有hadoop daemon进程的脚本,其中有一个hadoop-debug脚本,在这个脚本中,前面的代码无非就是判断用户输入的参数,然后根据参数来判断需要对哪个daemon进行debug,其中就包括对JobTracker,TaskTracker,Datanode,Namenode等,最关键的部分在最后一行:
exec "$JAVA" $JAVA_HEAP_MAX $HADOOP_OPTS -classpath "$CLASSPATH" $CLASS "$@"
它其实就是利用之前设置好的许多环境变量来修改当前进程为hadoop的daemon进程。这里还没有远程debug的设置。
要让它支持远程debug,之需要修改最后这一行的运行命令
exec "$JAVA" -Xdebug -Xrunjdwp:transport=dt_socket,address=$port,server=y,suspend=y $JAVA_HEAP_MAX $HADOOP_OPTS -classpath "$CLASSPATH" $CLASS "$@"
这样,在这个daemon进程启动的时候,就会监听某个用户指定的端口,来将当前进程的debug数据通过该端口的socket发送给远端。此时比如要debug datanode,就只需要运行:
$> ./hadoop-debug 8999 datanode
那么datanode进程就会启动,并监听8999端口的debug连接信息。

此时,在远程的机器上,运行eclipse,并在自己的包含hadoop代码的工程中设置远程debug参数:
run -> Debug Configuration...
在弹出的对话框中,双击Remote Java Application,新建一个远程debug的instance,然后在connect标签中填写好已经运行了hadoop daemon程序的机器的ip或者机器名,并填写正确的端口(8999),点击apply,debug,就可以连通远程的hadoop 的datanode进程,开始代码的跟踪调试了
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭