您的位置:首页 > 编程语言 > Java开发

在Eclipse中远程调试Hadoop

2013-08-19 17:02 477 查看
我部署了一个Hadoop集群,但是在运行过程中总是会遇到各式的问题,虽然可以通过加一些Log来查看出错信息,但总是不太直观,并且也比较繁琐。因此最好能远程单步调试Hadoop。

在Hadoop中,一般常用的模块有:JobTracker、NameNode、DataNode、TaskTracker、JobClient、JobShell、FsShell、MapReduce等。那如何使用Eclipse来远程调试Hadoop的各个模块?

调试方法

这些Hadoop模块都对应一个个JVM进程。对Hadoop的各个模块进行远程调试本质上就是远程调试JVM。

而JVM本身就支持远程调试,只需要在各模块的JVM启动时加载以下参数:

-Xdebug
-Xrunjdwp:transport=dt_socket, address=8000,server=y,suspend=y

各参数的含义:

-Xdebug

启用调试特性

-Xrunjdwp

启用JDWP实现,包含若干子选项:

transport=dt_socket

JPDA front-end和back-end之间的传输方法。dt_socket表示使用套接字传输。

address=8000

JVM在8000端口上监听请求,这个设定为一个不冲突的端口即可。

server=y

y表示启动的JVM是被调试者。如果为n,则表示启动的JVM是调试器。

suspend=y

y表示启动的JVM会暂停等待,直到调试器连接上才继续执行。suspend=n,则JVM不会暂停等待。

suspend=y这个选项很重要。如果想调试FsShell这种在CLient端启动的命令,则必须设置suspend=y。否则调试还没有启动,FsShell命令就执行解决了。

调试举例

NameNode调试:

修改NameNode节点上的文件bin/hadoop,将

123elif [ "$COMMAND" = "namenode" ; thenCLASS='org.apache.hadoop.hdfs.server.namenode.NameNode'HADOOP_OPTS="$HADOOP_OPTS
$HADOOP_NAMENODE_OPTS"
改为:

123elif [ "$COMMAND" = "namenode" ; thenCLASS='org.apache.hadoop.hdfs.server.namenode.NameNode'HADOOP_OPTS="$HADOOP_OPTS
$HADOOP_NAMENODE_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000"
suspend等于y或n取决于是否需要调试其启动过程。

启动NameNode

在Eclipse中,在NameNode代码上设置断点用于调试,再点击右键,选择调试配置:





在对话框中选择远程Java应用程序,然后点击新建启动配置,如下图





然后输入配置的参数,如下图所示:





其中主机要填NameNode节点的地址,端口填刚配置的端口。

最后点击调试就可以开始调试了。

FS命令调试:

bin/hadoop fs 命令是运行在Client端的(NameNode也可以作为Client),因此需要修改Client上的配置文件。

修改Client节点上的文件bin/hadoop,将

123elif [ "$COMMAND" = "fs" ; thenCLASS='org.apache.hadoop.fs.FsShell'HADOOP_OPTS="$HADOOP_OPTS
$HADOOP_CLIENT_OPTS"
改为:

123elif [ "$COMMAND" = "fs" ; thenCLASS='org.apache.hadoop.fs.FsShell'HADOOP_OPTS="$HADOOP_OPTS
$HADOOP_CLIENT_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000"
必须设置suspend=y,否则还没开始调试,FsShell命令就执行结束了。

其他过程同NameNode调试,只是主机需要设置为Client的地址。

mapreduce调试:

如果想要调试Map 或Reduce Task,则修改bin/hadoop已经没用了,因为bin/hadoop中没有Map Task的启动参数。

此时需要修改Client(提交作业的Client,可以是JobTracker)中的配置文件:conf/hadoop-site.xml(不同版本的Hadoop文件名称不同,在社区版本hadoop-2.0之后叫做mapred-site.xml)。将

1234<property> <name>mapred.child.java.opts</name> <value>-Xmx800m</value></property>
改为:

1234<property> <name>mapred.child.java.opts</name> <value>-Xmx800m -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000</value></property>
在一个TaskTracker上,只能启动一个Map Task或一个Reduce Task,否则启动时会有端口冲突。因此要修改所有TaskTracker上的conf/hadoop-site.xml中的配置项:

123456789<property> <name>mapred.tasktracker.map.tasks.maximum</name> <value>1</value></property><property> <name>mapred.tasktracker.reduce.tasks.maximum</name> <value>0</value></property>
然后提交作业,再在Eclipse中启动远程调试,方法同上面一样。只是主机需要设置为TaskTracker的地址(如果有多个TaskTracker,则可能需要每个TaskTracker的地址都试一下,貌似不是所有的TaskTracker都同时进入调试状态)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: