hivejdbc连接问题

snvhrwxg  于 2021-06-26  发布在  Hive
关注(0)|答案(3)|浏览(511)

我正在尝试通过带有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文档中描述的格式的属性中获取
我得到一个例外:

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属性,并将authmech=1添加到url中。现在我得到:

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已经按照文档中的要求在主体属性中指定了。
我是遗漏了什么还是文件有误?

ykejflvf

ykejflvf1#

下面是impala中类似的一种问题语句(只是jdbc引擎的更改其他的都是相同的),它是通过在jdbc连接字符串本身中设置“krbhostfqdn”相关属性来解决的。
尝试使用下面的url。希望能在美国工作。

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证书,这是另一个麻烦。
但是,为了让kerberos正常工作,我们做了以下工作:
安装mitkerberos 4.0.1,这是一个kerberos票证管理器(这是用于windows的)
每次启动连接时,此票证管理器都会要求您进行身份验证,创建一个票证并将其存储在kerberos\u ticket.dat二进制文件中,该文件的位置可以以某种方式进行配置,但我不记得具体是如何配置的。
最后,在启动java应用程序之前,必须设置一个环境变量 KRB5CCNAME=C:/path/to/kerberos_ticket.dat . 在java应用程序中,可以通过执行 System.out.println( "KRB5CCNAME = " + System.getenv( "KRB5CCNAME" ) ) . 如果您正在使用eclipse或其他ide,您甚至可能需要关闭ide,设置环境变量并再次启动ide。
注:这最后一位是非常重要的,我观察到,如果这个变量没有正确设置,连接将无法建立。。。
在linux中,有一个名为kinit的程序代替了mit kerberos 4.0.1,它可以做同样的事情,尽管没有图形界面,这对于自动化来说更加方便。

ldfqzlk8

ldfqzlk82#

我想把它放在评论里,但是评论太长了,所以我把它放在这里:我尝试了你的建议,但得到了另一个例外:
java.sql.sqlexception:[cloudera]hivejdbcdriver使用票证缓存创建登录上下文时出错:无法获取身份验证的主体名称。
可能我的问题是,我没有设置环境变量krb5ccname。i、 老实说,以前从没听说过。票证文件里应该有什么。不过,我的主要方法是:

System.setProperty("java.security.krb5.conf", "path/to/krb5.conf");

应该由

UserGroupInformation.loginUserFromKeytab(config.getProperty("login.user"), config.getProperty("keytab.file"));

获取kerberos票证。

s3fp2yjn

s3fp2yjn3#

要解决此问题,请为系统中使用的java版本更新java cryptography extension。
以下是您可以下载jceforjava1.7的链接
解压缩并覆盖$jdk\u home/jre/lib/security中的那些文件
重新启动计算机。

相关问题