我正在做一个map reduce作业,我想知道是否有可能向我的输出文件发出一个自定义字符串。没有计数,没有其他数量,只是一个文本块。
以下是我思考的基本想法
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
}
}
这种事可能吗?这是创建一个仅Map的作业来转换数据,使用hadoop实现其并行性,但不一定是整个mr框架。当我运行这个作业时,我得到每个Map器的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个文件中获得结果?我应该使用身份缩减器吗?
2条答案
按热度按时间42fyovps1#
1要实现output.collect(word),可以使用nullwriteable类。为此,必须在Map器中使用output.collect(word,nullwriteable.get())。注意nullwriteable是singleton。
2如果您不想有多个文件,可以将减速器的数量设置为1。但这会带来额外的开销,因为这将涉及网络上的大量数据洗牌。原因是,减速器必须从运行Map器的n台不同的机器上获取输入。而且,所有的负载将只流向一台机器。但是,如果您只需要一个输出文件,则可以使用一个mreducer。conf.setnumreducetasks(1)应该足以实现这一点。
一些小建议:
我不建议您使用getmerge,因为它将结果文件复制到本地fs上。因此,您必须将其复制回hdfs以进一步使用它。
如果可能,请使用新的api。
a11xaf1n2#
如果是仅Map作业,则输出文件的数量将等于Map器的数量。如果需要异径管,它将等于异径管的数量。但你总能做到
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
在输出中。