最近大数据服务端项目开发需要springboot框架通过impala查询工具直接查hadoop的HDFS数据源,同时也需要查大数据聚合mysql数据,需要实现双数据源
所以研究了下,在springboot框架下,通过java语言来连接impala查询工具,实现数据仓库数据查询。
整个过程分为两大部分,第一部分:springboot集成mybatis+impala。第二部分,实现mysql和impala双数据源
第一部分:springboot集成mybatis详细过程不重复,下面的操作都是认为已经配置好mybatis环境的情况下做的。
1、引入impala驱动jar包,该jar包不在maven仓库中,需要自行下载,下载地址链接: https://pan.baidu.com/s/1wlLsrDvZliuwL_qGtND7nw?pwd=sivw
提取码: sivw
2、下载完毕建议推送到私服仓库,推送方法:
mvn deploy:deploy-file -DgroupId=com.cloudera -DartifactId=impala-jdbc41 -Dversion=2.6.3-SNAPSHOT -Dpackaging=jar -Dfile=F:\Repository\impala\impala-jdbc41\2.6.3\ImpalaJDBC41.jar -Durl=http://xx.xx.xx.xx:8081/repository/maven-snapshots/ -DrepositoryId=snapshots
3、推送完毕,项目就可以引用了,引用方式如下:
<dependency> <groupId>com.cloudera</groupId> <artifactId>impala-jdbc41</artifactId> <version>2.6.3-SNAPSHOT</version> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>1.2.1</version> <exclusions> <exclusion> <artifactId>slf4j-log4j12</artifactId> <groupId>org.slf4j</groupId> </exclusion> <exclusion> <artifactId>servlet-api</artifactId> <groupId>javax.servlet</groupId> </exclusion> <exclusion> <artifactId>geronimo-jaspic_1.0_spec</artifactId> <groupId>org.apache.geronimo.specs</groupId> </exclusion> <exclusion> <groupId>org.eclipse.jetty.aggregate</groupId> <artifactId>jetty-all</artifactId> </exclusion> </exclusions> </dependency>
以上,因为hive-jdbc的jar包依赖,导致了多个jar包的冲突,jar包冲突导致服务启动不了,所以hive下面加入了jar包排除。
第二部分:从单数据源变成impala和mysql双数据源
1、引入动态数据源jar包
<dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>3.4.0</version> </dependency>
2、在yml中配置多数据源
spring: application: name: xx-xx main: #多个FeignClient对应一个value allow-bean-definition-overriding: true cloud: nacos: config: server-addr: nacos-headless.ms-nacos.svc.cluster.local:8848 namespace: c693d7a3-c02d-48bb-9e18-a1331f81fe63 group: DEFAULT_GROUP file-extension: yml shared-configs[0]: data-id: xx-xx-xx.yml -------引入的公共配置 group: DEFAULT_GROUP refresh: true datasource: dynamic: primary: mysqlDataSource #设置默认的数据源或者数据源组,默认值即为master strict: false #设置严格模式,默认false不启动. 启动后在未匹配到指定数据源 datasource: mysqlDataSource: username: xxxx password: xxxxxx url: jdbc:mysql://xx.xx.xx.xx:3306/xx?allowMultiQueries=true driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource impalaDataSource: url: jdbc:impala://xx.xx.xx.xx:21050/test driver-class-name: com.cloudera.impala.jdbc41.Driver type: com.alibaba.druid.pool.DruidDataSource ########## 连接池 配置 ########## druid: # 配置初始化大小、最小、最大 initial-size: 5 minIdle: 5 max-active: 16 # 配置获取连接等待超时的时间(单位:毫秒) max-wait: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 time-between-eviction-runs-millis: 2000 # 配置一个连接在池中最小生存的时间,单位是毫秒 min-evictable-idle-time-millis: 600000 max-evictable-idle-time-millis: 900000 # 用来测试连接是否可用的SQL语句,默认值每种数据库都不相同,这是mysql validationQuery: select 1 # 应用向连接池申请连接,并且testOnBorrow为false时,连接池将会判断连接是否处于空闲状态,如果是,则验证这条连接是否可用 testWhileIdle: true # 如果为true,默认是false,应用向连接池申请连接时,连接池会判断这条连接是否是可用的 testOnBorrow: false # 如果为true(默认false),当应用使用完连接,连接池回收连接的时候会判断该连接是否还可用 testOnReturn: false # 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle poolPreparedStatements: true # 要启用PSCache,必须配置大于0,当大于0时, poolPreparedStatements自动触发修改为true,在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100 maxOpenPreparedStatements: 20 maxPoolPreparedStatementPerConnectionSize: 20 useGlobalDataSourceStat: true connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500 # 连接池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作 keepAlive: true
3、service层调用持久层处理
根据数据源的不通,在mapper接口文件上使用
@DS("impalaDataSource") 来配置使用哪个数据源,如果不加注解,会走默认的数据源。