远程调试HBase
步骤:
1 修改HBASE_HOME/bin/hbase文件,增加-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=10444
如
figure out which class to run if [ “ C O M M A N D " = " s h e l l " ] ; t h e n e l i f [ " COMMAND" = "shell" ] ; then elif [ " COMMAND"="shell"];thenelif["COMMAND” = “master” ] ; then CLASS=‘org.apache.hadoop.hbase.master.HMaster’
HBASE_OPTS=“ H B A S E O P T S − X d e b u g − X r u n j d w p : t r a n s p o r t = d t s o c k e t , s e r v e r = y , s u s p e n d = n , a d d r e s s = 10444 " e l i f [ " HBASE_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=10444" elif [ " HBASEOPTS−Xdebug−Xrunjdwp:transport=dtsocket,server=y,suspend=n,address=10444"elif["COMMAND” = “regionserver” ] ; then
CLASS=‘org.apache.hadoop.hbase.regionserver.HRegionServer’ elif [ “$COMMAND” = “rest” ] ; then CLASS=‘org.apache.hadoop.hbase.rest.Dispatcher’ elif [
“ C O M M A N D " = " t h r i f t " ] ; t h e n C L A S S = ′ o r g . a p a c h e . h a d o o p . h b a s e . t h r i f t . T h r i f t S e r v e r ′ e l i f [ " COMMAND" = "thrift" ] ; then CLASS='org.apache.hadoop.hbase.thrift.ThriftServer' elif [ " COMMAND"="thrift"];thenCLASS=′org.apache.hadoop.hbase.thrift.ThriftServer′elif["COMMAND” = “migrate” ] ; then
CLASS=‘org.apache.hadoop.hbase.util.Migrate’ elif [ “$COMMAND” = “zookeeper” ] ; then CLASS=‘org.apache.hadoop.hbase.zookeeper.HQuorumPeer’ else
CLASS=$COMMAND fi
2 修改HBASE_HOME/conf/hbase-site.xml文件
zookeeper.session.timeout 300000 ZooKeeper session timeout. This option is not used by HBase directly, it
is for the internals of ZooKeeper. HBase merely passes it in whenever a connection is established to ZooKeeper. It is used by ZooKeeper for hearbeats. In
milliseconds. hbase.zookeeper.property.tickTime 2000000 Property from
ZooKeeper’s config zoo.cfg. The number of milliseconds of each tick.
bin/start-hbase.xml,启动HBase集群。
3 设置eclipse
选择Remote Java Application,右键New
写入名字,选择要调试的工程
默认Connection Type(Socket Attach)
写入Host和port,点击Apply,Debug.
可以通过lsof -i 10444查看是否连接上。
4 加入断点,进行调试
在源码中createTable函数加断点
在远程hbase shell中写:create ‘t1’,‘f1’
即可进入断点处
远程调试是JDWP提供的,通过Agent Library的形式加载到JVM中,所以与编译无关,只要运行Java程序时加入调试参数即可。
我们通过IDE来创建调试配置,以Intellij IDEA为例,选择Edit Configurations,添加Remote,就可以看到IDE提供的调试参数,把它加到Java的运行参数里就可以了。
在运行脚本start-hbase.sh时,实际执行在bin/hbase文件中。修改bin/hbase文件,把调试参数加进去,只要在最终执行java之前加入就行,为了方便查找,我加在了最后一段之前。调试时如果配置了两个进程都开启调试,会导致抢占同一个端口,可以一次只调试一个进程或者修改端口号来避免冲突。
…
####################################################################
masa’s remote debugger
####################################################################
REMOTE_DEBUGGER="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=localhost:5005"
调试Master
if [ “$COMMAND” = “master” ] ; then
if [ “$1” != “stop” ] && [ “$1” != “clear” ] ; then
HBASE_OPTS="$HBASE_OPTS $REMOTE_DEBUGGER"
fi
fi
调试RegionServer
if [ “$COMMAND” = “regionserver” ] ; then
if [ “
1
"
!
=
"
s
t
o
p
"
]
;
t
h
e
n
H
B
A
S
E
O
P
T
S
=
"
1" != "stop" ] ; then HBASE_OPTS="
1"!="stop"];thenHBASEOPTS="HBASE_OPTS $REMOTE_DEBUGGER”
fi
fi
################################# END ##############################
HEAP_SETTINGS="$JAVA_HEAP_MAX $JAVA_OFFHEAP_MAX"
Exec unless HBASE_NOEXEC is set.
export CLASSPATH
if [ “
H
B
A
S
E
N
O
E
X
E
C
"
!
=
"
"
]
;
t
h
e
n
"
{HBASE_NOEXEC}" != "" ]; then "
HBASENOEXEC"!=""];then"JAVA” -Dproc_$COMMAND -XX:OnOutOfMemoryError=“kill -9 %p” $HEAP_SETTINGS $HBASE_OPTS
C
L
A
S
S
"
CLASS "
CLASS"@"
else
exec “KaTeX parse error: Expected group after '_' at position 13: JAVA" -Dproc_̲COMMAND -XX:OnOutOfMemoryError=“kill -9 %p” $HEAP_SETTINGS $HBASE_OPTS
C
L
A
S
S
"
CLASS "
CLASS"@”
fi
这时运行start-hbase.sh,IDE中运行Debug,就可以断点到了。
调试HBase时,还需要将zookeeper.session.timeout、hbase.zookeeper.property.tickTime、hbase.rpc.timeout、hbase.client.operation.timeout、hbase.client.scanner.timeout.period等参数时间设的长一些,以免因为调试时间过长导致连接超时断开、Server关闭等问题。
————————————————
在远程hbase shell中写:create ‘t1’,‘f1’
即可进入断点处
在HTable.java中的如下方法加入断点即可调试
public void put(final Put put) throws IOException {
getBufferedMutator().mutate(put);
if (autoFlush) {
flushCommits();
}
}