我的問題是關於如何在mapreduce程序中對mapper的輸出進行排序(ps:沒有reducer(0)),我只用map來過濾兩個輸入,我希望結果(輸出映射器)將按照每個映射器的鍵進行排序。如何在不使用額外工作的情況下在同一份工作中完成這種排序?請您提出建議如何在mapreduce中對地圖側程序的輸出進行排序?
0
A
回答
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);
}
}
相關問題
- 1. 如何在Django中對我的模型輸出進行排序?
- 2. 在mapreduce中對map函數中的鍵值對進行排序
- 3. 如何對R中的SessionInfo()的輸出進行排序?
- 4. 如何按升序對多維數組輸出進行排序?
- 5. 如何在地圖中對數據進行排序減少hadoop?
- 6. 用PHP對層次排序的MySQL輸出進行排序
- 7. 重複mapreduce程序輸出?
- 8. 按地圖對地圖內的地圖進行排序
- 9. 有沒有可以對Lua程序輸出值進行排序的程序?
- 10. tabstat:如何對某個變量的輸出進行排序/排序?
- 11. 如何對生成的SQL腳本的輸出進行排序?
- 12. 如何根據C++中的其他地圖對地圖進行排序?
- 13. 當對一個排序列表進行排序時,輸出集合不排序
- 14. 如何對文件進行排序:聚合輸出
- 15. 如何使用JSON.NET對JSON輸出進行排序?
- 16. 如何對du -h輸出進行排序?
- 17. 對Get-Migrations的輸出進行排序升序?
- 18. Riak對MapReduce的排序
- 19. 如何按照時間對圖像排序進行排序
- 20. 在輸出文件中對文件名進行排序
- 21. 如何在java列表中對列表中的地圖進行排序
- 22. 如何在Python中對IP地址和整數進行排序?
- 23. 如何在Python中就地對整數數組進行排序?
- 24. 如何在jQuery中動態地對列表項進行排序?
- 25. 嘗試進行排序,但輸出不會出現在輸出
- 26. 如何動態地對Objective-C中的NSMutableArray進行排序?
- 27. 如何對java中的MAC地址列表進行排序?
- 28. 如何有效地對類對象的鍵(ksort)進行排序?
- 29. Python - 如何不按字母順序對pydoc輸出進行排序
- 30. 我們真的需要在MapReduce框架中進行排序嗎?
默認情況下,Hadoop框架的關鍵排序的映射器輸出。所以在你的映射器類中將字段映射爲你想要排序的關鍵字。 –
感謝您的回答,但在我的情況下,我只想使用沒有減速器的地圖作業,因爲我有兩個輸入要處理,每個都有一個映射器,我希望每個結果都按鍵排序 – Fatiso
是這就是我的建議。你的工作應該有一個映射器類。當您運行作業時,只需提供輸入目錄名稱,您可以在其中包含要映射的兩個文件。如果該目錄中有100個文件,則作業將處理全部100個文件。 MR作業輸入不必是單個文件。一個作業可以在提供的輸入路徑內處理多個文件。 'hadoop jar your.jar youMRclassName/input/dir/output/dir' –