mapreduce面试题一

1.编写程序统计出HDFS文件系统中文件大小小于HDFS集群中的默认块大小的文件占比

比如:大于等于128M的文件个数为98,小于128M的文件总数为2,所以答案是2%

 

 

package com.test.a;


	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 文件系统中文件大小小于 HDFS 集群中的默认块大小的文件占比
	 * 比如:大于等于 128M 的文件个数为 98,小于 128M 的文件总数为 2,所以答案是 2%
	 * @author Administrator
	 *
	 */
	public class T5 {
	
		private static int DEFAULT_BLOCKSIZE = 128 * 1024 * 1024;
		
		/**
		 * 使用Junit进行测试
		 * @throws Exception
		 */
		@Test
		public void Test() throws Exception{
			Configuration conf = new Configuration();
			conf.set("fs.defaultFS", "hdfs://hdp1:9000");
			System.setProperty("HADOOP_USER_NAME", "hadoop");
			
			FileSystem fs = FileSystem.get(conf);
			
			Path path = new Path("/");
			
			int smallFile = 0;
			int totalFile = 0;
			//fs.listStatus(path); 
			//获取的是指定路径下的所有资源,包括文件夹和文件,但是不包括子文件夹下的文件
			//获取指定目录下的所有的文件
			RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(path, false);
			
			while(listFiles.hasNext()){
				//指定目录下文件计数器
				totalFile++;
				
				LocatedFileStatus next = listFiles.next();
				//获取每个文件的大小
				long len = next.getLen();
				//如果小于默认block块的大小,则视为小文件
				if(len < DEFAULT_BLOCKSIZE){
					//指定目录下小文件计数器
					smallFile++;
				}
			}
			
			//计算小文件的占比,并输出
			String result = (smallFile * 1f /totalFile * 100)+"%";
			
			System.out.println(result);
	 
			
			fs.close();
		
		}
	}


猜你喜欢

转载自blog.csdn.net/wjr_wl/article/details/83152700