列出文件 fs.listStatus
String uri = args[0];
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(URI.create(uri), conf);
Path[] paths = new Path[args.length];
for(int i=0;i<paths.length;i++){
paths[i] = new Path(args[i]);
}
FileStatus[] status = fs.listStatus(paths);
Path[] listedPaths = FileUtil.stat2Paths(status);
for(Path p: listedPaths)
{
System.out.println(p);
}
//使用例子
hadoop jar hadoopdemo-1.0-SNAPSHOT.jar ListStatus hdfs://localhost/ hdfs://localhost/user/qiao/
文件模式
- 通配符 同正则 ? 匹配单一字符
- public FileStatus[] globStatus(Path pathPattern) throws IOException //通配方法
- PathFilter对象
删除数据
- public abstract boolean delete(Path f, boolean recursive) throws IOException;
- f是一个文件或空目录, 那么recursive的值就会被忽略
- 只有recursive 为True 时,非空目录及其内容才会被删除
数据流
- DistributedFileSystem
- 将两个节点间的带宽作为距离的衡量标准
- 文件读取
![数据读取 客户端读取HDFS中的数据](https://i-blog.csdnimg.cn/blog_migrate/dd798fa119b249acefd9815d441614d4.jpeg)
![数据写入 客户端将数据写入HDFS](https://i-blog.csdnimg.cn/blog_migrate/ef24d514302ee855ddfa0f89f8b1977f.jpeg)
- 管线
- 一致模型
- 新建一个文件之后,它能在文件系统的命名空间中立即可见
- 写入文件的内容并不能立即可见,即使数据流已经刷新并存储,所以文件长度显示0
- hflush() 强制将所有缓存刷新到datanode中,但不保证datanode 已经将数据写到磁盘上,仅确保数据在datanode的内存中(断电容易丢失) ,使用 hsync()替代
- 衡量hflush() hsync() 该使用哪个 hsync开销比较大
通过distcp并行复制
hadoop distcp fil1 fil2 # 将file1 复制到file2
hadoop distcp dir1 dir2
hadoop distcp -update dir1 dir2
# 在两个集群间传送数据
hadoop distcp -update -delete -p hdfs://namenode1/too hdfs://namenode2/foo
- 保持HDFS集群的均衡
- 文件块在集群中均匀分布时,HDFS能达到最佳工作状态
- 最好使用默认的每个节点20个map来运行distcp 命令