Java---JDBC连接Impala(Kerberos认证)

环境

版本
JAVA8
CDH6.3
Impala3.2
Hive3.0
代码开发环境Windows10

两种连接方式

说明
HiveJdbc比较方便一点,直接可以从maven远程仓库下载驱动,用hive的Jdbc驱动连接Impala
ImpalaJdbcImpala自身的Jdbc驱动,但是在maven的远程仓库中没有,需要在官网下载

一、Impala的JDBC驱动连接impala

1. 驱动下载
  • 连接Impala的JDBC驱动在Maven远程仓库中没有,需要到官网下载
  • 这个下载是需要先注册账号的哦!免费注册哒

点击去官网下载:https://www.cloudera.com/search.html?q=impala%20jdbc
在这里插入图片描述

2. 导入Impala的JDBC包
  • 下载解压后,打开文件夹,里面有两个名字类似的文件夹,选择一个即可
    在这里插入图片描述
  • 打开即可看到一个jar包,将其导入到我们的环境
    在这里插入图片描述* 我这里是导入到了idea中
    在这里插入图片描述
3. 导入Maven外部依赖
  • 这里只需要导入一个hadoop的就可以
    <dependencies>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>3.0.0</version>
        </dependency>
    </dependencies>
3. 主程序
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.security.UserGroupInformation;
import java.security.PrivilegedAction;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

/**
 * @Date: 2022/1/5
 * @Author: BigBig-Data
 * @Description: 注: impala的JDBC驱动maven远程仓库中没有, 需要从别的地方下载: https://www.cloudera.com/search.html?q=impala%20jdbc
 */
public class IConnectImpalaKerberos {
    // Kerberos
    public static final String KRB5_CONF = "C:/Windows/krb5.ini";//linux中叫 krb5.conf,改后缀即可
    public static final String PRINCIPAL = "normtest@HADOOP.COM";
    public static final String KEYTAB = "C:/Windows/normtest.keytab";
    // impala jdbc url 参数可参考官方文档   https://docs.cloudera.com/documentation/other/connectors/impala-jdbc/latest/Cloudera-JDBC-Driver-for-Impala-Install-Guide.pdf
    public static String connectionUrl = "jdbc:impala://host:21050/;AuthMech=1;KrbRealm=HADOOP.COM;KrbHostFQDN=host;KrbServiceName=impala";

    // 从官网下载的jar包
    public static String jdbcDriverName = "com.cloudera.impala.jdbc.Driver";

    public static void main(String[] args) throws Exception {

        System.setProperty("java.security.krb5.conf", KRB5_CONF);
        Configuration conf = new Configuration();
        conf.set("hadoop.security.authentication", "Kerberos");
        UserGroupInformation.setConfiguration(conf);
        UserGroupInformation.loginUserFromKeytab(PRINCIPAL, KEYTAB);
        System.out.println(">> 1. Login from keytab " + KEYTAB + " Success");
        UserGroupInformation loginUser = UserGroupInformation.getLoginUser();
        int result = loginUser.doAs(new PrivilegedAction<Integer>() {
            @Override
            public Integer run() {
                int result = 0;
                //加载驱动
                try {
                    Class.forName(jdbcDriverName);
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
                System.out.println(">> 2. jdbcDriver load Success");
                try (Connection con = DriverManager.getConnection(connectionUrl)) {
                    System.out.println(">> 3. Login impala Sussecs");
                    Statement stmt = con.createStatement();
                    ResultSet rs = stmt.executeQuery("SELECT count(1) FROM norm_demo");
                    while (rs.next()) {
                        result = rs.getInt(1);
                    }
                    stmt.close();
                    con.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return result;
            }
        });
        System.out.println("表行数: "+ result);
    }

}

二、Hive的JDBC驱动连接impala

1. 导入Maven外部依赖
    <dependencies>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>3.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-jdbc</artifactId>
            <version>1.2.1</version>
        </dependency>
    </dependencies>
2. 主程序
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.security.UserGroupInformation;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class HConnectImpalaKerberos {
    // Kerberos
    public static final String KRB5_CONF = "C:/Windows/krb5.ini"; //linux中krb5.conf
    public static final String PRINCIPAL = "normtest@HADOOP.COM";
    public static final String KEYTAB = "C:/Windows/normtest.keytab";
    public static String connectionUrl = "jdbc:hive2://host:21050/;principal=impala/host@HADOOP.COM";
    public static String jdbcDriverName = "org.apache.hive.jdbc.HiveDriver";

    public static void main(String[] args) throws Exception {
        System.setProperty("java.security.krb5.conf", KRB5_CONF);
        Configuration conf = new Configuration();
        conf.set("hadoop.security.authentication", "Kerberos");
        UserGroupInformation.setConfiguration(conf);
        UserGroupInformation.loginUserFromKeytab(PRINCIPAL, KEYTAB);
        System.out.println(">> 1. Login from keytab " + KEYTAB + " Success");

        //加载驱动
        Class.forName(jdbcDriverName);
        System.out.println(">> 2. jdbcDriver load Success");
        try (Connection con = DriverManager.getConnection(connectionUrl)) {
            System.out.println(">> 3. Login impala Sussecs");
            Statement stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT count(1) FROM norm_demo");
            while (rs.next()) {
                System.out.println(rs.getInt(1));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

常见问题

java.lang.IllegalArgumentException: Can’t get Kerberos realm

一般是因为没有找到配置文件
如果是windows,将 krb5.ini 和 xxx.keytab 需要放在 C:\Windows\ 路径下,记得改后缀
如果是linux,将 krb5.conf 和 xxx.keytab 需要放在 /etc/ 路径下

GSS initiate failed

kerberos认证成功后,连接impala报这个错误
一般可能是因为url填写错误了,请仔细检查url中的参数等
下图为官方文档示例:
在这里插入图片描述

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值