Доступ HDFS с удаленного хоста через API Java, аутентификация пользователя

Мне нужно использовать кластер HDFS с удаленного рабочего стола через Java API. Все работает нормально, пока не дойдет до доступа к записи. Если я пытаюсь создать любой файл, я получаю исключение разрешения доступа. Путь выглядит хорошо, но исключение указывает мое имя пользователя удаленного рабочего стола, что, конечно же, не является тем, что мне нужно для доступа к нужному каталогу HDFS.

Вопрос: - Есть ли способ представить другое имя пользователя, используя "простую" аутентификацию в Java API? - Не могли бы вы указать какое-то хорошее объяснение схем аутентификации/авторизации в hadoop/HDFS предпочтительнее с примерами Java API?

Да, я уже знаю, что "whoami" может быть перегружен в этом случае с использованием псевдонима оболочки, но я предпочитаю избегать таких решений. Также здесь я не люблю использовать некоторые трюки, такие как трубы через SSH и скрипты. Я хотел бы выполнить все, используя только API Java. Заранее благодарю вас.

Ответ 1

После некоторого изучения я пришел к следующему решению:

  • Мне действительно не нужно полное решение Kerberos, в настоящее время достаточно, чтобы клиенты могли запускать запросы HDFS от любого пользователя. Сама среда считается безопасной.
  • Это дает мне решение, основанное на классе UserGroupInformation hasoop. В будущем я могу расширить его для поддержки Kerberos.

Пример кода, вероятно, полезен для людей как для "поддельной аутентификации", так и для удаленного доступа к HDFS:

package org.myorg;

import java.security.PrivilegedExceptionAction;

import org.apache.hadoop.conf.*;
import org.apache.hadoop.security.UserGroupInformation;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileStatus;

public class HdfsTest {

    public static void main(String args[]) {

        try {
            UserGroupInformation ugi
                = UserGroupInformation.createRemoteUser("hbase");

            ugi.doAs(new PrivilegedExceptionAction<Void>() {

                public Void run() throws Exception {

                    Configuration conf = new Configuration();
                    conf.set("fs.defaultFS", "hdfs://1.2.3.4:8020/user/hbase");
                    conf.set("hadoop.job.ugi", "hbase");

                    FileSystem fs = FileSystem.get(conf);

                    fs.createNewFile(new Path("/user/hbase/test"));

                    FileStatus[] status = fs.listStatus(new Path("/user/hbase"));
                    for(int i=0;i<status.length;i++){
                        System.out.println(status[i].getPath());
                    }
                    return null;
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Полезная ссылка для тех, у кого есть аналогичная проблема:

  • Сообщение блога Cloudera Авторизация и аутентификация в Hadoop". Короткие, сфокусированные на простом объяснении подходов безопасности в области безопасности. Нет информации, специфичной для решения Java API, но полезной для понимания проблемы.

UPDATE:
Альтернатива для тех, кто использует утилиту командной строки hdfs или hadoop без локального пользователя:

 HADOOP_USER_NAME=hdfs hdfs fs -put /root/MyHadoop/file1.txt /

Что вы на самом деле делаете, так это чтение локального файла в соответствии с вашими локальными разрешениями, но при размещении файла на HDFS вы аутентифицированы как пользователь hdfs.

Это похоже на аналогичные свойства кода API:

  • Вам не нужно sudo.
  • Вам не нужны фактические hdf файлы локального пользователя.
  • Вам не нужно ничего копировать или изменять разрешения из-за предыдущих пунктов.