gpt4 book ai didi

java - Map Reduce - 在 Reducer 中使用局部变量

转载 作者:可可西里 更新时间:2023-11-01 16:37:35 24 4
gpt4 key购买 nike

我已经实现了一个简单的 Map reduce 应用程序来检测最长的单词。作业执行成功。
但是现在我想知道在 reducer 中使用局部变量来保持 Max 长度是否正确?由于分布式环境中可能有多个 reducer,并且它们不共享该变量的值。

这是一个正确的假设吗?

在分布式环境中,当有独立的reducer时,输出会受到怎样的影响?
我正在使用自定义比较器,因此单词首先按长度排序,而不是按值排序。每个 MR 阶段的输出如下所示:

Mapper Output:
ByeByeBye 9
HelloHelloHe222 15
HelloHelloHe222 15
HelloHelloHe333 15
HelloHelloHe333 15
HelloHelloHellw99999 20

Combiner Output:
ByeByeBye 9
HelloHelloHe222 15
HelloHelloHe333 15
HelloHelloHellw99999 20

ComparatorOutput:
HelloHelloHellw99999 20
HelloHelloHe222 15
HelloHelloHe333 15
ByeByeBye 9

Reducer Output:
HelloHelloHellw99999 20

Reducer 类:

public class WordsReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
private int maxLength = Integer.MIN_VALUE;
private IntWritable length = new IntWritable();

@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
length = values.iterator().next();
if (length.get() >= maxLength){
maxLength = length.get();
context.write(key, length);
}
}
}

最佳答案

首先,我认为不需要比较器,因为找到最大最大值不需要排序的数据集。

寻找任何数据集的最大值是一个仅限 map 的操作。找到多个 map 任务的总体最大值需要减少这些单独的任务,而这只能由一个 reducer 完成,因为它拥有所有可用于比较的数据。

您的 reducer 代码仅输出最大每个 reducer 。而你的关键是文本,但是有多个文本,所以它不可能看到整体最大值。你得到一个输出的原因是因为组合器已经将唯一的字符串收集到一个项目中,并且这些项目是按降序排列的。

您需要只在映射器上输出字符串最大长度的逻辑,可能使用 TreeMap 来存储中间长度,同时迭代标记,而不是写入迭代的当前最大值。使用一个字段很好,但它不会在所有任务中共享。您将为此使用 Counter 对象,这些对象存储在 Context 对象中。

如果您想要在当前代码中不使用 Combiner 的情况下获得总最大值,您将运行它两次,给定第一次运行输出的输入。想象一下这种情况,Reducer 1 以最大长度 15 结束,Reducer 2 以最大长度 20 结束。因此,您编写了两个输出,而不仅仅是整体最大值。

如前所述,每个映射任务都需要写入其各自的最大字符串。然后,您实际上可以使用 NullWritable 作为键,输出 null, "length,word"。在 Reducer 中,然后获取所有值,提取长度,找到最大的一个,然后打印出来

关于java - Map Reduce - 在 Reducer 中使用局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48853356/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com