有些时候,我们会统计表的在HDFS上占用的空间大小,文件个数等.其实有很多种方式来统计,比如通过hdaoop fs -count /文件路径 这种方式来统计,但是这样只能单个统计,而且还需要有操作hadoop的相关权限.
不过,还有一种方式,就是通过命令desc formatted也可以查看表大小,文件个数.
这里来看一种通过hadoop的fs提供的API来批量统计这些数据,实现的方式如下:
public class HdfsPathMonitor {
public static void main(String[] args) throws Exception {
System.out.println("the args is " + String.join(",", args));
String dirPath = args[0];
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://ns1");
FileSystem fileSystem = FileSystem.get(conf);
Path path = new Path(dirPath);
// 获取文件列表
FileStatus[] files = fileSystem.listStatus(path);
if (files == null || files.length == 0) {
throw new FileNotFoundException("Cannot access " + dirPath + ": No such file or directory.");
}
System.out.println("xxxxxxxxxx"+files.length);
System.out.println("dirpath \t total file size \t total file count");
for (int i = 0; i < files.length; i++) {
System.out.println("files"+files);
String pathStr = files[i].getPath().toString();
FileSystem fs = files[i].getPath().getFileSystem(conf);
long totalSize = fs.getContentSummary(files[i].getPath()).getLength();
long totalFileCount = listAll(conf, files[i].getPath());
fs.close();
System.out.println(("".equals(pathStr) ? "." : pathStr) + "\t" + totalSize + "\t" + totalFileCount);
}
}
/**
* @Title: listAll @Description: 列出目录下所有文件 @return void 返回类型 @throws
*/
public static Long listAll(Configuration conf, Path path) throws IOException {
long totalFileCount = 0;
FileSystem fs = FileSystem.get(conf);
if (fs.exists(path)) {
FileStatus[] stats = fs.listStatus(path);
//System.out.println("-----------------------"+stats.length);
for (int i = 0; i < stats.length; ++i) {
//System.out.println("stats----------"+stats[i]);
if (!stats[i].isDir()) {
// regular file
// System.out.println(stats[i].getPath().toString());
totalFileCount++;
} else {
// dir
// System.out.println(stats[i].getPath().toString());
totalFileCount += listAll(conf, stats[i].getPath());
}
}
}
fs.close();
return totalFileCount;
}
}
把上述的应用打成对应的jar包后上传到集群里面:
通过执行
yarn jar /app/bigdata/hive/app.hdfs-1.0-SNAPSHOT.jar HdfsPathMonitor /user/hive/warehouse/test.db
可以看到指定路径下所有文件的大小和文件个数

文章转载自Nathan的笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




