簡體   English   中英

Hive JDBC連接問題

[英]Hive JDBC connection problems

我正在嘗試使用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;
}

我從Cloudera 文檔中所述格式的屬性中獲取的服務器URL

我有一個例外:

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。

我是否缺少某些內容或此文檔有誤?

下面是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正常工作,我們執行了以下操作:

  • 安裝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的程序,盡管沒有圖形界面,但它執行相同的功能,這對於自動化來說更加方便。

我想將其放入評論中,但評論已經太久了,因此我將其放置在這里:我嘗試了您的建議,但又遇到了另一個例外:

java.sql.SQLException:[Cloudera] HiveJDBCDriver使用票證緩存創建登錄上下文時出錯:無法獲取用於身份驗證的主體名稱。

可能是我的問題是,我沒有設置環境變量KRB5CCNAME。 老實說,我以前從未聽說過它。 該票證文件中應​​該包含什么。 但是,我的主要方法確實有以下幾行:

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

應該由哪個使用

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

以獲得kerberos門票。

要解決此問題,請更新系統中使用的Java版本的Java密碼學擴展。

  1. 當您可以下載JCE for Java 1.7時,這里是鏈接
  2. 解壓縮並覆蓋$ JDK_HOME / jre / lib / security中的那些文件
  3. 重啟你的電腦。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM