当前位置: 首页 > 面试题库 >

hadoop中的MultipleOutputFormat

陶健
2023-03-14
问题内容

我是Hadoop的新手。我正在尝试Wordcount程序。

现在尝试使用多个输出文件MultipleOutputFormat。这个链接帮助我做到了。http://hadoop.apache.org/common/docs/r0.19.0/api/org/apache/hadoop/mapred/lib/MultipleOutputs.html

在我的司机课上

    MultipleOutputs.addNamedOutput(conf, "even",
            org.apache.hadoop.mapred.TextOutputFormat.class, Text.class,
            IntWritable.class);

    MultipleOutputs.addNamedOutput(conf, "odd",
            org.apache.hadoop.mapred.TextOutputFormat.class, Text.class,
            IntWritable.class);`

而我的降低班级变成了

public static class Reduce extends MapReduceBase implements
        Reducer<Text, IntWritable, Text, IntWritable> {
    MultipleOutputs mos = null;

    public void configure(JobConf job) {
        mos = new MultipleOutputs(job);
    }

    public void reduce(Text key, Iterator<IntWritable> values,
            OutputCollector<Text, IntWritable> output, Reporter reporter)
            throws IOException {
        int sum = 0;
        while (values.hasNext()) {
            sum += values.next().get();
        }
        if (sum % 2 == 0) {
            mos.getCollector("even", reporter).collect(key, new IntWritable(sum));
        }else {
            mos.getCollector("odd", reporter).collect(key, new IntWritable(sum));
        }
        //output.collect(key, new IntWritable(sum));
    }
    @Override
    public void close() throws IOException {
        // TODO Auto-generated method stub
    mos.close();
    }
}

一切正常,但是我得到了很多文件(对于每个map-reduce,一个奇数,一个偶数)

问题是:我怎样才能只有2个输出文件(奇数和偶数),以便每个map-reduce的每个奇数输出都被写入该奇数文件,并且偶数相同。


问题答案:

每个化简器使用OutputFormat写入记录。这就是为什么每个reducer会获得一组奇数和偶数文件的原因。这是设计使然,每个减速器都可以并行执行写入。

如果只需要单个奇数和单个偶数文件,则需要将mapred.reduce.tasks设置为1。但是性能会受到影响,因为所有映射器都将馈入单个reducer。

另一个选择是更改读取这些文件的过程以接受多个输入文件,或者编写将这些文件合并在一起的单独过程。



 类似资料:
  • 我正在使用Hadoop mapreduce编写代码来获取不同长度的子字符串。示例给出了字符串“ZYXCBA”和长度3。我的代码必须返回所有可能的字符串,长度为3(“ZYX”、“YXC”、“XCB”、“CBA”),长度为4(“ZYXC”、“YXCB”、“XCBA”),最后返回长度为5(“ZYXCB”、“YXCBA”)。 在map阶段,我做了以下工作: key=我想要的子字符串的长度 value=“Z

  • 我用OpenCV编写了一个简单的应用程序。我把所有的jar文件放在/usr/local/hadoop/lib文件夹中。在运行hadoop作业时,我收到以下错误:

  • 我决定创建自己的WritableComparable类来学习Hadoop如何使用它。因此,我创建了一个带有两个实例变量(orderNumber cliente)的Order类,并实现了所需的方法。我还为getters/setters/hashcode/equals/toString使用了Eclipse生成器。 相比较而言,我决定只使用orderNumber变量。 我创建了一个简单的MapReduc

  • 问题内容: 我正在尝试使用Hadoop实现一个示例单词计数程序。我已经下载并安装了Hadoop 2.0.0。我想使用Eclipse来执行此示例程序,因为我认为稍后在我的真实项目中,我仅需使用Eclipse。 我找不到类似Hadoop的jar文件hadoop-core.jar以及其他必需的jar文件。我搜索了2.0 hadoop的所有文件夹,但找不到这些文件。这些相同的文件在Hadoop的1.0版本

  • 本文向大家介绍 hadoop中Combiner的作用?相关面试题,主要包含被问及 hadoop中Combiner的作用?时的应答技巧和注意事项,需要的朋友参考一下 解答: combiner是reduce的实现,在map端运行计算任务,减少map端的输出数据。 作用就是优化。 但是combiner的使用场景是mapreduce的map和reduce输入输出一样。  

  • 我正在运行hadoop fs-getmerge,出现以下错误: 每次尝试使用不同的IP时都会出现此错误,在数据节点日志中我没有看到任何可疑错误或警告。 有什么想法吗?