当前位置:   article > 正文

记录一个写SpringBoot中Hive数据可以正常提取但无法存到MySQL的bug

记录一个写SpringBoot中Hive数据可以正常提取但无法存到MySQL的bug

【背景】

我正在用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文件中改为动态数据源

  1. hive.metastore.server.url=thrift://hadoop102:9083
  2. # Linux集群上的MySQL
  3. spring.autoconfigure.exclude=com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
  4. spring.datasource.dynamic.datasource.dga.url=jdbc:mysql://hadoop102:3306/dga?characterEncoding=utf-8&useSSL=false&&allowPublicKeyRetrieval=true
  5. spring.datasource.dynamic.datasource.dga.driver-class-name=com.mysql.cj.jdbc.Driver
  6. spring.datasource.dynamic.datasource.dga.username=root
  7. spring.datasource.dynamic.datasource.dga.password=000000
  8. spring.datasource.dynamic.datasource.dga.druid.initial-size=5
  9. spring.datasource.dynamic.datasource.dga.druid.min-idle=5
  10. spring.datasource.dynamic.datasource.dga.druid.max-active=20
  11. spring.datasource.dynamic.datasource.dga.druid.max-wait=60000
  12. spring.datasource.dynamic.datasource.dga.druid.test-on-borrow=true
  13. spring.datasource.dynamic.datasource.dga.druid.test-while-idle=true
  14. spring.datasource.dynamic.datasource.dga.druid.test-on-return=false
  15. # 自己本地Windows的MySQL
  16. spring.datasource.dynamic.datasource.dga_local.url=jdbc:mysql://localhost:3306/dga?characterEncoding=utf-8&useSSL=false&&allowPublicKeyRetrieval=true
  17. spring.datasource.dynamic.datasource.dga_local.driver-class-name=com.mysql.cj.jdbc.Driver
  18. spring.datasource.dynamic.datasource.dga_local.username=root
  19. spring.datasource.dynamic.datasource.dga_local.password=123456
  20. spring.datasource.dynamic.datasource.dga_local.druid.initial-size=5
  21. spring.datasource.dynamic.datasource.dga_local.druid.min-idle=5
  22. spring.datasource.dynamic.datasource.dga_local.druid.max-active=20
  23. spring.datasource.dynamic.datasource.dga_local.druid.max-wait=60000
  24. spring.datasource.dynamic.datasource.dga_local.druid.test-on-borrow=true
  25. spring.datasource.dynamic.datasource.dga_local.druid.test-while-idle=true
  26. 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类中执行装载方法

  1. @Test
  2. void testMetaStore() throws Exception {
  3. tableMetaInfoServiceImpl.initTableMeta("gmall","2022-05-22");
  4. }

主类启动以后,再test模块中调用一次这个方法:

上述操作都更改后,再查看MySQL数据

成功~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/620558
推荐阅读
相关标签
  

闽ICP备14008679号