本地是windows开发环境,程序部署在远程的hadoop或hbase集群下,进行remote debug需要进行如下配置:
1. 事前准备
hadoop和hbase都是分布式集群,你不可能在同一时刻监听所有的节点,你需要引选择好一个节点,而这个节点的所承载的角色必须能执行到你需要debug的代码。比如:如果你要调试一个RegionObserver的某些代码,那么你需要选择一个region server作为remote debug的对象,而且region最好要balancer一下,然后根据你输入的数据来预判哪一个region server将会处理这个请求,一种更方便的做法是:关闭除调试节点之外的所有的region server,只建立一个region,这样调试起来会更加方便。然后再在该server上开启remote debug.
另外,为了避免在调试过程中由于请求超时而导致地调试中断,可以适当的延长请求的超时时间,以HBase为例,你需要修改hbase-site.xml文件中的zookeeper.session.timeout和hbase.zookeeper.property.tickTime的参数值,其中,timeout应该取2-20倍tickTime之间的值。生产环境上timeout最好不要超过1分钟,此处为了调试,我们设置为1个小时。
zookeeper.session.timeout 3600000 hbase.zookeeper.property.tickTime 180000
2. Client端(IDE)设置
这个不同的IDE都大同小异,没有需要特别说明的,本文以intellij为例,使用如下配置:
3. Server端设置
Server端的设置就是要找到启动相应服务的shell脚本,在脚本里把 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005这样一段jvm参数配置写到启动服务的命令行中去,我们以hbase regionserver为例,启动的这个服务的脚本是HBASE_HOME下的bin/hbase文件,打开该文件找到启动regionserver的命令行,在设置HBASE_OPTS的地方把我们的remote debug相关的jvm参数加进去,如下图:
如果想要调试hbase master或datanode,tasktracker等服务也是到相应的启动脚本里去这样追加,本文不再赘述, 但是需要注意的是:由于一个节点可能兼任多种角色,一定在恰当的位置添加调试参数,如果位置不当,后续的服务在启动时如果也重复要求占用调试端口,而该端口已经被前面启动的服务所占用,这就会导致后续的服务无法启动。比如:当一个node既是hbase master又是hbase regionserver时,如果你在hbase脚本的不正确的位置上加入调试参数,如果hbase master先启动,并且占用了调试端口,那么后续的hbase regionserver服务无法启动了,反过来如果是hbase regionserver服务先启动,那么hbase master就无法启动了。
4. 代理问题
如果我们的远程主机是通过代理访问的话,会有一个小麻烦,那就是java的remote debug不支持代理设置,这样本地就无法连接到远程server上,解决方法就是使用ssh的tunnel功能建立一个正向隧道(方向是:Local),把远程主机的调试端口5005映射到本地,这样就可以像调试本地应用一样方便了。要特别提醒的是:为了避免不必要的麻烦,最好不要在该ssh连接上执行任何命令,需要操作远程主机应该再开一个新的无tunnel的ssh连接!以 putty为例,配合上述配置,设定如下: