【背景】
我正在用SpringBoot框架写一个数据治理项目,目前所处阶段是将hive和hdfs中的元数据提取出来,存储到MySQL中,我的hive和hdfs上的数据存储在三台Linux服务器上(hadoop102-104),MySQL在我本地Windows上
【问题】
在我启动SpringBoot服务,准备将hive元数据提取到MySQL中时,发现hive中的数据可以正常提取到(通过打断点能看到81张能正常出来),
但MySQL就是不显示
【原因】
原因1、Service模块和Mapper模块的类(接口)上没标明是我本地MySQL的数据源@DS("xxx")
原因2、application.properties这个文件中镜像源没写成动态的
原因3、(我的认知问题)SpringBoot中的主类(main方法)【DgaApplication】只负责启动服务,并不负责Hive数据提取和MySQL数据装载(当然前提是你没在main里调用该方法),我以为启动服务了里面所有的类都会自动执行,并没有在test模块测试【testMetaStore】(用于将hive数据装载到MySQL)这个方法,傻了傻了。
【解决】
原因1的解决:在Service,Mapper模块接口和类上都加上@DS("dga-local")
(这个按理说在Mapper接口上加了注解,在Service上可以不接,但我都加,确保万无一失)
原因2的解决:application.properties文件中改为动态数据源
hive.metastore.server.url=thrift://hadoop102:9083
# Linux集群上的MySQL
spring.autoconfigure.exclude=com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
spring.datasource.dynamic.datasource.dga.url=jdbc:mysql://hadoop102:3306/dga?characterEncoding=utf-8&useSSL=false&&allowPublicKeyRetrieval=true
spring.datasource.dynamic.datasource.dga.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.dynamic.datasource.dga.username=root
spring.datasource.dynamic.datasource.dga.password=000000
spring.datasource.dynamic.datasource.dga.druid.initial-size=5
spring.datasource.dynamic.datasource.dga.druid.min-idle=5
spring.datasource.dynamic.datasource.dga.druid.max-active=20
spring.datasource.dynamic.datasource.dga.druid.max-wait=60000
spring.datasource.dynamic.datasource.dga.druid.test-on-borrow=true
spring.datasource.dynamic.datasource.dga.druid.test-while-idle=true
spring.datasource.dynamic.datasource.dga.druid.test-on-return=false
# 自己本地Windows的MySQL
spring.datasource.dynamic.datasource.dga_local.url=jdbc:mysql://localhost:3306/dga?characterEncoding=utf-8&useSSL=false&&allowPublicKeyRetrieval=true
spring.datasource.dynamic.datasource.dga_local.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.dynamic.datasource.dga_local.username=root
spring.datasource.dynamic.datasource.dga_local.password=123456
spring.datasource.dynamic.datasource.dga_local.druid.initial-size=5
spring.datasource.dynamic.datasource.dga_local.druid.min-idle=5
spring.datasource.dynamic.datasource.dga_local.druid.max-active=20
spring.datasource.dynamic.datasource.dga_local.druid.max-wait=60000
spring.datasource.dynamic.datasource.dga_local.druid.test-on-borrow=true
spring.datasource.dynamic.datasource.dga_local.druid.test-while-idle=true
spring.datasource.dynamic.datasource.dga_local.druid.test-on-return=false
注意标红的这段代码也要加,否则可能会报错:spring.datasource.dynamic.datasource.dga_local.url=jdbc:mysql://localhost:3306/dga?characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true
原因3的解决:在test类中执行装载方法
@Test
void testMetaStore() throws Exception {
tableMetaInfoServiceImpl.initTableMeta("gmall","2022-05-22");
}
主类启动以后,再test模块中调用一次这个方法:
上述操作都更改后,再查看MySQL数据
成功~