个人觉得debug运行代码是理解代码最为有效的方式,所以今天说一下在window上使用idea进行调试运行hbase源码(使用的是cdh版本的hbase)。下面将从环境配置、源码编译、配置修改以及运行四个方面进行讲解。
环境配置
1).下载源码,本次讲解的是cdh的hbase,所以git地址为:https://github.com/cloudera/hbase.git
2).idea环境配置,使用idea打开下载的pom文件,进行下面图片所示的配置
3)切换hbase源码版本。
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版本,修改前后对比如下图:
2)执行命令:mvn compiler
修改pom文件,如下图所示:
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,如下图所示
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配置文件中的内容
<configuration>
<property>
<name>hbase.defaults.for.version.skip</name>
<value>true</value>
</property>
<property>
<name>zookeeper.session.timeout</name>
<value>100001</value>
<description>将zk timeout 设置大,避免在debug过程中出现timeout,影响调试。 </description>
</property>
<property>
<name>zookeeper.session.timeout.localHBaseCluster</name>
<value>100002</value>
<description>
设置本地zk timeout时间,
本地模式HMasterCommandLine类中的startMaster方法会将zookeeper.session.timeout.localHBaseCluster设置给zookeeper.session.timeout
</description>
</property>
<property>
<name>hbase.tmp.dir</name>
<value>D:\tmp\hbasedir</value>
<description>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.
</description>
</property>
<property>
<name>hbase.zookeeper.property.maxSessionTimeout</name>
<value>500000</value>
</property>
<property>
<name>hbase.master.port</name>
<value>60000</value>
<description> 设置端口,避免重启之后端口发生变化 </description>
</property>
<property>
<name>hbase.regionserver.port</name>
<value>60020</value>
<description>设置端口,避免重启之后端口发生变化 </description>
</property>
<property>
<name>hbase.regionserver.info.port</name>
<value>60030</value>
<description>设置端口,避免重启之后端口发生变化 </description>
</property>
</configuration>
2)修改代码
修改LocalHBaseCluster.java文件中,将一些固定值参数注释,如下图所示:
防止本地调试时重新分配master的端口,导致和zk中存储的active master的端口不一致,从而报错hbase Master not active after 30 seconds,无法成为active master。
启动
hmaster启动
1)添加hbase-server的resource文件夹
2)配置hmaster启动参数
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启动参数
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命令。
配置完成之后就在关注的源码中打上断点进行调试即可,尽情在源码的世界中遨游吧。
今天的分享就到这,有看不明白的地方一定是我写的不够清楚,所有欢迎提任何问题以及改善方法。