Windows下 IDEA DEBUG hiveMetastore hive2.3.9
环境准备
- 编译好hive2.3.9源码,参考文档编译hive2.3.9源码
- 准备好Mysql库,并手动创建schema,相关sql文件:
hive-schema-2.3.0.mysql.sql
和hive-txn-schema-2.3.0.mysql.sql
。
启动前配置
在为配置完成之前,不要执行启动命令。
重点:为了不被idea的编译程序影响,现在启动类的配置上,一定要勾选“运行前不编译”的选项。
先启动HiveMetaStore,在启动CliDriver。
HiveMetaStore启动配置
-
修改metastore模块中的
pom.xml
文件<!--新增依赖--> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>${project.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.29</version> <scope>runtime</scope> </dependency> <!--调整依赖作用域,不调整会导致问题一(见问题小结)--> <dependency> <groupId>com.lmax</groupId> <artifactId>disruptor</artifactId> <version>${disruptor.version}</version> <!-- <scope>test</scope>--> </dependency>
-
在metastore模块的编译输出文件target下的class文件夹中配置
hive-site.xml
文件,主要增加元数据存储库的配置(采用Mysql数据库),其他配置可以采用默认。<property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://198.168.1.1:3309/test_local_metastore?characterEncoding=UTF-8</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.cj.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>localhivemeta</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>localhivemeta</value> </property>
-
配置HiveMetastore的启动类
在启动的时候,禁止idea自动重新编译源码。
ObjectStore
类是应用逻辑和包含对象的数据库存储之间的接口,可以从数据库和文件存储中存取。
CliDriver启动配置
-
修改
hive-cli
模块中的pom文件,将commons-io
,和disruptor
范围取消test限制。 -
在hive-cli模块的编译输出文件target下的class文件夹中配置
hive-site.xml
文件,主要是配置元数据服务的地址<!-- hive 元数据链接地址 HA--> <property> <name>hive.metastore.uris</name> <value>thrift://198.168.1.2:9083</value> <final>true</final> </property>
-
配置Cli的启动类
-Djline.WindowsTerminal.directConsole=false
HADOOP_USER_NAME=bigdata;HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_HOME}/lib/native;HADOOP_OPTS=-Djava.library.path=$HADOOP_HOME/lib;HADOOP_HOME=E:\hadoop\hadoop-2.9.1
Debug举例:创建hive库
依次启动HiveMetaStore和CliDriver。
在CliDriver启动的控制台中,输入创建Hive的命令,在类CliDriver
的main方法中一步步debug吧。
比如创建库,在调用元数据服务之前的逻辑在CliDriver的控制台中,可以在调用元数据服务之前的逻辑在HiveMetaStore的控制台中
create DATABASE if not EXISTS test20230423 COMMENT '测试的库' WITH DBPROPERTIES ('createUser'='顾栋','date'='20230423');
断点位置
DDLTask
类中的方法public int execute(DriverContext driverContext)
ObjectStore
类中方法public void createDatabase(Database db) throws InvalidObjectException, MetaException
问题小结
问题一:log4j2日志框架导致的问题
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
Exception in thread "main" java.lang.NoClassDefFoundError: com/lmax/disruptor/EventTranslatorVararg
调整disruptor依赖范围即可
问题二:持久化问题
MetaException(message:The class "org.apache.hadoop.hive.metastore.model.MDatabase" is not persistable. This means that it either hasnt been enhanced, or that the enhanced version of the file is not in the CLASSPATH (or is hidden by an unenhanced version), or the Meta-Data/annotations for the class are not found.)
这个问题是通过重新git clone项目重新编译,重新配置解决的。之前的配置启动中没有勾选“运行前不编译”的选项。不知道编译出来了啥导致这个问题。