10

我很高兴连接到 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 用户)身份连接。有谁知道您如何指定您连接的用户?

4

2 回答 2

26

我一看到这是通过UserGroupInformationclass 和PrivilegedActionor完成的PrivilegedExceptionAction。这是连接到远程 HDFS 'like' 不同用户(在本例中为'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();
        }
    }
}
于 2013-05-28T09:50:36.743 回答
0

如果我让你正确,你想要的只是获取用户的主目录(如果指定)而不是 whois 用户。

在您的配置文件中,将您的 homedir 属性设置为 user/${user.name}。确保您有一个名为 user.name 的系统属性

这在我的情况下有效。

我希望这是您想要做的,如果没有添加评论。

于 2013-05-27T07:33:32.503 回答