2016-05-17 76 views
0

我的問題是關於如何在mapreduce程序中對mapper的輸出進行排序(ps:沒有reducer(0)),我只用map來過濾兩個輸入,我希望結果(輸出映射器)將按照每個映射器的鍵進行排序。如何在不使用額外工作的情況下在同一份工作中完成這種排序?請您提出建議如何在mapreduce中對地圖側程序的輸出進行排序?

+0

默認情況下,Hadoop框架的關鍵排序的映射器輸出。所以在你的映射器類中將字段映射爲你想要排序的關鍵字。 –

+0

感謝您的回答,但在我的情況下,我只想使用沒有減速器的地圖作業,因爲我有兩個輸入要處理,每個都有一個映射器,我希望每個結果都按鍵排序 – Fatiso

+0

是這就是我的建議。你的工作應該有一個映射器類。當您運行作業時,只需提供輸入目錄名稱,您可以在其中包含要映射的兩個文件。如果該目錄中有100個文件,則作業將處理全部100個文件。 MR作業輸入不必是單個文件。一個作業可以在提供的輸入路徑內處理多個文件。 'hadoop jar your.jar youMRclassName/input/dir/output/dir' –

回答

0

您可以通過將所有預期結果收集到映射器中的本地/內存數據結構中來實現部分(每個映射器)排序。然後,您會對它進行排序,最後針對現在排序的集合中的所有元素運行collector.write

因此,這裏與香草行爲的區別在於,在後一種情況下,每個元素僅僅發射,因爲它們遇到了 - 導致產生隨機/非有序輸出。

請注意,結果將不會有total ordering:這將需要一個Reducer步驟。

+0

感謝您的回答,但我仍然不明白我該如何做到這一點:將結果收集到本地數據結構並對其進行排序比我運行context.write?因爲我知道如果我們有一個reducer框架自動執行此操作,但在我的情況下,我想直接對(兩個mappers)的結果進行排序,因爲我只有兩個映射器每個爲ninput(MutilpleInputs) – Fatiso

0

一個目錄中有三個文件 - 在一個作業中按一個映射器排序。運行方式 hadoop jar sort.jar sort file:///path/sortFiles/ sortedFiles

import java.io.IOException; 
import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Job; 
import org.apache.hadoop.mapreduce.Mapper; 
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 


public class sort{ 
    public static class sortMapper extends Mapper<Object, Text, Text, Text> { 
     public void map(Object key, Text value, Context context) throws IOException, InterruptedException { 

      //add filter logic here 
      context.write(new Text(value), new Text("")); 
     } 
    } 

    public static void main(String[] args) throws Exception { 

      if(args.length != 2) 
      { 
       System.out.println("missing agrs: usage <prog> <arg1> <arg2>"); 
       System.exit(1); 
      } 
     Configuration conf = new Configuration(); 
     Job job = Job.getInstance(conf, "sort mutilple files"); 
     job.setJarByClass(sort.class); 
     job.setMapperClass(sortMapper.class); 
     job.setOutputKeyClass(Text.class); 
     job.setOutputValueClass(Text.class); 

     FileInputFormat.addInputPath(job, new Path(args[0])); 
     FileOutputFormat.setOutputPath(job, new Path(args[1])); 

     job.waitForCompletion(true); 
     } 
} 

enter image description here

+0

謝謝你的回答,但我的程序是關於過濾兩個輸入(例如:事務和客戶),過濾(由相交布隆過濾器)是每個映射器的作用,並且我得到結果過濾輸出(T',C'),但是這個輸出沒有排序,我魔杖,在過濾功能的結尾,我得到的結果過濾 – Fatiso

+0

默認情況下,一個映射器的輸出沒有排序,如果我們沒有還原劑 – Fatiso

相關問題