我正在处理地图缩减作业,我想知道是否可以向我的输出文件发出自定义字符串。没有计数,没有其他数量,只是一团文字。
这是我想到的基本想法
public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
// this map doesn't do very much
String line = value.toString();
word.set(line);
// emit to map output
output.collect(word,one);
// but how to i do something like output.collect(word)
// because in my output file I want to control the text
// this is intended to be a map only job
}
}
这种事情有可能吗?这是为了创建一个仅用于转换数据的地图作业,使用hadoop进行并行化,但不一定是整个MR框架。当我运行这个作业时,我在hdfs中为每个映射器获得一个输出文件。
$ hadoop fs -ls /Users/dwilliams/output
2013-09-15 09:54:23.875 java[3902:1703] Unable to load realm info from SCDynamicStore
Found 12 items
-rw-r--r-- 1 dwilliams supergroup 0 2013-09-15 09:52 /Users/dwilliams/output/_SUCCESS
drwxr-xr-x - dwilliams supergroup 0 2013-09-15 09:52 /Users/dwilliams/output/_logs
-rw-r--r-- 1 dwilliams supergroup 7223469 2013-09-15 09:52 /Users/dwilliams/output/part-00000
-rw-r--r-- 1 dwilliams supergroup 7225393 2013-09-15 09:52 /Users/dwilliams/output/part-00001
-rw-r--r-- 1 dwilliams supergroup 7223560 2013-09-15 09:52 /Users/dwilliams/output/part-00002
-rw-r--r-- 1 dwilliams supergroup 7222830 2013-09-15 09:52 /Users/dwilliams/output/part-00003
-rw-r--r-- 1 dwilliams supergroup 7224602 2013-09-15 09:52 /Users/dwilliams/output/part-00004
-rw-r--r-- 1 dwilliams supergroup 7225045 2013-09-15 09:52 /Users/dwilliams/output/part-00005
-rw-r--r-- 1 dwilliams supergroup 7222759 2013-09-15 09:52 /Users/dwilliams/output/part-00006
-rw-r--r-- 1 dwilliams supergroup 7223617 2013-09-15 09:52 /Users/dwilliams/output/part-00007
-rw-r--r-- 1 dwilliams supergroup 7223181 2013-09-15 09:52 /Users/dwilliams/output/part-00008
-rw-r--r-- 1 dwilliams supergroup 7223078 2013-09-15 09:52 /Users/dwilliams/output/part-00009
如何在1个文件中获得结果?我应该使用身份缩减器吗?
答案 0 :(得分:4)
1。要实现 output.collect(word),您可以使用 Class NullWritable 。要做到这一点,你必须在Mapper中使用 output.collect(word,NullWritable.get())。请注意,NullWritable是Singleton。
2. 如果您不想拥有多个文件,可以将reducer的数量设置为1.但这会产生额外的开销,因为这将涉及网络上的大量数据混乱。原因是,Reducer必须从运行Mappers的不同机器获取其输入。此外,所有负载将只到一台机器。但是如果你只想要一个输出文件,你绝对可以使用一个mReducer。 conf.setNumReduceTasks(1)应足以实现这一目标。
一些小建议:
答案 1 :(得分:0)
如果它是仅限地图的作业,则输出文件的数量将等于映射器的数量。如果需要减速器,它将等于减速器的数量。但是您始终可以hadoop dfs -getmerge <hdfs output directory> <some file>
将输出目录中的所有输出合并到一个文件中。
您可以使用TextOutputFormat
输出纯文本文件,例如job.setOutputFormat(TextOutputFormat.class)
。然后更改上面的map
方法以使用OutputCollector<NullWritable, Text>
和output.collect(null, "some text")
。这将为所有记录写some text
。如果您想要以制表符分隔的键值,则可以将其更改为OutputCollector<Text, Text>
和output.collect("key", "some text")
。这将在输出中打印key<tab>some text
。