说明
这是我们项目所使用通过impala来操作hive,项目框架为:Spring+SpringMVC+mybatis+shiro,前期使用的MySQL数据库,但是后来Hadoop集市建立好了,需要连接到Hadoop,但是有些业务还是得连接MySQL数据库。所以配置的双数据源。下面就给了通过impala驱动来操作hive。也可以通过phoenix连接hbase来实现,因为项目的原因,通过impala连接改动的地方少一些。而且Hadoop开启了安全认证,连接Hadoop需要通过kerberos认证。但是这些都少不了一个资深的Hadoop大神架构师陪你一起。
一、配置dbconfig.properties数据连接地址
1.impala.driverClass=com.cloudera.impala.jdbc4.Driver
2.impala.driverUrl=jdbc:impala://IP地址:21050/pa;AuthMech=1;KrbRealm=HADOOP.COM;KrbHostFQDN=XXX;KrbServiceName=impala;SSL=1;AllowSelfSignedCerts=1;CAIssuedCertNamesMismatch=1;KrbAuthType=1
filters=stat
maxActive=20
initialSize=1
maxWait=60000
minIdle=10
maxIdle=15
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=300000
readTimeout=600000
validationQuery=SELECT 'x'
testWhileIdle=true
testOnBorrow=false
testOnReturn=false
maxOpenPreparedStatements=20
removeAbandoned=true
removeAbandonedTimeout=1800
logAbandoned=true
#使用的是impala驱动,也可以使用hive的驱动,但是我发现使用impala的驱动兼容性更好些。
使用的jar包为impala官网下载的,ClouderaImpalaJDBC4_2.5.43驱动。
提供下我整理的jar,欢迎下载https://download.csdn.net/download/weixin_41963652/10332377
二、spring,通过druid连接池管理
<!-- 阿里 druid数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<!-- 数据库基本信息配置 -->
<property name="url" value="${impala.driverUrl}" />
<property name="driverClassName" value="${impala.driverClass}" />
<!-- 最大并发连接数 -->
<property name="maxActive" value="${maxActive}" />
<!-- 初始化连接数量 -->
<property name="initialSize" value="${initialSize}" />
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="${maxWait}" />
<!-- 最小空闲连接数 -->
<property name="minIdle" value="${minIdle}" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="${timeBetweenEvictionRunsMillis}" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="${minEvictableIdleTimeMillis}" />
<property name="validationQuery" value="${validationQuery}" />
<property name="testWhileIdle" value="${testWhileIdle}" />
<property name="testOnBorrow" value="${testOnBorrow}" />
<property name="testOnReturn" value="${testOnReturn}" />
<property name="maxOpenPreparedStatements" value="${maxOpenPreparedStatements}" />
<!-- 打开removeAbandoned功能 -->
<property name="removeAbandoned" value="${removeAbandoned}" />
<!-- 1800秒,也就是30分钟 -->
<property name="removeAbandonedTimeout" value="${removeAbandonedTimeout}" />
<!-- 关闭abanded连接时输出错误日志 -->
<property name="logAbandoned" value="${logAbandoned}" />
</bean>
三、写一个监听器,连接impala之前获取kerberos认证。
package com.fh.util.wxpay;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import com.fh.util.Const;
import com.fh.util.PathUtil;
public class getKerberosJaax implements ServletContextListener {
private static String driverName = "com.cloudera.impala.jdbc4.Driver";
@Override
public void contextInitialized(ServletContextEvent arg0) {
String krbCfg = PathUtil.getClasspath() + Const.FILEPATHFILE+"krb5.conf";//krb5.conf文件放置的路径
//krb5.conf为impala配置文件
//gss-jaas.conf也为impala拉下来的配置文件
System.setProperty("java.security.auth.login.config",PathUtil.getClasspath() + Const.FILEPATHFILE+"gss-jaas.conf");//PathUtil.getClasspath() + Const.FILEPATHFILE+"gss-jaas.conf"为文件放置的文件
System.setProperty("sun.security.jgss.debug","true");
System.setProperty("javax.security.auth.useSubjectCredsOnly","false");
System.setProperty("java.security.krb5.conf", krbCfg);
}
@Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
}
}
附:gss-jaas.conf文件
/*
Remove the principal= line if you want to specify user at prompt. Otherwise
set it to the correct principal.
*/
Client {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
principal="impala/[email protected]"
doNotPrompt=false
debug=true;
};
附:web.xml监听器配置
<listener>
<listener-class>
com.fh.util.wxpay.getKerberosJaax
</listener-class>
</listener>