天天看点

SSM+impala+Kerberos认证

说明

这是我们项目所使用通过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> 
           
下一篇: 副业

继续阅读