Я включил аутентификацию Kerberos на своем кластере HDFS, и мне нужно подключиться к нескольким HDFS с различными областями с помощью программы java. Но он не может войти в систему
System.out.println("Login with A.EXAMPLE.COM");
String user = "hdfs/" + args[0] + "@" + args[1].toUpperCase() +".EXAMPLE.COM";
String keyPath = "/path/hdfs.keytab";
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://" + args[0] + ":9000");
conf.set("hadoop.security.authentication", "kerberos");
System.setProperty("java.security.krb5.kdc", args[0]);
System.setProperty("java.security.krb5.realm", args[1].toUpperCase() + ".EXAMPLE.COM");
UserGroupInformation.setConfiguration(conf);
UserGroupInformation.loginUserFromKeytab(user, keyPath);
FileSystem fs = FileSystem.get(conf);
FileStatus[] fsStatus = fs.listStatus(new Path("/"));
System.out.println("List directory for tenant " + args[1]);
for (int i = 0; i < fsStatus.length; i++) {
System.out.println(fsStatus[i].getPath().toString());
}
UserGroupInformation.trimLoginMethod(user);
System.out.println("Login with B.EXAMPLE.COM");
user = "hdfs/" + args[2] + "@" + args[3].toUpperCase() + ".EXAMPLE.COM";
keyPath = "/path1/hdfs.keytab";
Configuration conf1 = new Configuration();
conf1.set("fs.defaultFS", "hdfs://" + args[2] + ":9000");
conf1.set("hadoop.security.authentication", "kerberos");
System.setProperty("java.security.krb5.kdc", args[2]);
System.setProperty("java.security.krb5.realm", args[3].toUpperCase() + ".EXAMPLE.COM");
UserGroupInformation.setConfiguration(conf1);
UserGroupInformation.loginUserFromKeytab(user, keyPath);
FileSystem fs1 = FileSystem.get(conf1);
fsStatus = fs1.listStatus(new Path("/"));
System.out.println("List directory for " + args[2]);
for (int i = 0; i < fsStatus.length; i++) {
System.out.println(fsStatus[i].getPath().toString());
}
Я могу перечислить каталог для первого пользователя с областью a.example.com, но не для другого пользователя, он выдает исключение
javax. security.auth.login.LoginException: java .lang.IllegalArgumentException: недопустимое имя участника hdfs / 10.36.0. 6@B.EXAMPLE.COM: org. apache .had oop .security.authentication.util.KerberosName $ NoMatchingRule: К hdfs / 10.36.0 не применяются никакие правила. 6@B.EXAMPLE.COM
Еще одна вещь, которую я заметил, что мой логин UserGroupInformation.get не изменился, остается неизменной во всей программе. Я попытался урезать вошедшего в систему пользователя UserGroupInformation.trimLoginMethod (user); но это не имеет никакого эффекта
Как добиться этого сценария?