2016-05-15 76 views
2

我有KMeans代碼,我的任務是計算加速,我通過在uni集羣中的不同節點數上運行它來完成它。但是是否可以更改映射器和/或縮減器的數量,以便在單節點上運行時檢查加速中的變化。是否有可能在一個節點上運行多個映射器

雖然使用谷歌搜索,我發現通過使用conf.setNumReduceTasks(2);我可以改變減速器的數量。但我沒有看到我的輸出有任何改變。 (我的輸出是以毫秒爲單位的時間)。

我使用的代碼是來自github:https://github.com/himank/K-Means/blob/master/src/KMeans.java 雖然我根據我的要求做了一些更改,但主要功能是相同的。

這裏是如何的功能主要是這樣的:

public static void main(String[] args) throws Exception { 
    long startTime = System.currentTimeMillis(); 
    IN = args[0]; 
    OUT = args[1]; 
    String input = IN; 
    String output = OUT + System.nanoTime(); 
    String again_input = output; 
    int iteration = 0; 
    boolean isdone = false; 
    while (isdone == false) { 
     JobConf conf = new JobConf(KMeans.class); 
     if (iteration == 0) { 
      Path hdfsPath = new Path(input + CENTROID_FILE_NAME); 
      DistributedCache.addCacheFile(hdfsPath.toUri(), conf); 
     } else { 
      Path hdfsPath = new Path(again_input + OUTPUT_FILE_NAME); 
      DistributedCache.addCacheFile(hdfsPath.toUri(), conf); 
     } 
     conf.setJobName(JOB_NAME); 
     //conf.setNumReduceTasks(2); 
     conf.setMapOutputKeyClass(DoubleWritable.class); 
     conf.setMapOutputValueClass(DoubleWritable.class); 
     conf.setOutputKeyClass(DoubleWritable.class); 
     conf.setOutputValueClass(Text.class); 
     conf.setMapperClass(Map.class); 
     conf.setNumMapTasks(4); 
     conf.setReducerClass(Reduce.class); 
     conf.setInputFormat(TextInputFormat.class); 
     conf.setOutputFormat(TextOutputFormat.class); 
     FileInputFormat.setInputPaths(conf, new Path(input + DATA_FILE_NAME)); 
     FileOutputFormat.setOutputPath(conf, new Path(output)); 
     JobClient.runJob(conf); 
     Path ofile = new Path(output + OUTPUT_FILE_NAME); 

     Configuration configuration = new Configuration(); 
     FileSystem fs = FileSystem.get(new URI("hdfs://127.0.0.1:9000"), configuration); 
     Path filePath = new Path(output + OUTPUT_FILE_NAME); 
     BufferedReader br = new BufferedReader(new InputStreamReader(fs.open(filePath))); 
     List<Double> centers_next = new ArrayList<Double>(); 
     String line = br.readLine(); 
     while (line != null) { 
      String[] sp = line.split("\t| "); 
      double c = Double.parseDouble(sp[0]); 
      centers_next.add(c); 
      line = br.readLine(); 
     } 
     br.close(); 
     String prev; 
     if (iteration == 0) { 
      prev = input + CENTROID_FILE_NAME; 
     } else { 
      prev = again_input + OUTPUT_FILE_NAME; 
     } 
     Path prevfile = new Path(prev); 
     FileSystem fs1 = FileSystem.get(new URI("hdfs://127.0.0.1:9000"), configuration); 
     BufferedReader br1 = new BufferedReader(new InputStreamReader(fs1.open(prevfile))); 
     List<Double> centers_prev = new ArrayList<Double>(); 
     String l = br1.readLine(); 
     while (l != null) { 
      String[] sp1 = l.split(SPLITTER); 
      double d = Double.parseDouble(sp1[0]); 
      centers_prev.add(d); 
      l = br1.readLine(); 
     } 
     br1.close(); 
     Collections.sort(centers_next); 
     Collections.sort(centers_prev); 
     Iterator<Double> it = centers_prev.iterator(); 
     for (double d : centers_next) { 
      double temp = it.next(); 
      if (Math.abs(temp - d) <= 0.1) { 
       isdone = true; 
      } else { 
       isdone = false; 
       break; 
      } 
     } 
     ++iteration; 
     again_input = output; 
     output = OUT + System.nanoTime(); 
    } 
    long endTime = System.currentTimeMillis(); 
    long totalTime = endTime - startTime; 
    System.out.println(totalTime); 
} 

PS。我是Hadoop和MapReduce的新手。

+0

從HDFS上讀取文件之前,您可能應該等待作業完成 –

+0

@Ahsan:您是否在尋找性能調整的一部分,這就是爲什麼您想嘗試設置映射器和縮減器的數量 –

+0

@ ramprasad-g是的,因爲我說我正在計算加速。我通過增加節點數來加速。現在我想通過增加mappers和reducer的數量來在單個節點上計算它。 –

回答

2

給定作業的地圖數量通常由輸入文件中輸入分割的數量驅動,而不是由setNumMapTasks()或mapred.map.tasks參數驅動。爲每個輸入分割生成一個Map任務。 mapred.map.tasks參數只是InputFormat對地圖數量的提示。可以使用setNumMapTasks()手動增加地圖任務的數量,它可以用來增加地圖任務的數量,但不會將數字設置爲低於Hadoop通過分割輸入數據所確定的數量。

http://wiki.apache.org/hadoop/HowManyMapsAndReduces

1

是的。

您可以使用setNumMapTasksconf.set('mapred.map.tasks','numberofmappersyouwanttoset')(但它對配置的建議)更改映射器的數量,但不能保證映射器實例將被設置。此外,它取決於inputsplits。

您也可以更改減速器的數量。使用你寫的代碼。

結論:地圖

設置數 - 建議(基於inputsplits 即輸入文件的塊的總數實際上

減速器的設置數 - 需求

除了numbe從上面的映射器和減速器的回答從@radkris,請。看看this

1

Apache Map Reduce Tutorial提供了更多信息。

有多少地圖?

地圖的數量通常由輸入的總大小,即輸入文件的塊總數驅動。

並行的地圖正確的水平似乎是10-100左右每地圖節點,雖然它已被設置爲300個地圖非常CPU輕map任務。任務設置需要一段時間,所以最好是地圖至少需要一分鐘才能執行。因此,如果您希望10TB的輸入數據並且具有128MB的塊大小,那麼最終將得到82,000個映射,除非Configuration.set(MRJobConfig.NUM_MAPS, int)(僅向框架提供暗示)用於將其設置得更高。

+0

'地圖的正確水平並行度似乎大約爲10-100個地圖每個節點'這非常依賴於您的硬件設置。你最近在做什麼?網絡帶寬,磁盤帶寬? –

相關問題