HDFS из Java — указание пользователя

Я с радостью подключаюсь к HDFS и перечисляю свой домашний каталог:

Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://hadoop:8020");
conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
FileSystem fs = FileSystem.get(conf);
RemoteIterator<LocatedFileStatus> ri = fs.listFiles(fs.getHomeDirectory(), false);
while (ri.hasNext()) {
    LocatedFileStatus lfs = ri.next();
    log.debug(lfs.getPath().toString());
}
fs.close();

Что я хочу сделать сейчас, так это подключиться как конкретный пользователь (не пользователь whois). Кто-нибудь знает, как вы указываете, под каким пользователем вы подключаетесь?


person Kong    schedule 27.05.2013    source источник
comment
привет, я попробовал этот код для подключения к удаленному экземпляру hdfs, но я получаю исключение в потоке main java.lang.UnsupportedOperationException: не реализовано реализацией файловой системы DistributedFileSystem   -  person AbtPst    schedule 13.11.2015
comment
Вы знаете, как это решить?   -  person AbtPst    schedule 13.11.2015
comment
Я задавал этот вопрос более 2 лет назад. С тех пор Hadoop проделал долгий путь. Что касается точных реализаций, то, вполне возможно, сейчас все делается по-другому.   -  person Kong    schedule 13.11.2015
comment
ок, логично. однако, если вы все еще разрабатываете Hadoop и делаете что-то подобное, дайте мне знать. Я боролся с этим некоторое время. я также задал пару вопросов, stackoverflow .com/questions/33610916/ и stackoverflow .com/questions/33681940/   -  person AbtPst    schedule 13.11.2015
comment
если у вас есть время, попробуйте опубликовать ответ. я был бы вечно благодарен. Благодарность   -  person AbtPst    schedule 13.11.2015


Ответы (2)


Как только увижу это делается через UserGroupInformation класс и PrivilegedAction или PrivilegedExceptionAction. Вот пример кода для подключения к удаленной HDFS «как» у другого пользователя (в данном случае «hbase»). Надеюсь, это решит вашу задачу. Если вам нужна полная схема с аутентификацией, вам необходимо улучшить работу с пользователями. Но для ПРОСТОЙ схемы аутентификации (на самом деле никакой аутентификации) она работает просто отлично.

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();
        }
    }
}
person Roman Nikitchenko    schedule 28.05.2013
comment
Я искал настройки параметров конфигурации Hadoop и не получил никаких полезных объяснений. Означает ли hbase пользователя в conf.set. Где я могу получить все объяснения классов Hadoop, а не только классы avail. Любые ссылки, пожалуйста? - person Gibbs; 12.02.2015
comment
org.apache.hadoop.security.UserGroupInformation здесь ключевой класс, и он позволяет указать «удаленного пользователя» через createRemoteUser(). Таким образом, кластер Hadoop видит вас как пользователя, которого вы указали, независимо от вашего локального пользователя. Конечно, это работает только в том случае, если ваш кластер Hadoop доверяет вам (ПРОСТАЯ аутентификация, на самом деле никакой). С Kerberous вам дополнительно нужно будет предоставить доказательства. - person Roman Nikitchenko; 13.02.2015
comment
я пробовал это, но получаю java.lang.UnsupportedOperationException: не реализован реализацией файловой системы DistributedFileSystem - person AbtPst; 12.11.2015
comment
@AbtPst Как вы можете видеть, люди активно используют это, и у меня есть только 2 предположения для вас: 1) Проверьте стек исключений, чтобы изолировать основную причину. 2) Проверьте свои адреса/порты/пути. Возможно, вы просто используете неправильное имя пользователя. - person Roman Nikitchenko; 12.11.2015
comment
как мне получить список правильных имен пользователей? пожалуйста, простите меня, если это основной вопрос, но я новичок в Hadoop и Unix - person AbtPst; 12.11.2015
comment
На самом деле нет единого пути: hadoop. apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/ - person Roman Nikitchenko; 13.11.2015

Если я вас правильно понял, все, что вам нужно, это получить домашний каталог пользователя, если он указан, а не пользователя whois.

В файле конфигурации установите для свойства homedir значение user/${user.name}. Убедитесь, что у вас есть системное свойство с именем user.name

Это сработало в моем случае.

Я надеюсь, что это то, что вы хотите сделать, если не добавить комментарий.

person sadhu    schedule 27.05.2013
comment
На самом деле я хочу просмотреть всю файловую систему HDFS, как это делает Hue. то есть быть пользователем hdfs. - person Kong; 27.05.2013