【问题标题】:Exception while connecting to Hive using JDBC and Kerberos authentication使用 JDBC 和 Kerberos 身份验证连接到 Hive 时出现异常
【发布时间】:2018-03-13 09:49:13
【问题描述】:

我正在尝试使用 Java 中的 JDBC 和 Kerberos 身份验证连接到 Hive。 为此,我想出了以下代码。

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.security.UserGroupInformation;

public class DbManager {
private static Connection hiveConnection;
// get Hive Connection
public static Connection qwtHiveConnection() throws IOException, SQLException {

    System.out.println("Preparing Hive connection1");
    Configuration conf = new Configuration();
    conf.set("hadoop.security.authentication", "Kerberos");
    UserGroupInformation.setConfiguration(conf);
    UserGroupInformation.loginUserFromKeytab("username@HLC.ABC.QW.COM", "path of keytab");
    // Hive Connection
    try {
        Class.forName("org.apache.hive.jdbc.HiveDriver");
        if(hiveConnection == null) {
            hiveConnection = DriverManager.getConnection("jdbc:hive2://abcd1dq000.hlc.abc.qw.com:10000/finance;principal=hive/_HOST@HLC.ABC.QW.COM", "usrname", "pwd");
            return hiveConnection;
        } else {
        return hiveConnection;
        }
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
        return null;
    } catch (SQLException e) {
        e.printStackTrace();
        return null;
    }
}
}

我从命令“hadoop 版本”中看到的 Hadoop 版本: Hadoop 2.7.3.2.6.2.0-205 此命令使用 /usr/hdp/2.6.2.0-205/hadoop/hadoop-common-2.7.3.2.6.2.0-205.jar 运行

我在项目中使用了以下jar文件:

hive-jdbc-2.2.0.jar,
postgresql-9.4.1212.jar,
apache-commons.jar,
slf4j-api-1.7.25.jar,
hadoop-commons-2.6.2.jar,
guava-18.0.jar,
commons-configuration-1.9.jar,
commons-lang-2.6.jar,
hadoop-auth-2.6.2.jar,
hadoop-core-1.2.0.jar

当我运行 jar 时,我得到了异常:

Preparing Hive connection1
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Kerberos Connected
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hive/service/rpc/thrift/TCLIService$Iface
    at org.apache.hive.jdbc.HiveDriver.connect(HiveDriver.java:107)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at com.dbconnections.gphive.DbManager.getHiveConnection(DbManager.java:35)
    at com.recordcount.dao.GpHiveRecords.getHiveTableCount(GpHiveRecords.java:93)
    at com.recordcount.entry.StartCount.main(StartCount.java:13)
Caused by: java.lang.ClassNotFoundException: org.apache.hive.service.rpc.thrift.TCLIService$Iface
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 6 more

【问题讨论】:

  • 使用hive-jdbc-standalone JAR。它旨在捆绑所有这些棘手的依赖项。除了需要来自 Hadoop 和 Commons 的一些额外方法的 Kerberos 身份验证 - 但由于您显式调用 UGI,您无论如何都得到了它们。
  • 请注意,如果您需要来自 Windows 会话凭据的单点登录身份验证,这是可行的 - 通过转储 Hadoop UGI 并使用原始 JAAS 配置。不容易(没有教程,文档稀缺,调试困难)但可行。

标签: java hadoop hive kerberos


【解决方案1】:

您似乎错过了以下依赖项:

<dependency>
    <groupId>org.apache.hive</groupId>
    <artifactId>hive-service-rpc</artifactId>
    <version>2.2.0</version>
</dependency>

此 jar 包含缺少的接口。

更新:

看来你也需要:

<dependency>
    <groupId>org.apache.hive</groupId>
    <artifactId>hive-service</artifactId>
    <version>2.2.0</version>
</dependency>

还有我的其他罐子。

【讨论】:

  • 添加之后,我得到了异常:线程“main”中的异常 java.lang.NoClassDefFoundError: org/apache/hive/service/cli/HiveSQLException 看起来我需要添加其他依赖项所有这些例外。
  • @Sidhartha 看看我更新的答案
猜你喜欢
  • 2022-01-17
  • 2016-10-09
  • 1970-01-01
  • 1970-01-01
  • 2017-07-13
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多