连接到 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 错误