Невозможно использовать несколько Kerberos Realm для подключения с HDFS - PullRequest
0 голосов
/ 24 января 2020

Я включил аутентификацию 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); но это не имеет никакого эффекта

Как добиться этого сценария?

...