问题还原:
编写程序统计出 HDFS 文件系统中的平均副本数(副本总数/总数据块数)
比如:总共两个文件,一个文件 3个数据块,每个数据块 3 个副本,第二个文件 2 个数据块,
每个文件 2 个副本,最终的平均副本数 = (3*3 + 2*2)/(3+2)= 2.8
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
import org.junit.Test;
/**
* 编写程序统计出 HDFS 文件系统中的平均副本数(副本总数/总数据块数)
* 比如:总共两个文件,一个文件 3 个数据块,每个数据块 3 个副本,第二个文件 2 个数据块,
* 每个文件 2 个副本,最终的平均副本数 = (3*3 + 2*2)/(3+2)= 2.8
* @author Administrator
*
*/
public class Question3 {
@Test
public void Test() throws Exception{
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://hadoop01:9000");
System.setProperty("HADOOP_USER_NAME", "hadoop");
FileSystem fs = FileSystem.get(conf);
Path path = new Path("/");
//获取指定目录下的所有文件
RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(path, false);
//数据块总数
int blockNum = 0;
//副本总数
int replicationNum = 0;
while(listFiles.hasNext()){
LocatedFileStatus next = listFiles.next();
//累加计算所有的的block块数目
blockNum += next.getBlockLocations().length;
//计算所有的副本数 next.getReplication() 这个是所有的副本数
replicationNum += (next.getReplication() * next.getBlockLocations().length);
}
//计算平均的副本个数
float avgReplicationNum = replicationNum * 1F / blockNum;
System.out.println(avgReplicationNum);
}
}