1. 程式人生 > >mapreduce面試題一

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();
		
		}
	}