Hive源码环境搭建(二)——配置与Debug
北京时间:2020年04月27日22:30
接着上次写Hive源码环境搭建(一)源码编译,下面接着做Hive的环境配置,以及对Hive进行Debug
本人环境:
系统:macOS 10.14.6、Maven版本:3.5.4、JDK版本:1.8.0_201
IDE版本:IntelliJ IDEA 2020.1
Hive版本:3.1.1(当前最新的HIve分支4.0我也编译了)
Hadoop版本:hadoop-3.1.3(没有Hadoop的同学需要在本地搭建伪分布式环境)
1、Hive配置
-
配置Hadoop位置
- 进入
hive-rel-release-3.1.1/packaging/target/apache-hive-3.1.1-bin/apache-hive-3.1.1-bin/conf
- 目录复制目录下的
hive-env.sh.template
为hive-env.sh
(操作时发现target
被加锁了,修改一下文件的权限就行) - 添加Hadoop所在目录:
HADOOP_HOME=/code/bigdata/hadoop-3.1.3
- 进入
-
初始化Hive元数据信息
-
进入
hive-rel-release-3.1.1/packaging/target/apache-hive-3.1.1-bin/apache-hive-3.1.1-bin/
-
运行命令
bin/schematool -dbType derby -initSchema
(这里为了方便使用的是derby,也可设置为MySQL) -
看到结果,说明成功:
Metastore connection URL: jdbc:derby:;databaseName=metastore_db;create=true Metastore Connection Driver : org.apache.derby.jdbc.EmbeddedDriver Metastore connection User: APP Starting metastore schema initialization to 3.1.0 Initialization script hive-schema-3.1.0.derby.sql Initialization script completed schemaTool completed
注意:
在初始化derby时报错:
Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;) at org.apache.hadoop.conf.Configuration.set(Configuration.java:1357) at org.apache.hadoop.conf.Configuration.set(Configuration.java:1338) at org.apache.hadoop.mapred.JobConf.setJar(JobConf.java:518) at org.apache.hadoop.mapred.JobConf.setJarByClass(JobConf.java:536) at org.apache.hadoop.mapred.JobConf.<init>(JobConf.java:430) at org.apache.hadoop.hive.conf.HiveConf.initialize(HiveConf.java:5135) at org.apache.hadoop.hive.conf.HiveConf.<init>(HiveConf.java:5098) at org.apache.hive.beeline.HiveSchemaTool.<init>(HiveSchemaTool.java:96) at org.apache.hive.beeline.HiveSchemaTool.main(HiveSchemaTool.java:1473) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
造成错误的原因是:com.google.common.base.Preconditions.checkArgument 这是因为hive内依赖的guava.jar和hadoop内的版本不一致造成的。
解决方法:
查看Hadoop和Hive依赖库中
guava.jar
的版本,如果两者不一致,删除版本低的,并拷贝高版本。例如我这里是:
-
Hadoop的
guava.jar
:hadoop-3.1.3/share/hadoop/common/lib/guava-27.0-jre.jar
-
Hive的
guava.jar
:hive-rel-release-3.1.1/packaging/target/apache-hive-3.1.1-bin/apache-hive-3.1.1-bin/lib/guava-19.0.jar
很明显Hadoop的
guava.jar
更高,我将Hive中的guava.jar
,替换为Hadoop的guava.jar
-
2、项目启动
-
启动Hadoop(需要提前配置好Hadoop环境)
执行
hadoop-3.1.3/sbin
下的./start-all.sh
输出结果:
Starting namenodes on [0.0.0.0] Starting datanodes Starting secondary namenodes [localhost] Starting resourcemanager Starting nodemanagers
-
启动Hive
进入
hive-rel-release-3.1.1/packaging/target/apache-hive-3.1.1-bin/apache-hive-3.1.1-bin/
目录执行命令bin/hive --debug -hiveconf hive.root.logger=WARN,console
,启动Debug模式。输出结果:
Listening for transport dt_socket at address: 8000
3、IDEA配置
-
配置IDEA的Debug项
依次点击”Run”->”Debug…”->”Edit Configurations…“,然后点击左上角的”+”,选择”Remote”,如下图:
主要修改Host和Port
-
执行Debug
-
执行Debug
-
在IDEA上打断点就行了,程序的入口是
/hive-rel-release-3.1.1/cli/src/java/org/apache/hadoop/hive/cli/CliDriver
中的main
方法。 -
在命令行执行SQL,例如:
show databases;
-
执行结果:
-