
# MRS应用开发认证失败常见问题
#### 现象描述
MRS样例工程调试运行过程发现认证失败。
#### 处理流程
出现认证失败的原因很多，在不同场景中建议参考以下步骤来排查：
1. 确认本应用所运行设备和集群网络上是否通畅，Kerberos认证所需的各类端口（TCP/UDP）是否可正常访问。
2. 确认各个配置文件是否被正确读取到，路径是否保存正确。
3. 确认用户名和keytab文件是按操作指导得到的。
4. 确认各类配置信息是否已经先设置好了，再发起认证。
5. 确认没有在同一个进程中发起多次认证，即重复调用login()方法。
6. 若还有问题，需联系技术支持人员做进一步分析。
 
#### 认证失败样例
**解决认证出现如下关键字：clock skew too great** **的问题**
1. 检查集群时间。
2. 检查开发环境所在机器的时间，与集群时间的偏差应小于5分钟。
**解决认证出现如下关键字：(** **Receive** **time out) can not connect to kdc server** **的问题**
1. 要检查"krb5.conf"文件内容是否正确，即是否与集群中的KerberoServer的业务IP配置相同。
2. 检查Kerberos服务是否正常。
3. 检查防火墙是否关闭。
**解决客户端应用提交任务到hadoop集群报错，提示Failed to find any Kerberos tgt或者No valid credentials provided的问题**
1. 检查是否执行了kinit，若未执行，则先执行kinit认证操作，再提交任务。
2. 多线程场景下，需要在进程的开始处调用hadoop提供的loginfromkeytab函数登录KDC，得到TGT，后续提交任务之前，调用reloginFromKeytab函数刷新该TGT。 
   ```
   //进程入口首次登录，登录成功设置userGroupInformation
   UserGroupInformation.loginUserFromKeytab(this.userPrincipal,this.keytabFile);
   //线程提交任务之前：
   UserGroupInformation.getLoginUser().reloginFromKeytab();
   ```
   
   
3. 多个脚本同时使用kinit命令认证同一个用户的场景下，需要在各个脚本中执行kinit命令之前，先执行export KRB5CCNAME=keytab_path命令，确保每个脚本进程中KRB5CCNAME指向的路径不一致。
 
