Cannot connect to HIVE with Secured kerberos. I am using UserGroupInformation.loginUserFromKeytab()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | { String driverName ="com.cloudera.hive.jdbc4.HS2Driver"; conf.set("hadoop.security.authentication","kerberos"); info("Getting Connection"); UserGroupInformation.setConfiguration(conf); info("Getting Connection"); `info("Getting Connection"); UserGroupInformation.setConfiguration(conf); UserGroupInformation.loginUserFromKeytab("****@***.***.COM","etc/****.keytab"); Class.forName(driverName); info("Getting Connection"); Connection con = DriverManager.getConnection("jdbc:hive2://localhost:10000;AuthMech=1;KrbRealm=EXa€?a€?AMPLE.COM;KrbHostFQDN=hs2.example.com;KrbServiceName=hive"); info("Got Connection"); } |
{
字符串driverName =" com.cloudera.hive.jdbc4.HS2Driver";
conf.set(" hadoop.security.authentication"," kerberos"); info("获得连接"); UserGroupInformation.setConfiguration(conf);
UserGroupInformation.loginUserFromKeytab(" **** @ .. COM"," etc / ****。keytab");
Class.forName(驱动程序名称); info("获得连接");连接con =
DriverManager.getConnection(" jdbc:hive2:// localhost:10000; AuthMech = 1; KrbRealm = EXa?ample.COM; KrbHostFQDN = hs2.example.com; KrbServiceName = hive"); info(" Got Connection");
}
18:47:51,894错误[1]在未知行运行部分中的错误。脚本中发生意外的异常。脚本部分:运行。原因:发生LoginException。无法获取身份验证的原始名称
java.sql.SQLException:[Simba] HiveJDBCDriver初始化或创建用于身份验证的传输错误:CONN_KERBEROS_AUTHENTICATION_ERROR_GET_TICKETCACHE。
在com.cloudera.hive.hivecommon.api.HiveServer2ClientFactory.createTransport(未知来源)
在com.cloudera.hive.hive.api.ExtendedHS2Factory.createClient(未知来源)
在com.cloudera.hive.hivecommon.core.HiveJDBCConnection.connect(未知来源)
在com.cloudera.hive.jdbc.common.BaseConnectionFactory.doConnect(未知来源)
在com.cloudera.hive.jdbc.common.AbstractDriver.connect(未知来源)
在java.sql.DriverManager.getConnection(DriverManager.java:582)
在java.sql.DriverManager.getConnection(DriverManager.java:207)
在script.run(script.java:85)
在oracle.oats.scripting.modules.basic.api.IteratingVUser.run(IteratingVUser.java:351)
在oracle.oats.scripting.modules.basic.api.internal.IteratingAgent.run(IteratingAgent.java:801)
引起原因:com.cloudera.hive.support.exceptions.GeneralException:[Simba] HiveJDBCDriver初始化或创建身份验证传输错误:CONN_KERBEROS_AUTHENTICATION_ERROR_GET_TICKETCACHE。
...另外10个
引起原因:com.cloudera.hive.support.exceptions.GeneralException:CONN_KERBEROS_AUTHENTICATION_ERROR_GET_TICKETCACHE
...另外10个
由以下原因引起:javax.security.auth.login.LoginException:无法获取用于身份验证的主要名称
在com.sun.security.auth.module.Krb5LoginModule.promptForName(Krb5LoginModule.java:733)
在com.sun.security.auth.module.Krb5LoginModule.attemptAuthentication(Krb5LoginModule.java:629)
在com.sun.security.auth.module.Krb5LoginModule.login(Krb5LoginModule.java:542)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
在java.lang.reflect.Method.invoke(Method.java:597)
在javax.security.auth.login.LoginContext.invoke(LoginContext.java:769)
在javax.security.auth.login.LoginContext.access $ 000(LoginContext.java:186)
在javax.security.auth.login.LoginContext $ 5.run(LoginContext.java:706)
在java.security.AccessController.doPrivileged(本机方法)
在javax.security.auth.login.LoginContext.invokeCreatorPriv(LoginContext.java:703)
在javax.security.auth.login.LoginContext.login(LoginContext.java:575)
在com.cloudera.hive.jdbc.kerberos.Kerberos.getSubjectViaTicketCache(未知来源)
在com.cloudera.hive.hivecommon.api.HiveServer2ClientFactory.createTransport(未知来源)
在com.cloudera.hive.hive.api.ExtendedHS2Factory.createClient(未知来源)
在com.cloudera.hive.hivecommon.core.HiveJDBCConnection.connect(未知来源)
在com.cloudera.hive.jdbc.common.BaseConnectionFactory.doConnect(未知来源)
在com.cloudera.hive.jdbc.common.AbstractDriver.connect(未知来源)
在java.sql.DriverManager.getConnection(DriverManager.java:582)
在java.sql.DriverManager.getConnection(DriverManager.java:207)
在script.run(script.java:85)
在oracle.oats.scripting.modules.basic.api.IteratingVUser.run(IteratingVUser.java:351)
在oracle.oats.scripting.modules.basic.api.internal.IteratingAgent.run(IteratingAgent.java:801)
在java.lang.Thread.run(Thread.java:619)
Hive JDBC驱动程序不使用Hadoop Auth库,因为它们应该能够从集群外部进行连接,并且对Hadoop库的依赖性最小。
因此,实际上,您的UGI设置将被忽略。
但是Hive JDBC驱动程序使用Thrift客户端库,该库支持Kerberos身份验证的原始JAAS配置。
在命令行上使用系统道具的示例:
1 2 3 | java -Djava.security.krb5.conf=/etc/krb5.conf \\ -Djava.security.auth.login.config=./my_jaas.conf \\ ***** |
对" my_jaas.conf"进行示例以使用密钥表文件中提供的密码来获取私有Kerberos票证(不从缓存读取,不写入缓存):
1 2 3 4 5 6 7 8 9 10 | com.sun.security.jgss.krb5.initiate { com.sun.security.auth.module.Krb5LoginModule required useTicketCache=false doNotPrompt=true useKeyTab=true keyTab="file:/some/path/to/my_login.keytab" principal="[email protected]" debug=true; }; |
请注意,上述语法适用于Sun / Oracle JDK和OpenJDK,但不适用于使用不同语法的IBM JDK ...它也不适用于DataDirect连接器(与Oracle,IBM,Microstrategy等一起提供)。 ),它在conf中需要一个特定的"主题"。
就是这样。当JDBC驱动程序检测到URL请求Kerberos连接时,它将自动调用JAAS,并且JAAS将处理脏工作。
PS:调试安全性配置问题很麻烦,但是您有几个属性可以启用调试跟踪:
1 2 | -Dsun.security.krb5.debug=true -Djava.security.debug=gssloginconfig,configfile,configparser,logincontext |