oozie java api提交作业,kerberos身份验证错误
Posted
技术标签:
【中文标题】oozie java api提交作业,kerberos身份验证错误【英文标题】:oozie java api submit job, kerberos Authentication error 【发布时间】:2016-01-18 16:54:21 【问题描述】:我有 hadoop-2.7 集群,oozie-4.0.1 在安全模式下运行(使用 kerberos)。 一切都很好。我可以使用 cli 命令提交作业如下:
启动 myuser oozie job -oozie https://10.1.130.10:21003/oozie -config job.properties -run但我使用 oozie java api 提交作业,出现 kerberos 异常。
线程“主”身份验证中的异常:无法进行身份验证,GSSException:未提供有效凭据(机制级别:找不到任何 Kerberos tgt) 在 org.apache.oozie.client.AuthOozieClient.createConnection(AuthOozieClient.java:150) 在 org.apache.oozie.client.OozieClient.getSupportedProtocolVersions(OozieClient.java:577) 在 org.apache.oozie.client.OozieClient.validateWSVersion(OozieClient.java:538) 在 org.apache.oozie.client.OozieClient.createURL(OozieClient.java:651) 在 org.apache.oozie.client.OozieClient.access$100(OozieClient.java:103) 在 org.apache.oozie.client.OozieClient$ClientCallable.call(OozieClient.java:803) 在 org.apache.oozie.client.OozieClient.run(OozieClient.java:999) at com.huawei.oozie.OozieMain.main(OozieMain.java:47)
原因: org.apache.hadoop.security.authentication.client.AuthenticationException:GSSException:未提供有效凭据(机制级别:找不到任何 Kerberos tgt) 在 org.apache.hadoop.security.authentication.client.KerberosAuthenticator.doSpnegoSequence(KerberosAuthenticator.java:334) 在 org.apache.hadoop.security.authentication.client.KerberosAuthenticator.authenticate(KerberosAuthenticator.java:206) 在 org.apache.hadoop.security.authentication.client.AuthenticatedURL.openConnection(AuthenticatedURL.java:215) 在 org.apache.oozie.client.AuthOozieClient.createConnection(AuthOozieClient.java:144) ... 7 更多
原因:GSSException:未提供有效凭据(机制级别:找不到任何 Kerberos tgt) 在 sun.security.jgss.krb5.Krb5InitCredential.getInstance(Krb5InitCredential.java:147) 在 sun.security.jgss.krb5.Krb5MechFactory.getCredentialElement(Krb5MechFactory.java:122) 在 sun.security.jgss.krb5.Krb5MechFactory.getMechanismContext(Krb5MechFactory.java:187) 在 sun.security.jgss.GSSManagerImpl.getMechanismContext(GSSManagerImpl.java:224) 在 sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:212) 在 sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:179) 在 org.apache.hadoop.security.authentication.client.KerberosAuthenticator$1.run(KerberosAuthenticator.java:313) 在 org.apache.hadoop.security.authentication.client.KerberosAuthenticator$1.run(KerberosAuthenticator.java:288) 在 java.security.AccessController.doPrivileged(本机方法) 在 javax.security.auth.Subject.doAs(Subject.java:422) 在 org.apache.hadoop.security.authentication.client.KerberosAuthenticator.doSpnegoSequence(KerberosAuthenticator.java:288) ... 10 更多
我的java代码如下:
System.setProperty("java.security.auth.login.config", System.getProperty("user.dir") + File.separator + "conf"
+ File.separator + "jaas.conf ");
System.setProperty("java.security.krb5.conf", System.getProperty("user.dir") + File.separator + "conf"
+ File.separator + "krb5.conf ");
String url = "https://10.137.60.60:21003/oozie";
AuthOozieClient wc = new AuthOozieClient(url);
wc.setDebugMode(1);
Properties conf = wc.createConfiguration();
FileReader fr = new FileReader("conf/job.properties");
conf.load(fr);
System.out.println(conf.toString());
String jobId = wc.run(conf);
System.out.println("Workflow job submitted");
while (wc.getJobInfo(jobId).getStatus() == WorkflowJob.Status.RUNNING)
System.out.println("Workflow job running ...");
Thread.sleep(3 * 1000);
System.out.println("Workflow job completed ...");
System.out.println(wc.getJobInfo(jobId));
我的 conf/jaas.conf 如下:
Client
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="D:/workspace/4.4-billing/Oozie/conf/oozie.keytab"
principal="oozie@HADOOP.COM"
useTicketCache=false
storeKey=true
debug=true;
;
谁能帮助我?我知道 oozie 使用 hadoop-auth jar。但是如何设置keytab,编写身份验证代码,我不能。
【问题讨论】:
1. 使用-Djava.security.debug=configfile,gssloginconfig,configparser,logincontext
启用 Java 安全调试模式2. 检查 JVM 使用的加密算法; Kerberos 通常需要 AES256(默认情况下不包含在 Oracle/Sun JRE 中,必须下载“无限强度加密”策略 JAR)3. 对于 Windows 路径,请尝试 keyTab="D:\\workspace\\4.4-billing\\Oozie\\conf\\oozie.keytab"
@SamsonScharfrichter 您对“无限强度加密”策略 JAR 的建议对我有用。就在此之前,我无法让 Oozie Client API 在 Centos7 Oracle jre 1.8 上运行。
@kasur,如果您有 Kerberized Hadoop 集群,必读:steveloughran.gitbooks.io/kerberos_and_hadoop/content/…
【参考方案1】:
将您的 kerberos 用户帐户设置为
conf.setProperty(OozieClient.USER_NAME, "xyz");
oozieClient.run(conf);
【讨论】:
以上是关于oozie java api提交作业,kerberos身份验证错误的主要内容,如果未能解决你的问题,请参考以下文章