用 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
展开
 我来答
龙佐天下
推荐于2017-05-17 · TA获得超过1567个赞
知道小有建树答主
回答量:1379
采纳率:60%
帮助的人:1255万
展开全部
原因:
你访问的是本地文件系统而非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时会自动加载该文件
xmlknows
2013-05-30 · TA获得超过1106个赞
知道小有建树答主
回答量:596
采纳率:100%
帮助的人:390万
展开全部
你把 path=new Path("/home/");里面的目录用hdfs中文件地址替换一下试试
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
janee81930
2013-05-31
知道答主
回答量:2
采纳率:0%
帮助的人:2962
展开全部
使用FileSystem fs = FileSystem.get(URI.create("hdfs://域名:9000/user"), conf);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式