用 java遍历hadoop分布式文件系统中某个目录下的全部文件,我的hadoop是单节点的 110
importorg.apache.hadoop.fs.*;importorg.apache.hadoop.conf.*;publicclassFileList{publi...
import org.apache.hadoop.fs.*;
import org.apache.hadoop.conf.*;
public class FileList{
public static void main(String[] args){
try{
Configuration conf=new Configuration();
FileSystem hdfs=FileSystem.get(conf);
Path path=new Path("/home/");
FileStatus status[]=hdfs.listStatus(path);
for(int i=0; i<status.length; i++){
System.out.println(status[i].getPath().toString());
}
hdfs.close();
System.out.println("end");
}
catch(Exception e){
e.printStackTrace();
}
}
}
//为什么上面的代码总是显示操作系统本地文件系统 /home 下的文件
//输出如下
file:/home/lost+found
file:/home/dell
end 展开
import org.apache.hadoop.conf.*;
public class FileList{
public static void main(String[] args){
try{
Configuration conf=new Configuration();
FileSystem hdfs=FileSystem.get(conf);
Path path=new Path("/home/");
FileStatus status[]=hdfs.listStatus(path);
for(int i=0; i<status.length; i++){
System.out.println(status[i].getPath().toString());
}
hdfs.close();
System.out.println("end");
}
catch(Exception e){
e.printStackTrace();
}
}
}
//为什么上面的代码总是显示操作系统本地文件系统 /home 下的文件
//输出如下
file:/home/lost+found
file:/home/dell
end 展开
3个回答
展开全部
原因:
你访问的是本地文件系统而非hdfs , 因为Configuration默认的是在core-default.xml中的属性fs.default.name默认值是file:///,表示本地文件系统。在我们new Configuration();时会默认加载core-default.xml文件,所以根据这个文件的fs.default.name值使用了本地文件系统。
解决方法:
一般安装hadoop时都是修改core-site.xml文件,这个文件设置的属性值一般使用来覆盖core-default.xml这个文件的,在core-site.xml文件中会设置fs.default.name值为hadoop的namenode的地址以及端口号,如hdfs://localhost:9000,即表示namenode是本机,也就是为分布式。所以我们在连接hdfs时需要指定连接的地址,也就是hadoop集群中core-site.xml中fs.default.name属性值。所以解决方法有三种:
1)在代码Configuration conf=new Configuration();之后手动为Configuration对象设置fs.default.name属性值,如:conf.set("fs.default.name","hdfs:localhost:9000");
2)在代码的classpath下创建一个文件,在文件中设置fs.default.name属性值,再使用conf.addResource("文件路径")将该文件添加到Configuration中;
3)直接将集群的core-site.xml添加到classpath下即可,无需手动添加到Configuration,在new Configuration时会自动加载该文件
你访问的是本地文件系统而非hdfs , 因为Configuration默认的是在core-default.xml中的属性fs.default.name默认值是file:///,表示本地文件系统。在我们new Configuration();时会默认加载core-default.xml文件,所以根据这个文件的fs.default.name值使用了本地文件系统。
解决方法:
一般安装hadoop时都是修改core-site.xml文件,这个文件设置的属性值一般使用来覆盖core-default.xml这个文件的,在core-site.xml文件中会设置fs.default.name值为hadoop的namenode的地址以及端口号,如hdfs://localhost:9000,即表示namenode是本机,也就是为分布式。所以我们在连接hdfs时需要指定连接的地址,也就是hadoop集群中core-site.xml中fs.default.name属性值。所以解决方法有三种:
1)在代码Configuration conf=new Configuration();之后手动为Configuration对象设置fs.default.name属性值,如:conf.set("fs.default.name","hdfs:localhost:9000");
2)在代码的classpath下创建一个文件,在文件中设置fs.default.name属性值,再使用conf.addResource("文件路径")将该文件添加到Configuration中;
3)直接将集群的core-site.xml添加到classpath下即可,无需手动添加到Configuration,在new Configuration时会自动加载该文件
展开全部
你把 path=new Path("/home/");里面的目录用hdfs中文件地址替换一下试试
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
使用FileSystem fs = FileSystem.get(URI.create("hdfs://域名:9000/user"), conf);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询