hbase-window|hbase-window idea调试源码

个人觉得debug运行代码是理解代码最为有效的方式,所以今天说一下在window上使用idea进行调试运行hbase源码(使用的是cdh版本的hbase)。下面将从环境配置、源码编译、配置修改以及运行四个方面进行讲解。
环境配置 1).下载源码,本次讲解的是cdh的hbase,所以git地址为:https://github.com/cloudera/hbase.git
2).idea环境配置,使用idea打开下载的pom文件,进行下面图片所示的配置
hbase-window|hbase-window idea调试源码
文章图片
hbase-window|hbase-window idea调试源码
文章图片
hbase-window|hbase-window idea调试源码
文章图片
3)切换hbase源码版本。
hbase-window|hbase-window idea调试源码
文章图片
maven源码编译 1)执行命令:mvn clean validate。
出现如下所示异常

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:1.4 enforce (min-maven-min-java-banned-xerces) on project hbase: Some Enforcer rules have failed. Look above for specific messages explaining why the rule failed.
修改pom文件中的java版本,修改前后对比如下图:
hbase-window|hbase-window idea调试源码
文章图片
2)执行命令:mvn compiler
修改pom文件,如下图所示:
hbase-window|hbase-window idea调试源码
文章图片
3)执行命令:mvn clean package
出现如下所示异常:
[ERROR] Failed to execute goal org.codehaus.mojo:findbugs-maven-plugin:3.0.0:findbugs (default) on project hbase: Unable to parse configuration of mojo org.codehaus.mojo:findbugs-maven-plugin:3.0.0:findbugs for parameter pluginArtifacts: Cannot assign configuration entry 'pluginArtifacts' with value '${plugin.artifacts}' of type java.util.Collections.UnmodifiableRandomAccessList to property of type java.util.ArrayList -> [Help 1]
pom文件中注释掉:findbugs-maven-plugin,如下图所示
hbase-window|hbase-window idea调试源码
文章图片
4)执行命令:mvn clean package-Dmaven.test.skip=true
出现如下所示异常:
maven-antrun-plugin Cannot run program "bash" in directory
将git的bin路径添加到环境变量中的path,重启idea。
出现如下所示异常:
exec-maven-plugin Cannot run program "env" (in directory
将D:\softpath\Git\usr\bin添加到环境变量中的path,重启idea。
出现如下所示异常:
编译成功之后在idea中显示找不到proto生成的java文件中的类
因为在idea中将文件超过2500k的文件不当java类看,将D:\softpath\IntelliJ IDEA
将D:\softpath\IntelliJ IDEA 2018.2.8\bin\idea.properties文件中的idea.max.intellisense.filesize属性调大,重启idea即可。
修改文件 1)修改hbase\conf\hbase-site.xml配置文件中的内容


hbase.defaults.for.version.skip
true


zookeeper.session.timeout
100001
将zk timeout设置大,避免在debug过程中出现timeout,影响调试。


zookeeper.session.timeout.localHBaseCluster
100002

设置本地zk timeout时间,
本地模式HMasterCommandLine类中的startMaster方法会将zookeeper.session.timeout.localHBaseCluster设置给zookeeper.session.timeout



hbase.tmp.dir
D:\tmp\hbasedir
Temporary directory on the local filesystem.
Change this setting to point to a location more permanent
than '/tmp', the usual resolve for java.io.tmpdir, as the
'/tmp' directory is cleared on machine restart.



hbase.zookeeper.property.maxSessionTimeout
500000


hbase.master.port
60000
设置端口,避免重启之后端口发生变化


hbase.regionserver.port
60020
设置端口,避免重启之后端口发生变化


hbase.regionserver.info.port
60030
设置端口,避免重启之后端口发生变化


2)修改代码
修改LocalHBaseCluster.java文件中,将一些固定值参数注释,如下图所示:
hbase-window|hbase-window idea调试源码
文章图片
防止本地调试时重新分配master的端口,导致和zk中存储的active master的端口不一致,从而报错hbase Master not active after 30 seconds,无法成为active master。
启动 hmaster启动
1)添加hbase-server的resource文件夹
hbase-window|hbase-window idea调试源码
文章图片
2)配置hmaster启动参数
hbase-window|hbase-window idea调试源码
文章图片
3)启动hmaster
出现如下异常
org.apache.hadoop.io.nativeio.NativeIO$Windows.createFileWithMode0(Ljava/lang/String; JJJI)Ljava/io/F
跟踪到源码在Windows环境中会执行System.loadLibrary("hadoop"); 代码加载hadoop.dll文件,将环境变量path中路径中的hadoop.dll文件移除即可启动。
启动hbase-shell
1)配置hbase-shell启动参数
hbase-window|hbase-window idea调试源码
文章图片
VM options:-Dhbase.ruby.sources=D:\hadoop\hbase\hbase-cdh-src\hbase\hbase\hbase-shell\src\main\ruby -Dlog4j.configuration=file:D:\hadoop\hbase\hbase-cdh-src\hbase\hbase\conf\log4j.properties
启动完成后可以在console窗口执行shell命令。
配置完成之后就在关注的源码中打上断点进行调试即可,尽情在源码的世界中遨游吧。
【hbase-window|hbase-window idea调试源码】今天的分享就到这,有看不明白的地方一定是我写的不够清楚,所有欢迎提任何问题以及改善方法。

    推荐阅读