MapReduce:结果不完整

时间:2013-12-10 17:47:33

标签: java hadoop mapreduce

wcin_file的内容:

Run 1
access 1
default 2
out 2
project 1
task 1
windows 1
your 1

我想使用MapReduce在第二个fild的文件 wcin_file 中对这些数据进行排序,如下所示:

default 2
out 2
access 1
...

但我发现输出文件只包含两行:

default 2
Run     1

为什么呢?以下是一些源代码:

SortLogsMapper

public static class SortLogsMapper extends
            Mapper<Object, Text, Text, IntWritable> {

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

            context.write(value, new IntWritable(0)); //the content of value is just every line, just as `Run 1`, `access 1` etc.
        }
    }

SortLogsReducer

public static class SortLogsReducer extends
        Reducer<Text, IntWritable, Text, IntWritable> {
    private Text k = new Text();
    private IntWritable v = new IntWritable();
    public void reduce(Text key, Iterable<IntWritable> values,
        Context context) throws IOException, InterruptedException {

        k.set(key.toString().split(" ")[0]); //split to get the first filed
        v.set(Integer.parseInt(key.toString().split(" ")[1]));  //second filed
        context.write(k, v);
    }
}

LogDescComparator

public static class LogDescComparator extends WritableComparator {
    protected LogDescComparator() {
        super(Text.class, true);
    }

    @Override
    public int compare(WritableComparable w1, WritableComparable w2) {

        Text t1 = (Text) w1;
        Text t2 = (Text) w2;
        String[] t1Items = t1.toString().split("\t| ");
        String[] t2Items = t2.toString().split("\t| ");
        Integer t1Value = Integer.parseInt(t1Items[1]);
        Integer t2Value = Integer.parseInt(t2Items[1]);
        int comp = t2Value.compareTo(t1Value);

        return comp;

然后我在主要功能中开始了这项工作:

Job job2 = new Job(conf2, "sort");
job2.setNumReduceTasks(1);
job2.setJarByClass(WordCount.class);
job2.setMapperClass(SortLogsMapper.class);
job2.setReducerClass(SortLogsReducer.class);
job2.setSortComparatorClass(LogDescComparator.class);
job2.setOutputKeyClass(Text.class);
job2.setOutputValueClass(IntWritable.class);
FileInputFormat.setInputPaths(job2, new Path("wcin_file"));
FileOutputFormat.setOutputPath(job2, new Path("wcout"));
System.exit(job2.waitForCompletion(true) ? 0 : 1);

2 个答案:

答案 0 :(得分:0)

现在,您的Mapper正在输出以下键值对:

(“Key'some number'”,0)

尝试让映射器拆分值并输出:

(键,'某些数字')

重新编写比较器,先根据键,然后从mapper输出中进行比较(可能已有预先定义的比较器)。

然后你的reducer应该收到密钥和值列表。迭代这个值列表:

(关键,价值)

你做的最多,如果不是所有的减速机工作。尝试使用我在此处描述的映射器。

答案 1 :(得分:0)

LogDescComparator 文件中,似乎如果变量 comp 等于0,则不会打印该值。当comp等于0时,添加一些代码来处理这种情况。