为什么MultipleOutputs不能用于Map Reduce程序?

时间:2013-10-04 09:58:49

标签: hadoop mapreduce

我有一个Mapper类,它提供了一个文本键和IntWritable值,可以是1两个或三个。根据值,我必须用不同的密钥写三个不同的文件。我收到单个文件输出,其中没有记录。 此外,有没有任何好的多输出示例(有说明)你可以指导我?

我的驱动程序类是否有此代码:

    MultipleOutputs.addNamedOutput(job, "name", TextOutputFormat.class, Text.class,     IntWritable.class);
    MultipleOutputs.addNamedOutput(job, "attributes", TextOutputFormat.class, Text.class, IntWritable.class);
    MultipleOutputs.addNamedOutput(job, "others", TextOutputFormat.class, Text.class, IntWritable.class);

我的减速机类是:

public static class Reduce extends Reducer<Text, IntWritable, Text, NullWritable> {

    private MultipleOutputs mos;
    public void setup(Context context) {
        mos = new MultipleOutputs(context);
    }
    public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        int sum = 0;
        String CheckKey = values.toString();
        if("1".equals(CheckKey)) {
            mos.write("name", key, new IntWritable(1));
        }
        else if("2".equals(CheckKey)) {
            mos.write("attributes", key, new IntWritable(2));
        }
        else if("3".equals(CheckKey)) {
            mos.write("others", key,new IntWritable(3));
        }

        /* for (IntWritable val : values) {
            sum += val.get();
        }*/
        //context.write(key, null);
    }
    @Override
    public void cleanup(Context context) throws IOException, InterruptedException {
        mos.close();
    }
}

P.S我是HADOOP / MAP-Reduce Programming的新手。

2 个答案:

答案 0 :(得分:2)

ArrayList<Integer> l = new ArrayList<Integer>();
l.add(1);
System.out.println(l.toString());

结果&#34; [1]&#34;不是1所以

values.toString()

不会给出&#34; 1&#34;

除此之外,我只是尝试打印一个Iterable,它只是给了一个参考,所以这绝对是你的问题。如果要迭代值,请执行以下示例:

Iterator<Text> valueIterator = values.iterator();
while (valueIterator.hasNext()){

}

请注意,您只能迭代一次!

答案 1 :(得分:0)

您的问题陈述混乱。你是什​​么意思,“取决于价值观”? reducer获取Iterable值,而不是单个值。有些东西告诉我你需要在你已经注释掉的循环中移动你的reducer中的多个输出代码来获取总和。

或者你可能根本不需要减速器,可以在地图阶段处理这个问题。如果您通过使用单个reduce任务使用reduce阶段最终得到4个文件,那么您也可以通过在地图阶段翻转键和值并完全忘记MultipleOutputs来实现您想要的效果,因为您将结束只有3个有效的reduce任务,每个int值一个。要获得第4个,您可以使用特殊键在每个地图调用中输出两个记录副本,以指示输出是针对普通文件的,而不是三个特殊文件中的一个。通常情况下,我不推荐这样的行动方案,因为当密钥数量很小时,您可以在缩减阶段实现并行度的严格限制。

如果您遇到的值不是您期望的值之一,那么您还应该在“if”梯形图的末尾添加一些异常数据处理代码,以增加计数器或某些内容。