gpt4 book ai didi

java - WordCount MapReduce 给出了意外的结果

转载 作者:行者123 更新时间:2023-12-01 14:39:21 26 4
gpt4 key购买 nike

我正在尝试这个java代码来计算mapreduce中的字数,在完成reduce方法后,我想显示出现最多次数的唯一单词。

为此,我创建了一些名为 myoutput、mykey 和completeSum 的类级别变量。

我正在 close 方法中写入这些数据,但最后我得到了意想不到的结果。

public class WordCount {

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 {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);

while (tokenizer.hasMoreTokens()) {
word.set(tokenizer.nextToken());
output.collect(word, one);
}

}
}

static int completeSum = -1;
static OutputCollector<Text, IntWritable> myoutput;
static Text mykey = new Text();

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

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 (completeSum < sum) {
completeSum = sum;
myoutput = output;
mykey = key;
}


}

@Override
public void close() throws IOException {
// TODO Auto-generated method stub
super.close();
myoutput.collect(mykey, new IntWritable(completeSum));
}
}

public static void main(String[] args) throws Exception {

JobConf conf = new JobConf(WordCount.class);
conf.setJobName("wordcount");

conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.class);

conf.setMapperClass(Map.class);
// conf.setCombinerClass(Reduce.class);
conf.setReducerClass(Reduce.class);

conf.setInputFormat(TextInputFormat.class);
conf.setOutputFormat(TextOutputFormat.class);

FileInputFormat.setInputPaths(conf, new Path(args[0]));
FileOutputFormat.setOutputPath(conf, new Path(args[1]));

JobClient.runJob(conf);

}
}
<小时/>

输入文件数据

one 
three three three
four four four four
six six six six six six six six six six six six six six six six six six
five five five five five
seven seven seven seven seven seven seven seven seven seven seven seven seven
<小时/>

结果应为

six 18
<小时/>

但是我得到了这个结果

three 18
<小时/>

从结果中我可以看到总和是正确的,但 key 不正确。

如果有人可以对这些映射和归约方法提供很好的引用,那将非常有帮助。

最佳答案

您观察到的问题是由于引用别名造成的。 key 引用的对象与新内容一起重复用于多次调用,从而更改引用同一对象的 mykey。它最终得到最后一个简化的 key 。这可以通过复制对象来避免,如下所示:

mykey = new Text(key);

但是,您应该仅从输出文件中获取结果,因为分布式集群中的不同节点无法共享静态变量。它只能在独立模式下工作,违背了 map-reduce 的目的。

最后,如果使用并行本地任务,即使在独立模式下,使用全局变量也很可能会导致竞争(请参阅 MAPREDUCE-1367MAPREDUCE-434 )。

关于java - WordCount MapReduce 给出了意外的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16145450/

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