如何通过Resource Manager REST API终止Kerberos EMR集群YARN任务
问题描述
在启用Kerberos的EMR集群中,尝试通过Resource Manager(RM)API终止YARN任务,执行以下curl命令:
curl -v -X PUT -H "Content-Type: application/json" -d '{"state": "KILLED"}' "http://x.x.x.x:8088/ws/v1/cluster/apps/application_id/state?user.name=hadoop"
出现错误:
{"RemoteException":{"exception":"ForbiddenException","message":"java.lang.Exception: The default static user cannot carry out this operation.","javaClassName":"org.apache.hadoop.yarn.webapp.ForbiddenException"}}
原因分析
启用Kerberos的集群中,YARN RM API不认可通过user.name参数指定用户的静态身份传递方式,这种方式不符合Kerberos的安全认证逻辑,因此被拒绝执行操作。
解决方案
需通过Kerberos认证机制调用API,步骤如下:
- 先配置客户端Kerberos环境(确保
krb5.conf文件配置正确,且持有对应用户的keytab文件),执行票据获取命令:
替换kinit -kt /path/to/hadoop.keytab hadoop@REALM_NAME/path/to/hadoop.keytab为实际keytab文件路径,REALM_NAME为集群的Kerberos域名称(EMR集群通常为EC2.INTERNAL或自定义域)。 - 使用带Kerberos协商认证的curl命令调用API:
说明:curl -v --negotiate -u : -X PUT -H "Content-Type: application/json" -d '{"state": "KILLED"}' "http://x.x.x.x:8088/ws/v1/cluster/apps/application_id/state"--negotiate参数启用SPNEGO协商认证,-u :表示使用当前Kerberos票据对应的用户身份。
补充说明
如果是在应用程序中集成调用,需确保应用支持Kerberos认证:先获取Kerberos票据,再使用支持SPNEGO的HTTP客户端(如Java HttpClient配置Kerberos认证)调用RM API,避免使用user.name参数传递用户身份。
内容的提问来源于stack exchange,提问作者rajani
相关产品推荐
相关产品推荐

