如何使用java远程创建hadoop文件系统的示例?

7rfyedvj  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(627)

我想通过java远程访问hadoop文件系统,但是每次运行下面的代码时,它只是显示本地文件系统。
我已经讨论了许多关于堆栈溢出的解决方案,但似乎没有任何效果。
以下是当前的尝试:
代码

Configuration obj = new Configuration();

obj.set("fs.defaultFS", "hdfs://localhost:8020");
obj.addResource(new Path("/etc/hadoop/conf/core-site.xml"));
obj.addResource(new Path("/etc/hadoop/conf/hdfs-site.xml"));

URI uri = new URI("hdfs://localhost:8020/");
Path path =new Path("/Myfiles/wc.txt");
FileSystem fs = FileSystem.get(obj);

System.out.println(fs.getHomeDirectory());

if(fs instanceof DistributedFileSystem) {
    System.out.println("HDFS is the underlying filesystem");
} else {
    System.out.println("Other type of file system "+fs.getClass());
}

FSDataInputStream fsDataInputStream = fs.open(path);
InputStreamReader inputStreamReader = new InputStreamReader(fsDataInputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String line;
while((line=bufferedReader.readLine())!=null){
    System.out.println(line);
}
bufferedReader .close();

我做错了什么?

thtygnil

thtygnil1#

此设置:

obj.set("fs.defaultFS", "hdfs://localhost:8020");

在这里已经存在:(没有意义使用它。)

obj.addResource(new Path("/etc/hadoop/conf/core-site.xml"));
obj.addResource(new Path("/etc/hadoop/conf/hdfs-site.xml"));

当然,这些文件在hadoop集群之外是不可用的。你必须复制它们。
如果你的 fs.defaultFSlocalhost:8020 此代码将只在名称节点正在侦听的主机上工作,而不在远程主机上工作。应该是这样的

obj.set("fs.default.name", "hdfs://mycluster.local:8020"); ( MRv1 )
obj.set("fs.defaultFS", "hdfs://mycluster.local:8020"); ( YARN )

其中my cluster.local解析为名称节点的正确ip地址。
顺便说一句,从外部访问hdfs的最好方法是webhdfs。

相关问题