具有 kerberos 安全性的 Sqoop 在 cron 中不起作用,抛出 GSSException

Posted

技术标签:

【中文标题】具有 kerberos 安全性的 Sqoop 在 cron 中不起作用,抛出 GSSException【英文标题】:Sqoop with kerberos security not working in cron , throw GSSException 【发布时间】:2018-05-08 00:47:22 【问题描述】:

当我从边缘节点运行 sqoop 作业时,它工作正常并且能够从 oracle 中提取数据,但是当我在 crontab 中安排相同的作业时,它会引发 kerberos 安全错误。

我在 hortonworks 网站上发现了同样的问题(见链接),但没有任何有效的答案。

https://community.hortonworks.com/questions/61856/kerberos-ticket-error-in-a-cron-job.html

我在 cron 作业开始之前有有效的 kerberos 票证,有效期为 10 小时,但是当我在 5 分钟内安排 cron 作业时,它会引发 kerberos 错误。

请建议,在 cron 作业中开始 sqoop 导入之前需要遵循哪些步骤。

以下是详细的错误信息:

17/11/23 11:24:17 错误 tool.ImportTool:运行导入作业时遇到 IOException:java.io.IOException:本地异常失败:java.io.IOException:javax.security.sasl.SaslException:

GSS 启动失败 [由 GSSException 引起:未提供有效凭据(机制级别:未能找到任何 Kerberos tgt)];

主机详情:本地主机为:“ps2pr028380.express-scripts.com/10.221.171.22”;目标主机是:“ps2pr028377.express-scripts.com”:8020; 在 org.apache.hadoop.net.NetUtils.wrapException(NetUtils.java:782) 在 org.apache.hadoop.ipc.Client.getRpcResponse(Client.java:1558) 在 org.apache.hadoop.ipc.Client.call(Client.java:1498) 在 org.apache.hadoop.ipc.Client.call(Client.java:1398) 在 org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:233) 在 com.sun.proxy.$Proxy11.getDelegationToken(未知来源) 在 org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.getDelegationToken(ClientNamenodeProtocolTranslatorPB.java:980) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:291) 在 org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:203) 在 org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:185) 在 com.sun.proxy.$Proxy12.getDelegationToken(未知来源) 在 org.apache.hadoop.hdfs.DFSClient.getDelegationToken(DFSClient.java:1041) 在 org.apache.hadoop.hdfs.DistributedFileSystem.getDelegationToken(DistributedFileSystem.java:1688) 在 org.apache.hadoop.fs.FileSystem.collectDelegationTokens(FileSystem.java:549) 在 org.apache.hadoop.fs.FileSystem.addDelegationTokens(FileSystem.java:527) 在 org.apache.hadoop.hdfs.DistributedFileSystem.addDelegationTokens(DistributedFileSystem.java:2400) 在 org.apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodesInternal(TokenCache.java:140) 在 org.apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodesInternal(TokenCache.java:100) 在 org.apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodes(TokenCache.java:80) 在 org.apache.hadoop.mapreduce.lib.output.FileOutputFormat.checkOutputSpecs(FileOutputFormat.java:142) 在 org.apache.hadoop.mapreduce.JobSubmitter.checkSpecs(JobSubmitter.java:266) 在 org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:139) 在 org.apache.hadoop.mapreduce.Job$10.run(Job.java:1290) 在 org.apache.hadoop.mapreduce.Job$10.run(Job.java:1287) 在 java.security.AccessController.doPrivileged(本机方法) 在 javax.security.auth.Subject.doAs(Subject.java:422) 在 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1866) 在 org.apache.hadoop.mapreduce.Job.submit(Job.java:1287) 在 org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1308) 在 org.apache.sqoop.mapreduce.ImportJobBase.doSubmitJob(ImportJobBase.java:200) 在 org.apache.sqoop.mapreduce.ImportJobBase.runJob(ImportJobBase.java:173) 在 org.apache.sqoop.mapreduce.ImportJobBase.runImport(ImportJobBase.java:270) 在 org.apache.sqoop.manager.SqlManager.importQuery(SqlManager.java:748) 在 org.apache.sqoop.manager.OracleManager.importQuery(OracleManager.java:454) 在 org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:509) 在 org.apache.sqoop.tool.ImportTool.run(ImportTool.java:615) 在 org.apache.sqoop.Sqoop.run(Sqoop.java:147) 在 org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:76) 在 org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:183) 在 org.apache.sqoop.Sqoop.runTool(Sqoop.java:225) 在 org.apache.sqoop.Sqoop.runTool(Sqoop.java:234) 在 org.apache.sqoop.Sqoop.main(Sqoop.java:243) 引起:java.io.IOException:javax.security.sasl.SaslException:GSS 启动失败 [由 GSSException 引起:未提供有效凭据(机制级别:找不到任何 Kerberos tgt)] 在 org.apache.hadoop.ipc.Client$Connection$1.run(Client.java:720) 在 java.security.AccessController.doPrivileged(本机方法) 在 javax.security.auth.Subject.doAs(Subject.java:422) 在 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1866) 在 org.apache.hadoop.ipc.Client$Connection.handleSaslConnectionFailure(Client.java:683) 在 org.apache.hadoop.ipc.Client$Connection.setupiostreams(Client.java:770) 在 org.apache.hadoop.ipc.Client$Connection.access$3200(Client.java:397) 在 org.apache.hadoop.ipc.Client.getConnection(Client.java:1620) 在 org.apache.hadoop.ipc.Client.call(Client.java:1451) ... 43 更多 引起:javax.security.sasl.SaslException:GSS 启动失败 [由 GSSException 引起:未提供有效凭据(机制级别:找不到任何 Kerberos tgt)] 在 com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:211) 在 org.apache.hadoop.security.SaslRpcClient.saslConnect(SaslRpcClient.java:413) 在 org.apache.hadoop.ipc.Client$Connection.setupSaslConnection(Client.java:595) 在 org.apache.hadoop.ipc.Client$Connection.access$2000(Client.java:397) 在 org.apache.hadoop.ipc.Client$Connection$2.run(Client.java:762) 在 org.apache.hadoop.ipc.Client$Connection$2.run(Client.java:758) 在 java.security.AccessController.doPrivileged(本机方法) 在 javax.security.auth.Subject.doAs(Subject.java:422) 在 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1866) 在 org.apache.hadoop.ipc.Client$Connection.setupIOstreams(Client.java:757) ... 46 更多 原因: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) 在 com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:192) ... 55 更多

【问题讨论】:

我解决了自己的问题:我在脚本中添加了以下注释,并在 sqoop start 之前调用了它。 kinit -kt /home/userName/userName.keytab userName@PROD.DATAHUB.LOCAL 将此添加为“答案”。然后过两天回来自我接受。 感谢 Heron 的 cmets 【参考方案1】:

我解决了自己的问题:我在脚本中添加了以下注释,并在 sqoop 开始之前调用了它。

 kinit -kt /home/userName/userName.keytab userName@PROD.DATAHUB.LOCAL

我们正在使用hortonwork集群,所以他们对此问题有另一种解决方案,请在下面找到其他解决方案链接

https://community.hortonworks.com/questions/149168/sqoop-with-kerberos-security-not-working-in-cron-t.html

【讨论】:

请自行接受您的答案,将其标记为绿色,并更好地将其突出显示给可能在搜索结果中偶然发现此问题的其他人。

以上是关于具有 kerberos 安全性的 Sqoop 在 cron 中不起作用,抛出 GSSException的主要内容,如果未能解决你的问题,请参考以下文章

Spring Webflux + LDAP/Kerberos 安全性

Kerberos协议

可以将 hdfs 文件从 hadoop 集群 KERBEROS 复制到其他集群而不是 KERBEROS 吗?

Kafka Kerberos 安全认证

Spring 安全框架Kerberos 集成

CLIENT_0004:Unable to find valid Kerberos ticket cache (kinit)