为什么减速器在我的情况下不能正常工作?

为什么“set”只有一个元素,而例如前 5 行输入应该有 4 个元素,这些元素具有相同的 URL 和四个不同的 IP。我还使用了“for-each”而不是“迭代器”,但不起作用。有人能帮我吗?


映射器


public class WordCount {


    public static class TokenizerMapper extends Mapper<Object, Text, Text, Text> {


        private Text IP = new Text();

        private Text word = new Text();


        public void map(Object key, Text value, Context context) throws IOException, InterruptedException {

            String line = value.toString();

            String[] tokens = line.split(",");

            word.set(tokens[2]);

            IP.set(tokens[0]);

            context.write(word, IP);

        }

    }

减速器


    public static class IntSumReducer extends Reducer<Text, Text, Text, Text> {


        public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {

            Set<String> set = new HashSet<String>();

            Iterator<Text> iterator = values.iterator();

            while (iterator.hasNext()) {

                set.add(iterator.next().toString());

            }

            int a = set.size();

            String str = String.format("%d", a);

            context.write(key, new Text(str));

        }

    }

工作


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

        Job job = new Job();

        job.setJarByClass(WordCount.class);

        job.setMapperClass(TokenizerMapper.class);

        job.setCombinerClass(IntSumReducer.class);

        job.setReducerClass(IntSumReducer.class);

        job.setOutputKeyClass(Text.class);

        job.setOutputValueClass(Text.class);

        FileInputFormat.addInputPath(job, new Path(args[0]));

        FileOutputFormat.setOutputPath(job, new Path(args[1]));

        System.exit(job.waitForCompletion(true) ? 0 : 1);       

    }

}


元芳怎么了
浏览 271回答 1
1回答

森林海

Reducer 工作正常,但Combiner 并没有按照你的想法做。打开组合器时发生的情况是:映射器输出:("GET&nbsp;/&nbsp;HTTP/1.1",&nbsp;"10.31.0.1") ("GET&nbsp;/&nbsp;HTTP/1.1",&nbsp;"10.31.0.2")组合输入:("GET&nbsp;/&nbsp;HTTP/1.1",&nbsp;{"10.31.0.1",&nbsp;"10.31.0.2"})组合器输出:("GET&nbsp;/&nbsp;HTTP/1.1",&nbsp;"2")&nbsp;//You&nbsp;have&nbsp;the&nbsp;right&nbsp;answer&nbsp;here...减速机输入:("GET&nbsp;/&nbsp;HTTP/1.1",&nbsp;{"2"})&nbsp;//...but&nbsp;then&nbsp;it&nbsp;gets&nbsp;passed&nbsp;into&nbsp;the&nbsp;Reducer&nbsp;again减速机输出:("GET&nbsp;/&nbsp;HTTP/1.1",&nbsp;"1")只有一个元素进入 Reducer,因此它减少到“1”。删除组合器(删除job.setCombinerClass(IntSumReducer.class);,这将起作用。其他建议的更改:使用 Reducer 输出IntWritable而不是将数字转换为Text.用SetaSet<Text>代替Set<String>,以节省昂贵的Text -> String转换。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java