Hive JDBC连接问题

时间:2018-05-06 01:34:25

标签: java jdbc hive cloudera

我正在尝试使用kerberos身份验证通过JDBC连接到Hive2服务器。经过多次尝试使其工作,我无法让它与Cloudera驱动程序一起工作。

如果有人可以帮助我解决问题,我会非常感激。

我有这个方法:

    private Connection establishConnection() {
    final String driverPropertyClassName = "driver";
    final String urlProperty = "url";
    Properties hiveProperties = config.getMatchingProperties("hive.jdbc");
    String driverClassName = (String) hiveProperties.remove(driverPropertyClassName);
    String url = (String) hiveProperties.remove(urlProperty);
    Configuration hadoopConfig = new Configuration();
    hadoopConfig.set("hadoop.security.authentication", "Kerberos");
    String p = config.getProperty("hadoop.core.site.path");
    Path path = new Path(p);
    hadoopConfig.addResource(path);
    UserGroupInformation.setConfiguration(hadoopConfig);

    Connection conn = null;
    if (driverClassName != null) {
        try {
            UserGroupInformation.loginUserFromKeytab(config.getProperty("login.user"), config.getProperty("keytab.file"));
            Driver driver = (Driver) Class.forName(driverClassName).newInstance();
            DriverManager.registerDriver(driver);
            conn = DriverManager.getConnection(url, hiveProperties);
        } catch (Throwable e) {
            LOG.error("Failed to establish Hive connection", e);
        }
    }
    return conn;
}

服务器的URL,我从Cloudera中描述的格式获取属性documentation

我得到一个例外:

2018-05-05 18:26:49 ERROR HiveReader:147 - Failed to establish Hive connection
java.sql.SQLException: [Cloudera][HiveJDBCDriver](500164) Error initialized or created transport for authentication: Peer indicated failure: Unsupported mechanism type PLAIN.
    at com.cloudera.hiveserver2.hivecommon.api.HiveServer2ClientFactory.createTransport(Unknown Source)
    at com.cloudera.hiveserver2.hivecommon.api.ZooKeeperEnabledExtendedHS2Factory.createClient(Unknown Source)
...

我想,它缺少AuthMech属性并在URL中添加了AuthMech = 1。现在我得到了:

java.sql.SQLNonTransientConnectionException: [Cloudera][JDBC](10100) Connection Refused: [Cloudera][JDBC](11640) Required Connection Key(s): KrbHostFQDN, KrbServiceName; [Cloudera][JDBC](11480) Optional Connection Key(s): AsyncExecPollInterval, AutomaticColumnRename, CatalogSchemaSwitch, DecimalColumnScale, DefaultStringColumnLength, DelegationToken, DelegationUID, krbAuthType, KrbRealm, PreparedMetaLimitZero, RowsFetchedPerBlock, SocketTimeOut, ssl, StripCatalogName, transportMode, UseCustomTypeCoercionMap, UseNativeQuery, zk
    at com.cloudera.hiveserver2.exceptions.ExceptionConverter.toSQLException(Unknown Source)
    at com.cloudera.hiveserver2.jdbc.common.BaseConnectionFactory.checkResponseMap(Unknown Source)
    ...

但是KrbHostFQDN已经在文档中要求的principal属性中指定。

我错过了什么或者这个文档错了吗?

3 个答案:

答案 0 :(得分:0)

下面是Impala中类似的问题语句之一(只是JDBC引擎更改其他内容相同),通过在JDBC连接字符串本身中设置“KrbHostFQDN”相关属性来解决。

尝试使用以下网址。希望能为你工作。

String jdbcConnStr = "jdbc:impala://myserver.mycompany.corp:21050/default;SSL=1;AuthMech=1;KrbHostFQDN=myserver.mycompany.corp;KrbRealm=MYCOMPANY.CORP;KrbServiceName=impala"

我想如果你没有使用SSL = 1但只使用Kerberos,你只需从连接字符串中删除该部分,而不必担心在java密钥存储区中设置SSL证书,这是另一个麻烦。 / p>

但是,为了让Kerberos正常工作,我们执行了以下操作:

  • 安装MIT Kerberos 4.0.1,这是一个kerberos票证管理器。 (这适用于Windows)

  • 每次启动连接时,此票证管理器会要求您进行身份验证,创建票证并将其存储在kerberos_ticket.dat二进制文件中,该文件的位置可以某种方式进行配置,但我不记得具体如何。

  • 最后,在启动JAVA应用程序之前,您必须设置一个环境变量KRB5CCNAME=C:/path/to/kerberos_ticket.dat。在您的Java应用程序中,您可以通过执行System.out.println( "KRB5CCNAME = " + System.getenv( "KRB5CCNAME" ) )来检查变量是否已正确设置。如果您正在使用eclipse或其他IDE,您甚至可能必须关闭IDE,设置环境变量并再次启动IDE。

    • 注意:最后一点非常重要,我观察到如果没有正确设置此变量,则不会建立连接......
  • 在Linux中,而不是MIT Kerberos 4.0.1,有一个名为kinit的程序可以做同样的事情,虽然没有图形界面,这对于自动化来说更方便。

答案 1 :(得分:0)

我想把它放在评论中,但评论太长了,所以我把它放在这里: 我尝试了你的建议并得到了另一个例外:

  

java.sql.SQLException:[Cloudera] HiveJDBCDriver错误   使用票证缓存创建登录上下文:无法获取Principal   验证名称。

可能是我的问题是,我没有设置环境变量KRB5CCNAME。 老实说,我以前从未听说过。 该票证文件应该是什么。 但是,我的主要方法是:

for i in range(num_rows  // 2):
    maze.append(zero_row[:]) # note the [:] syntax for copying a list
    maze.append(norm_row[:])
maze.append(zero_row[:])

应该使用哪个
System.setProperty("java.security.krb5.conf", "path/to/krb5.conf");

获得kerberos门票。

答案 2 :(得分:0)

要解决此问题,请为系统中使用的Java版本更新Java密码学扩展。

  1. 这里是您可以为Java 1.7下载JCE的链接
  2. 解压缩并覆盖$ JDK_HOME / jre / lib / security中的那些文件
  3. 重新启动计算机。