当前位置: 首页 > 知识库问答 >
问题:

MapReduce-减速器不组合键

贺桐
2023-03-14

我有一个简单的地图减少工作,我正在建立反向索引。

我的映射器工作正常(我检查过了),并输出了word和docID:TFIDF值的密钥对:

映射器(仅显示输出):

context.write(new IntWritable(wordIndex), new Text(index + ":" + tfidf));

化简器的唯一工作是组合这些值。这是我的实现:

html" target="_blank">public static class IndexerReducer extends Reducer<Text, IntWritable, IntWritable, Text>
    {
        public void reduce(IntWritable key, Iterable<Text> values, Context context) throws IOException, InterruptedException
        {

            StringBuilder sb = new StringBuilder();

            for (Text value : values)
            {
                sb.append(value.toString() + " ");
            }

            context.write(key, new Text(sb.toString()));
        }
    }

然而,它没有组合任何东西,输出看起来基本上与来自映射器的相同。输出中有一些行具有相同的键,尽管reducer应该将它们组合起来——基本上,使用reducer时,输出文件中的所有键都应该是唯一的,对吗?

这是我的减速器输出的一个例子(注意,这是一个简化的例子):

1 15:2.1
1 13:4.3
2 9:9.3
2 43:7.9
etc

我预料到了:

1 15:2.1 13:4.3
2 9:9.3 43:7.9

为了完整起见,我包括run方法:

@Override
    public int run(String[] arguments) throws Exception {
        ArgumentParser parser = new ArgumentParser("TextPreprocessor");

        parser.addArgument("input", true, true, "specify input directory");
        parser.addArgument("output", true, true, "specify output directory");

        parser.parseAndCheck(arguments);

        Path inputPath = new Path(parser.getString("input"));
        Path outputDir = new Path(parser.getString("output"));

        // Create configuration.
        Configuration conf = getConf();

        // add distributed file with vocabulary
        DistributedCache
                .addCacheFile(new URI("/user/myslima3/vocab.txt"), conf);

        // Create job.
        Job job = new Job(conf, "WordCount");
        job.setJarByClass(IndexerMapper.class);

        // Setup MapReduce.
        job.setMapperClass(IndexerMapper.class);
        job.setReducerClass(IndexerReducer.class);

        // Sort the output words in reversed order.
        job.setSortComparatorClass(WordCountComparator.class);


        job.setNumReduceTasks(1);

        // Specify (key, value).
        job.setMapOutputKeyClass(IntWritable.class);
        job.setMapOutputValueClass(Text.class);
        job.setOutputKeyClass(IntWritable.class);
        job.setOutputValueClass(Text.class);

        // Input.
        FileInputFormat.addInputPath(job, inputPath);
        job.setInputFormatClass(TextInputFormat.class);

        // Output.
        FileOutputFormat.setOutputPath(job, outputDir);
        job.setOutputFormatClass(TextOutputFormat.class);

        FileSystem hdfs = FileSystem.get(conf);

        // Delete output directory (if exists).
        if (hdfs.exists(outputDir))
            hdfs.delete(outputDir, true);

        // Execute the job.
        return job.waitForCompletion(true) ? 0 : 1;
    }

我会很高兴有任何关于正在发生的事情的提示。我是地图减少的新手。感谢您的任何调试提示!

共有2个答案

黄淇
2023-03-14

@context不是org . Apache . Hadoop . MapReduce . reducer . context类型。我们的Reducer有我们自己的内部类类型的上下文。所以不要用“org . Apache . Hadoop . MapReduce . reducer . Context”,只用“Context”这样可以确保@Override可以正确无误地添加到reduce函数中。

郑曜灿
2023-03-14

始终使用@Override注释。

你定义

public static class IndexerReducer extends Reducer<Text, IntWritable, IntWritable, Text>

那你的减少方法一定是这样的

@Override
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException
 类似资料:
  • 我写了映射和Reduce程序,其中reducer的输出键和值不同于它的输入或映射器的输出。我在司机班上做了适当的改变。下面是我在运行它时得到的异常: 信息MapReduce.job:任务Id:Attribut_1550670375771_4211_M_0000032,状态:失败错误:java.io.ioException:map中的值类型不匹配:expected org.apache.hadoop

  • 现在我正在编写一个 Java 程序,使用哈道普映射还原将输出写入 HBase。问题是关于合并器类的。因为现在我的 reduce 类扩展了 TableReducer,而不是化简器。那么我的合并器类呢,它应该也扩展表还原器,还是仍然扩展化简器?

  • 我正在用MapReduce框架用Java制作一个Hadoop应用程序。 对于输入和输出,我只使用文本键和值。在减少到最终输出之前,我使用一个合并器来做额外的计算。 但我有一个问题,钥匙不去同一个减速器。我在组合器中创建和添加了这样的键/值对: 基本上,我创建的工作如下: 减速机打印的标准输出如下: 这是没有意义的,因为键是相同的,因此它应该是2个还原器,其中3个值是相同的 希望你能帮我弄清这件事:

  • 按照我的理解,当一个动作被调用时,所有的减速器都响应。如果action存在于reducer的语句中,则执行action。如果没有,则执行,保留现有状态。 当操作存在于reducer中,但它试图更新的特定属性不存在时,它似乎表现良好,因为没有什么可更新的。 例如,我有一个action creator,用于设置Modals的属性。每个模式都有自己的。我的代码如下所示: 我在多个精简器中都有,但是如果没

  • 我使用next.js提供的with-redux示例(https://github.com/zeit/next.js/tree/canary/examples/with-redux)在next.js中设置了React-Redux。此外,我还设置了thunk,因为将来大多数redux调用都将是异步的(现在只是初始状态,将被更改)。 当我现在尝试使用thunk调度函数时,还原器从未被触发。 现在我已经到

  • 问题内容: 我想使用嵌套化简器,而不是在作为第一个参数传递给的主化简器中使用嵌套的switch语句(甚至可以这样做?)。这是因为我的减速器功能取决于多个(第一个操作,然后是水果类型)。 我查找了“嵌套的简化器”,但是这些问题的解决方案似乎都与redux和挂钩,而Hooks却没有。 演示代码(即使codesandbox再次关闭): 它实际上并没有显示在codesandbox中(因为沙箱本身无法正常工