连接到 cloudera impala 环境时出现 Kerberos 错误

Posted

技术标签:

【中文标题】连接到 cloudera impala 环境时出现 Kerberos 错误【英文标题】:Kerberos error while connection to cloudera impala environment 【发布时间】:2019-06-23 19:40:14 【问题描述】:

连接到 kerberized hadoop 环境时出错:[Simba]ImpalaJDBCDriver 无法连接到服务器:[Simba]ImpalaJDBCDriver Kerberos 身份验证失败。

我已经在 virtualbox 中安装了 cloudera quickstart vm,启用了 kerberos,编写了连接到 imapala db 的 java 代码并得到了 Kerberos Authentication failed 错误。

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

        Configuration conf = new Configuration();
        conf.set("hadoop.security.authentication", "Kerberos");
        UserGroupInformation.setConfiguration(conf);
        UserGroupInformation ugi = UserGroupInformation
                .loginUserFromKeytabAndReturnUGI("hdfs/quickstart.cloudera@CLOUDERA", "hdfs.keytab");

        Class.forName("com.cloudera.impala.jdbc41.Driver");
        Connection conn = (Connection) ugi.doAs(new PrivilegedExceptionAction<Object>() 
            public Object run() 
                Connection tcon = null;
                try 
                    tcon = DriverManager.getConnection(
                            "jdbc:impala://quickstart.cloudera:21050;AuthMech=1;KrbHostFQDN=quickstart.cloudera;KrbRealm=CLOUDERA;KrbServiceName=hdfs");
                    System.out.println("Connected!");
                 catch (SQLException e) 
                    e.printStackTrace();
                
                return tcon;
            
        );

        Statement stmt = conn.createStatement();

        String sql = "show tables";
        System.out.println("Running: " + sql);
        ResultSet res = stmt.executeQuery(sql);
        while (res.next()) 
            System.out.println(res.getString(1));
        
    

我已启用调试模式,但出现异常:

... 客户主体 = hdfs/quickstart.cloudera@CLOUDERA 服务器主体 = hdfs/quickstart.cloudera@CLOUDERA 会话密钥 = EncryptionKey:keyType=23 keyBytes(十六进制转储)= 0000: 8A B3 79 07 A5 06 05 9F CE 37 84 8A 15 2E 7E B5 ..y......7...... 可转票 true 转票假 代理票假 代理票假 远期票假 可续订票 false 初始票假 授权时间 = 2019 年 6 月 23 日星期日 11:52:03 PDT 开始时间 = 2019 年 6 月 23 日星期日 11:52:03 PDT 结束时间 = 2019 年 6 月 24 日星期一 11:52:03 PDT 续订至 = null 客户地址空 >>> KrbApReq:APOptions 为 00100000 00000000 00000000 00000000 >>> EType:sun.security.krb5.internal.crypto.ArcFourHmacEType Krb5Context 将 mySeqNumber 设置为:925793988 创建了 InitSecContextToken: 0000: 01 00 6E 82 02 2E 30 82 02 2A A0 03 02 01 05 A1 ..n...0..*...... 0220: 4A 3E 74 0A 67 B6 5E 16 3B B8 1D FB 91 75 53 33 J>t.g.^.;..us3 0230:76 5E 40 81 v^@。 java.sql.SQLException: [Simba][ImpalaJDBCDriver](500164) 为身份验证初始化或创建传输时出错:[Simba][ImpalaJDBCDriver](500169) 无法连接到服务器:[Simba][ImpalaJDBCDriver](500591) Kerberos 身份验证失败.. 在 com.cloudera.hivecommon.api.HiveServer2ClientFactory.createTransport(未知来源) 在 com.cloudera.hivecommon.api.HiveServer2ClientFactory.createClient(未知来源) 在 com.cloudera.hivecommon.core.HiveJDBCCommonConnection.establishConnection(未知来源) 在 com.cloudera.impala.core.ImpalaJDBCConnection.establishConnection(未知来源) 在 com.cloudera.jdbc.core.LoginTimeoutConnection.connect(未知来源) 在 com.cloudera.jdbc.common.BaseConnectionFactory.doConnect(未知来源) 在 com.cloudera.jdbc.common.AbstractDriver.connect(未知来源) 在 java.sql.DriverManager.getConnection(DriverManager.java:571) 在 java.sql.DriverManager.getConnection(DriverManager.java:233) 在 ImpalaJDBC$1.run(ImpalaJDBC.java:64) 在 java.security.AccessController.doPrivileged(本机方法) 在 javax.security.auth.Subject.doAs(Subject.java:415) 在 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1917) 引起:com.cloudera.support.exceptions.GeneralException:[Simba][ImpalaJDBCDriver](500164) 为身份验证初始化或创建传输时出错:[Simba][ImpalaJDBCDriver](500169) 无法连接到服务器:[Simba][ImpalaJDBCDriver ](500591) Kerberos 身份验证失败.. ... 13 更多 原因:java.lang.RuntimeException:[Simba][ImpalaJDBCDriver](500169) 无法连接到服务器:[Simba][ImpalaJDBCDriver](500591) Kerberos 身份验证失败。 在 com.cloudera.hivecommon.api.HiveServerPrivilegedAction.run(未知来源) 在 java.security.AccessController.doPrivileged(本机方法) 在 javax.security.auth.Subject.doAs(Subject.java:356) 在 com.cloudera.hivecommon.api.HiveServer2ClientFactory.createTransport(未知来源) 在 com.cloudera.hivecommon.api.HiveServer2ClientFactory.createClient(未知来源) 在 com.cloudera.hivecommon.core.HiveJDBCCommonConnection.establishConnection(未知来源) 在 com.cloudera.impala.core.ImpalaJDBCConnection.establishConnection(未知来源) 在 com.cloudera.jdbc.core.LoginTimeoutConnection.connect(未知来源) 在 com.cloudera.jdbc.common.BaseConnectionFactory.doConnect(未知来源) 在 com.cloudera.jdbc.common.AbstractDriver.connect(未知来源) 在 java.sql.DriverManager.getConnection(DriverManager.java:571) 在 java.sql.DriverManager.getConnection(DriverManager.java:233) 在 ImpalaJDBC$1.run(ImpalaJDBC.java:64) 在 java.security.AccessController.doPrivileged(本机方法) 在 javax.security.auth.Subject.doAs(Subject.java:415) 在 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1917) 在 ImpalaJDBC.main(ImpalaJDBC.java:60) 引起:org.apache.thrift.transport.TTransportException 在 org.apache.thrift.transport.TiostreamTransport.read(TIOStreamTransport.java:132) 在 org.apache.thrift.transport.TTransport.readAll(TTransport.java:84) 在 org.apache.thrift.transport.TSaslTransport.receiveSaslMessage(TSaslTransport.java:178) 在 org.apache.thrift.transport.TSaslTransport.open(TSaslTransport.java:258) 在 org.apache.thrift.transport.TSaslClientTransport.open(TSaslClientTransport.java:37) ... 17 更多

【问题讨论】:

执行“kinit -kt hdfs.keytab hdfs/quickstart.cloudera@CLOUDERA”会发生什么?你有一张有效的票吗? 我认为是的:[cloudera@quickstart ~]$ kinit -kt hdfs.keytab hdfs/quickstart.cloudera@CLOUDERA [cloudera@quickstart ~]$ klist Ticket cache: FILE:/tmp/krb5cc_501 默认主体:hdfs/quickstart.cloudera@CLOUDERA 有效开始到期服务主体 06/23/19 16:09:01 06/24/19 16:09:01 krbtgt/CLOUDERA@CLOUDERA 续订至 2019 年 6 月 30 日 16:09: 01 我可以看到您正在虚拟机中执行 kinit。您是否也在虚拟机上运行您的代码?我问是因为通常会在其他地方运行它(例如在 IDE 内的主机上) 是的,我也在虚拟机上运行 这可能是我没有为impala启用kerberos的原因,而是通过jdbc驱动程序我想连接到impala?我刚刚在 cloudera manager 上启用了 kerberos,但没有为 impala 启用 【参考方案1】:

Impala 重启后,我的 web 项目遇到了同样的问题。设置连接池空闲时释放所有连接,让下一次查询重新申请连接。此时不会出现此问题。

【讨论】:

以上是关于连接到 cloudera impala 环境时出现 Kerberos 错误的主要内容,如果未能解决你的问题,请参考以下文章

连接到集群外的 Cloudera Impala / Hive

ETL informatica 大数据版(不是云版)可以连接到 Cloudera Impala 吗?

无法将 Impala-Kudu 连接到 Apache Kudu(没有 Cloudera Manager):获取 TTransportException 错误

ConnectionRefused 尝试使用 cloudera 连接到 hadoop

尝试连接到新环境时出现 503 错误

OBIEE 连接到黑斑羚