我想通过Java远程访问Hadoop文件系统,但每次运行以下代码时,它只显示本地文件系统。
我在Stack Overflow上经历了很多解决方案,但似乎没有任何效果。
这是当前的尝试:
代码
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();
我做错了什么?
答案 0 :(得分:0)
此设置:
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.defaultFS
是localhost:8020
,则此代码仅适用于名称节点正在侦听的主机,而不是遥控器。
它应该像
obj.set("fs.default.name", "hdfs://mycluster.local:8020"); ( MRv1 )
obj.set("fs.defaultFS", "hdfs://mycluster.local:8020"); ( YARN )
我的cluster.local解析为名称节点的正确IP地址。
BTW从外部访问HDFS的最佳方式是webHDFS。