我很高兴能够连接到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用户)。有谁知道你如何指定你连接的用户?
答案 0 :(得分:24)
我看到这是通过UserGroupInformation
课程和PrivilegedAction
或PrivilegedExceptionAction
完成的。以下是连接到远程HDFS的示例代码,例如'不同用户'(在本例中为'hbase')。希望这能解决你的任务。如果您需要完整的身份验证方案,则需要改进用户处理。但对于SIMPLE身份验证方案(实际上没有身份验证),它可以正常工作。
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();
}
}
}
答案 1 :(得分:0)
如果我纠正了你,你想要的只是指定用户的主目录而不是whois用户。
在配置文件中,将homedir属性设置为user / $ {user.name}。确保您具有名为user.name
的系统属性这适用于我的情况。
我希望这是你想要做的,如果不添加评论。