hadoop-如何收集没有值的文本输出

snz8szmq  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(346)

我正在做一个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个文件中获得结果?我应该使用身份缩减器吗?

42fyovps

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。

a11xaf1n

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 在输出中。

相关问题