HDP 3.1集群作业因Kerberos凭证问题执行失败求助
HDP 3.1集群Kerberos认证失败导致作业执行异常
问题现象
启用NameNode HA、通过AD集成Kerberos安全认证的HDP 3.1集群中,作业执行失败,核心报错为找不到Kerberos TGT凭证,导致Hive Metastore连接失败,具体日志如下:
23/01/12 05:03:13 信息 HiveMetaStoreClient: HMSC::open(): 未找到委托令牌。创建基于KERBEROS的thrift连接。 23/01/12 05:03:13 错误 TSaslTransport: SASL协商失败 javax.security.sasl.SaslException: GSS初始化失败 [由GSSException引起: 未提供有效凭证(机制级别: 未找到任何Kerberos tgt)] 在 com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:211) 在 org.apache.thrift.transport.TSaslClientTransport.handleSaslStartMessage(TSaslClientTransport.java:94) 在 org.apache.thrift.transport.TSaslTransport.open(TSaslTransport.java:271) 在 org.apache.thrift.transport.TSaslClientTransport.open(TSaslClientTransport.java:37) 在 org.apache.hadoop.hive.metastore.security.TUGIAssumingTransport$1.run(TUGIAssumingTransport.java:51) 在 org.apache.hadoop.hive.metastore.security.TUGIAssumingTransport$1.run(TUGIAssumingTransport.java:48) 在 java.security.AccessController.doPrivileged(Native Method) 在 javax.security.auth.Subject.doAs(Subject.java:422) 在 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1730) 在 org.apache.hadoop.hive.metastore.security.TUGIAssumingTransport.open(TUGIAssumingTransport.java:48) 在 org.apache.hadoop.hive.metastore.HiveMetaStoreClient.open(HiveMetaStoreClient.java:544) 在 org.apache.hadoop.hive.metastore.HiveMetaStoreClient.<init>(HiveMetaStoreClient.java:225) 在 org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient.<init>(SessionHiveMetaStoreClient.java:96) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:423) 在 org.apache.hadoop.hive.metastore.utils.JavaUtils.newInstance(JavaUtils.java:84) 在 org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.<init>(RetryingMetaStoreClient.java:95) 在 org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.getProxy(RetryingMetaStoreClient.java:148) 在 org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.getProxy(RetryingMetaStoreClient.java:119) 在 org.apache.hadoop.hive.ql.metadata.Hive.createMetaStoreClient(Hive.java:4656) 在 org.apache.hadoop.hive.ql.metadata.Hive.getMSC(Hive.java:4724) 在 org.apache.hadoop.hive.ql.metadata.Hive.getMSC(Hive.java:4704) 在 org.apache.hadoop.hive.ql.metadata.Hive.getAllFunctions(Hive.java:4995) 在 org.apache.hadoop.hive.ql.metadata.Hive.reloadFunctions(Hive.java:311) 在 org.apache.hadoop.hive.ql.metadata.Hive.registerAllFunctionsOnce(Hive.java:294) 在 org.apache.hadoop.hive.ql.metadata.Hive.<init>(Hive.java:464) 在 org.apache.hadoop.hive.ql.metadata.Hive.create(Hive.java:393) 在 org.apache.hadoop.hive.ql.metadata.Hive.getInternal(Hive.java:380) 在 org.apache.hadoop.hive.ql.metadata.Hive.get(Hive.java:351) 在 org.apache.spark.sql.hive.client.HiveClientImpl.org$apache$spark$sql$hive$client$HiveClientImpl$$client(HiveClientImpl.scala:249) 在 org.apache.spark.sql.hive.client.HiveClientImpl$$anonfun$withHiveState$1.apply(HiveClientImpl.scala:271) 在 org.apache.spark.sql.hive.client.HiveClientImpl.liftedTree1$1(HiveClientImpl.scala:216) 在 org.apache.spark.sql.hive.client.HiveClientImpl.retryLocked(HiveClientImpl.scala:215) 在 org.apache.spark.sql.hive.client.HiveClientImpl.withHiveState(HiveClientImpl.scala:261) 在 org.apache.spark.sql.hive.client.HiveClientImpl.databaseExists(HiveClientImpl.scala:345) 在 org.apache.spark.sql.hive.HiveExternalCatalog$$anonfun$databaseExists$1.apply$mcZ$sp(HiveExternalCatalog.scala:195) 在 org.apache.spark.sql.hive.HiveExternalCatalog$$anonfun$databaseExists$1.apply(HiveExternalCatalog.scala:195) 在 org.apache.spark.sql.hive.HiveExternalCatalog$$anonfun$databaseExists$1.apply(HiveExternalCatalog.scala:195) 在 org.apache.spark.sql.hive.HiveExternalCatalog.withClient(HiveExternalCatalog.scala:97) 在 org.apache.spark.sql.hive.HiveExternalCatalog.databaseExists(HiveExternalCatalog.scala:194) 在 org.apache.spark.sql.internal.SharedState.externalCatalog$lzycompute(SharedState.scala:114) 在 org.apache.spark.sql.internal.SharedState.externalCatalog(SharedState.scala:102) 在 org.apache.spark.sql.internal.SharedState.globalTempViewManager$lzycompute(SharedState.scala:138) 在 org.apache.spark.sql.internal.SharedState.globalTempViewManager(SharedState.scala:133) 在 org.apache.spark.sql.hive.HiveSessionStateBuilder$$anonfun$2.apply(HiveSessionStateBuilder.scala:54) 在 org.apache.spark.sql.hive.HiveSessionStateBuilder$$anonfun$2.apply(HiveSessionStateBuilder.scala:54) 在 org.apache.spark.sql.catalyst.catalog.SessionCatalog.globalTempViewManager$lzycompute(SessionCatalog.scala:91) 在 org.apache.spark.sql.catalyst.catalog.SessionCatalog.globalTempViewManager(SessionCatalog.scala:91) 在 org.apache.spark.sql.catalyst.catalog.SessionCatalog.isTemporaryTable(SessionCatalog.scala:702) 在 org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveRelations$.isRunningDirectlyOnFiles(Analyzer.scala:681) 在 org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveRelations$.resolveRelation(Analyzer.scala:615) 在 org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveRelations$$anonfun$apply$8.applyOrElse(Analyzer.scala:647) 在 org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveRelations$$anonfun$apply$8.applyOrElse(Analyzer.scala:640) 在 org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformUp$1.apply(TreeNode.scala:289) 在 org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformUp$1.apply(TreeNode.scala:289) 在 org.apache.spark.sql.catalyst.trees.CurrentOrigin$.withOrigin(TreeNode.scala:70) 在 org.apache.spark.sql.catalyst.trees.TreeNode.transformUp(TreeNode.scala:288) 在 org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$3.apply(TreeNode.scala:286) 在 org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$3.apply(TreeNode.scala:286) 在 org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$4.apply(TreeNode.scala:306) 在 org.apache.spark.sql.catalyst.trees.TreeNode.mapProductIterator(TreeNode.scala:187) 在 org.apache.spark.sql.catalyst.trees.TreeNode.mapChildren(TreeNode.scala:304) 在 org.apache.spark.sql.catalyst.trees.TreeNode.transformUp(TreeNode.scala:286) 在 org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$3.apply(TreeNode.scala:286) 在 org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$3.apply(TreeNode.scala:286) 在 org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$4.apply(TreeNode.scala:306) 在 org.apache.spark.sql.catalyst.trees.TreeNode.mapProductIterator(TreeNode.scala:187) 在 org.apache.spark.sql.catalyst.trees.TreeNode.mapChildren(TreeNode.scala:304) 在 org.apache.spark.sql.catalyst.trees.TreeNode.transformUp(TreeNode.scala:286) 在 org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$3.apply(TreeNode.scala:286) 在 org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$3.apply(TreeNode.scala:286) 在 org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$4.apply(TreeNode.scala:306) 在 org.apache.spark.sql.catalyst.trees.TreeNode.mapProductIterator(TreeNode.scala:187) 在 org.apache.spark.sql.catalyst.trees.TreeNode.mapChildren(TreeNode.scala:304) 在 org.apache.spark.sql.catalyst.trees.TreeNode.transformUp(TreeNode.scala:286) 在 org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveRelations$.apply(Analyzer.scala:640) 在 org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveRelations$.apply(Analyzer.scala:586) 在 org.apache.spark.sql.catalyst.rules.RuleExecutor$$anonfun$execute$1$$anonfun$apply$1.apply(RuleExecutor.scala:87) 在 org.apache.spark.sql.catalyst.rules.RuleExecutor$$anonfun$execute$1$$anonfun$apply$1.apply(RuleExecutor.scala:84) 在 scala.collection.LinearSeqOptimized$class.foldLeft(LinearSeqOptimized.scala:124) 在 scala.collection.immutable.List.foldLeft(List.scala:84) 在 org.apache.spark.sql.catalyst.rules.RuleExecutor$$anonfun$execute$1.apply(RuleExecutor.scala:84) 在 org.apache.spark.sql.catalyst.rules.RuleExecutor$$anonfun$execute$1.apply(RuleExecutor.scala:76) 在 scala.collection.immutable.List.foreach(List.scala:381) 在 org.apache.spark.sql.catalyst.rules.RuleExecutor.execute(RuleExecutor.scala:76) 在 org.apache.spark.sql.catalyst.analysis.Analyzer.org$apache$spark$sql$catalyst$analysis$Analyzer$$executeSameContext(Analyzer.scala:124) 在 org.apache.spark.sql.catalyst.analysis.Analyzer.execute(Analyzer.scala:118) 在 org.apache.spark.sql.catalyst.analysis.Analyzer.executeAndCheck(Analyzer.scala:103) 在 org.apache.spark.sql.execution.QueryExecution.analyzed$lzycompute(QueryExecution.scala:57) 在 org.apache.spark.sql.execution.QueryExecution.analyzed(QueryExecution.scala:55) 在 org.apache.spark.sql.execution.QueryExecution.assertAnalyzed(QueryExecution.scala:47) 在 org.apache.spark.sql.Dataset$.ofRows(Dataset.scala:74) 在 org.apache.spark.sql.SparkSession.sql(SparkSession.scala:642) 在 com.virginvoyages.dimension.SurveyQuestionsDimLoad$.main(SurveyQuestionsDimLoad.scala:53) 在 com.virginvoyages.dimension.SurveyQuestionsDimLoad.main(SurveyQuestionsDimLoad.scala) 在 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.spark.deploy.yarn.ApplicationMaster$$anon$4.run(ApplicationMaster.scala:721) 引起原因: 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) ... 101 个更多调用 23/01/12 05:03:13 警告 HiveMetaStoreClient: 连接到MetaStore服务器失败... 23/01/12 05:03:13 信息 HiveMetaStoreClient: 等待5秒后尝试下一次连接。 23/01/12 05:03:18 信息 HiveMetaStoreClient: 尝试使用URI thrift://Metastorehostname:9083连接到metastore 23/01/12 05:03:18 信息 HiveMetaStoreClient: HMSC::open(): 未找到委托令牌。创建基于KERBEROS的thrift连接。 23/01/12 05:03:18 错误 TSaslTransport: SASL协商失败 javax.security.sasl.SaslException: GSS初始化失败 [由GSSException引起: 未提供有效凭证(机制级别: 未找到任何Kerberos tgt)] 在 com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:211) 在 org.apache.thrift.transport.TSaslClientTransport.handleSaslStartMessage(TSaslClientTransport.java:94) 在 org.apache.thrift.transport.TSaslTransport.open(TSaslTransport.java:271) 在 org.apache.thrift.transport.TSaslClientTransport.open(TSaslClientTransport.java:37) 在 org.apache.hadoop.hive.metastore.security.TUGIAssumingTransport$1.run(TUGIAssumingTransport.java:51) 在 org.apache.hadoop.hive.metastore.security.TUGIAssumingTransport$1.run(TUGIAssumingTransport.java:48) 在 java.security.AccessController.doPrivileged(Native Method) 在 javax.security.auth.Subject.doAs(Subject.java:422)
排查与解决步骤
- 检查作业提交用户的Kerberos凭证
- 执行
klist查看是否存在有效TGT凭证,若没有则执行kinit <AD用户名>手动获取;批量作业需通过keytab自动获取:kinit -kt /path/to/用户密钥表文件.keytab <AD用户名>
- 执行
- 验证Hive Metastore的Kerberos配置
- 检查
hive-site.xml中hive.metastore.sasl.enabled是否设为true,hive.metastore.kerberos.principal是否配置正确(格式通常为hive/_HOST@AD_REALM)
- 检查
- 确认集群节点的Kerberos配置一致性
- 检查所有节点的
/etc/krb5.conf文件,确保AD的KDC地址、REALM名称等配置一致,且能正常解析KDC服务器
- 检查所有节点的
- 检查YARN凭证传递配置
- 确认YARN已启用Kerberos认证,
yarn-site.xml中yarn.resourcemanager.principal等相关配置正确,保证作业提交时凭证能传递给ApplicationMaster
- 确认YARN已启用Kerberos认证,
- 验证AD用户权限与状态
- 确认AD用户未被锁定、密码未过期,且拥有访问Hive Metastore的权限,Kerberos主体在AD中存在有效条目
内容的提问来源于stack exchange,提问作者kant
相关产品推荐
相关产品推荐

