說明
這是我們項目所使用通過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>