运行Apache Crunch MapReduce流水线需何种Kerberos凭证解决无有效凭证异常?
解决Apache Crunch MapReduce流水线的Kerberos凭证问题
从你的日志来看,核心问题是Yarn容器中的Map/Reduce任务无法获取有效的Kerberos TGT凭证——虽然你在提交任务的机器上执行了kinit,但这个凭证只在当前机器的会话中有效,Yarn启动的子容器(YarnChild)并不会自动继承这个凭证。下面是具体的解决思路和需要的凭证说明:
需要的Kerberos凭证类型
- 用户持久化TGT票据:提交任务的用户需要有长期有效的Kerberos初始票据(TGT),用于向Kerberos认证并获取服务委托令牌。交互式
kinit的票据有有效期限制,且无法在容器中复用,必须用keytab文件生成持久化票据。 - HBase服务委托令牌:MapReduce任务访问HBase时,需要持有HBase的委托令牌——这个令牌可以让容器在不需要用户TGT的情况下,直接向HBase服务发起认证请求。
- 集群服务的Kerberos配置支撑:Yarn、HBase等集群组件必须已启用Kerberos认证,确保容器能正确获取和使用凭证。
具体解决步骤
使用keytab文件完成持久化登录
交互式kinit获取的票据会过期,且无法被Yarn容器复用。建议用用户专属的keytab文件登录,确保凭证长期有效:kinit -kt /path/to/your/user.keytab your_principal@YOUR_REALM.COM在Crunch任务中显式获取HBase委托令牌
在提交Crunch任务前,需要手动获取HBase的委托令牌并添加到JobConfiguration中,让Yarn容器能携带令牌访问HBase。示例代码:// 初始化HBase配置并开启Kerberos认证 Configuration conf = HBaseConfiguration.create(); conf.set("hbase.security.authentication", "kerberos"); conf.set("hadoop.security.authentication", "kerberos"); // 获取当前用户的Kerberos上下文,并获取HBase委托令牌 UserGroupInformation.setConfiguration(conf); UserGroupInformation ugi = UserGroupInformation.getCurrentUser(); Token<?>[] hbaseTokens = TokenUtil.obtainTokensForNamenodes(ugi, new Configuration[]{conf}); // 将令牌添加到任务配置的凭证库中 for (Token<?> token : hbaseTokens) { conf.getCredentials().addToken(token.getService(), token); } // 用包含令牌的配置初始化Crunch Pipeline Pipeline pipeline = new MRPipeline(YourCrunchJob.class, conf);检查集群Kerberos配置正确性
- 确保Yarn配置文件
yarn-site.xml中启用Kerberos认证:<property> <name>yarn.resourcemanager.authentication</name> <value>kerberos</value> </property> <property> <name>yarn.nodemanager.authentication</name> <value>kerberos</value> </property> - 确保HBase配置文件
hbase-site.xml中Kerberos参数正确:<property> <name>hbase.security.authentication</name> <value>kerberos</value> </property> <property> <name>hbase.master.kerberos.principal</name> <value>hbase/_HOST@YOUR_REALM.COM</value> </property> <property> <name>hbase.regionserver.kerberos.principal</name> <value>hbase/_HOST@YOUR_REALM.COM</value> </property>
- 确保Yarn配置文件
验证委托令牌是否成功传递
提交任务后,可通过Hadoop命令查看任务的凭证列表,确认HBase令牌已包含其中:hadoop job -list-credentials <your-job-id>
为什么kinit后问题仍存在?
kinit只是在你执行命令的机器上生成了用户TGT,但Yarn容器运行在集群的其他节点上,这些节点并没有你的TGT。Hadoop的Kerberos认证机制依赖委托令牌实现跨节点的服务访问,因此必须显式获取并传递这些令牌给任务配置,才能让容器完成HBase的SASL认证。
内容的提问来源于stack exchange,提问作者Manoj Manjunath
相关产品推荐
相关产品推荐

