网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
org.apache.hadoop.security.KerberosAuthException: failure to login: for principal: xxx@HADOOP.COM from keytab D:\xxx\xxx\xxx.keytab javax.security.auth.login.LoginException: null (68)
Caused by: javax.security.auth.login.LoginException: null (68)
Caused by: KrbException: null (68)
Caused by: KrbException: Identifier doesn't match expected value (906)
2、hadoop conf信息配置
Hadoop configuration配置(类org.apache.hadoop.conf.Configuration
)
文档中明确了:会默认加载类路径下的core-default.xml
文件内容。
Unless explicitly turned off, Hadoop by default specifies two resources, loaded in-order from the classpath:
core-default.xml: Read-only defaults for hadoop.
core-site.xml: Site-specific configuration for a given hadoop installation.
core-default.xml
中含有hadoop的安全配置hadoop.security.authentication
,在UserGroupInformation
中依据此项配置,查询集群是否启动kerberos。
HADOOP_SECURITY_AUTHENTICATION路径如下:
org.apache.hadoop.fs.CommonConfigurationKeysPublic#HADOOP_SECURITY_AUTHENTICATION
public static AuthenticationMethod getAuthenticationMethod(Configuration conf) {
String value = conf.get(HADOOP\_SECURITY\_AUTHENTICATION, "simple");
try {
return Enum.valueOf(AuthenticationMethod.class,
StringUtils.toUpperCase(value));
} catch (IllegalArgumentException iae) {
throw new IllegalArgumentException("Invalid attribute value for " +
HADOOP\_SECURITY\_AUTHENTICATION + " of " + value);
}
}
所以如果在环境变量中配置了HADOOP_HOME
或者HADOOP_CONF_DIR
对于UserGroupInformation
是没有用的。
必须将core-site.xml
放在类路径下,或者直接调用org.apache.hadoop.security.UserGroupInformation#setConfiguration
设置加载过core-site.xml的conf对象。
3、UserGroupInformation认证
3.1 、apache原生的UserGroupInformation验证:
UserGroupInformation类中使用静态变量存放hadoop conf和已认证用户信息,所以只需要程序中认证一次,不同类不需要传递认证的user,只需要都到UserGroupInformation取即可。
private static Configuration conf;
private static UserGroupInformation loginUser = null;
private static String keytabPrincipal = null;
private static String keytabFile = null;
调用org.apache.hadoop.security.UserGroupInformation#loginUserFromKeytab
传入principal和keytab就可以完成认证。
3.2、cloudera改良过的UserGroupInformation验证:
当然,可以调用原生的loginUserFromKeytab
也可以。
改良内容就是通过配置环境变量的方法,隐性
完成kerberos用户认证。无需UserGroupInformation认证,在调用getLoginUser
可以自动完成认证。
具体过程如下:
org.apache.hadoop.security.UserGroupInformation#getLoginUser
方法获取用户
public static UserGroupInformation getLoginUser() throws IOException {
...
if (loginUser == null) {
UserGroupInformation newLoginUser = createLoginUser(null);
...
}
}
实际是调用了doSubjectLogin(null, null)
UserGroupInformation createLoginUser(Subject subject) throws IOException {
UserGroupInformation realUser = doSubjectLogin(subject, null);
...
}
如下代码subject == null && params == null
判断true
private static UserGroupInformation doSubjectLogin(
Subject subject, LoginParams params) throws IOException {
ensureInitialized();
// initial default login.
if (subject == null && params == null) {
params = LoginParams.getDefaults();
}
HadoopConfiguration loginConf = new HadoopConfiguration(params);
try {
HadoopLoginContext login = newLoginContext(
authenticationMethod.getLoginAppName(), subject, loginConf);
login.login();
...
}
获取环境变量:KRB5PRINCIPAL
、KRB5KEYTAB
、KRB5CCNAME
private static class LoginParams extends EnumMap<LoginParam,String>
implements Parameters {
...
static LoginParams getDefaults() {
LoginParams params = new LoginParams();
params.put(LoginParam.PRINCIPAL, System.getenv("KRB5PRINCIPAL"));
params.put(LoginParam.KEYTAB, System.getenv("KRB5KEYTAB"));
params.put(LoginParam.CCACHE, System.getenv("KRB5CCNAME"));
return params;
}
}
结果是利用环境变量设置的pricipal+keytab或者cache认证。
环境变量配置:
(1)每个程序单独配置:
在-DKRB5PRINCIPAL=xxx -DKRB5KEYTAB=xxx
或者 -DKRB5CCNAME=xxx
(2)系统环境默认配置:
win环境如下:
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新