我正在从事地图缩减工作,我想知道是否可以向我的输出文件发出自定义字符串。没有计数,没有其他数量,只有一团文本。
这是我正在思考的基本想法
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 个文件中获取结果?我应该使用身份缩减器吗?
1.实现输出.收集(字)你可以利用类 NullWritable http://hadoop.apache.org/docs/current/api/org/apache/hadoop/io/NullWritable.html。为此,您必须使用输出.collect(word, NullWritable.get())在你的映射器中。请注意,NullWritable 是单例的。
2.如果您不想拥有多个文件,可以将减速器的数量设置为 1。但这会产生额外的开销,因为这将涉及网络上的大量数据混洗。原因是,Reducer 必须从运行 Mappers 的不同机器上获取输入。此外,所有负载都将转移到一台机器上。但如果您只想要一个输出文件,您绝对可以使用一个 mReducer。conf.setNumReduceTasks(1)应该足以实现这一目标。
一些小建议:
- 我不建议你使用getmerge因为它将生成的文件复制到local FS。因此,您必须将其复制回 HDFS 才能进一步使用它。
- 如果可能的话,请使用新的 API。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)