我部署了一个Hadoop集群,但是在运行过程中总是会遇到各式的问题,虽然可以通过加一些Log来查看出错信息,但总是不太直观,并且也比较繁琐。因此最好能远程单步调试Hadoop。
在Hadoop中,一般常用的模块有:JobTracker、NameNode、DataNode、TaskTracker、JobClient、JobShell、FsShell、MapReduce等。那如何使用Eclipse来远程调试Hadoop的各个模块?
调试方法
这些Hadoop模块都对应一个个JVM进程。对Hadoop的各个模块进行远程调试本质上就是远程调试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调试:
改为:
suspend等于y或n取决于是否需要调试其启动过程。
其中主机要填NameNode节点的地址,端口填刚配置的端口。
改为:
改为:
在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,将
改为:
suspend等于y或n取决于是否需要调试其启动过程。
- 启动NameNode
- 在Eclipse中,在NameNode代码上设置断点用于调试,再点击右键,选择调试配置:
- 在对话框中选择远程Java应用程序,然后点击新建启动配置,如下图
- 然后输入配置的参数,如下图所示:
其中主机要填NameNode节点的地址,端口填刚配置的端口。
- 最后点击调试就可以开始调试了。
FS命令调试:
- bin/hadoop fs 命令是运行在Client端的(NameNode也可以作为Client),因此需要修改Client上的配置文件。
- 修改Client节点上的文件bin/hadoop,将
改为:
- 必须设置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)。将
改为:
- 在一个TaskTracker上,只能启动一个Map Task或一个Reduce Task,否则启动时会有端口冲突。因此要修改所有TaskTracker上的conf/hadoop-site.xml中的配置项:
- 然后提交作业,再在Eclipse中启动远程调试,方法同上面一样。只是主机需要设置为TaskTracker的地址(如果有多个TaskTracker,则可能需要每个TaskTracker的地址都试一下,貌似不是所有的TaskTracker都同时进入调试状态)。