1

私は totalorderpartitioner の概念にまったく慣れていません。この概念を適用しましたが、グローバルな並べ替えを作成することに成功していません。これは私の入力レコードです

676576
7489768576
689576857867857
685768578678578675
765897685789675879679587
1
5
6
7
8
9
0
2
3
5
6
9

これは私のマッパーです

public void map(LongWritable key, Text value,
            OutputCollector<NullWritable, Text> outputCollector, Reporter reporter) throws IOException {
        // TODO Auto-generated method stub
        outputCollector.collect(NullWritable.get(),value);

    }

これは私の減速機です

public void reduce(NullWritable key, Iterator<Text> values,
            OutputCollector<NullWritable, Text> outputCollector, Reporter reporter) throws IOException {
        // TODO Auto-generated method stub
        while (values.hasNext()) {
            Text text = (Text) values.next();
            outputCollector.collect(key,text);

        }

    }

これは私の仕事関連のコードです

JobConf jobConf = new JobConf();
jobConf.setMapperClass(TotalOrderMapper.class);
jobConf.setReducerClass(TotalOrderReducer.class);
jobConf.setMapOutputKeyClass(NullWritable.class);
jobConf.setMapOutputValueClass(Text.class);
jobConf.setOutputKeyClass(NullWritable.class);
jobConf.setOutputValueClass(Text.class);
jobConf.setPartitionerClass(TotalOrderPartitioner.class);
jobConf.setInputFormat(TextInputFormat.class);
jobConf.setOutputFormat(TextOutputFormat.class);
FileInputFormat.addInputPath(jobConf, new Path("hdfs://localhost:9000/totalorderset.txt"));
FileOutputFormat.setOutputPath(jobConf, new Path("hdfs://localhost:9000//sortedRecords5.txt"));
Path pa = new Path("hdfs://localhost:9000//partitionfile","_partitions.lst");
TotalOrderPartitioner.setPartitionFile(jobConf,
        pa);
InputSampler.writePartitionFile(jobConf,
        new InputSampler.RandomSampler(1,1));
JobClient.runJob(jobConf);

しかし、レコードはソートされていません.これは私の出力です

676576
7489768576
689576857867857
685768578678578675
765897685789675879679587
1
5
6
7
8
9
0
2
3
5
6
9

どこが間違っているのかわかりません.誰かが問題を解決するのを手伝ってくれますか?そして、入力サンプリングが正確にここでどのように機能するか教えてください.事前に感謝します

4

1 に答える 1

2

Mapreduce はキーでソートします。nullwritable でソートしているため、ソートをまったく行っていません。

outputCollector.collect(NullWritable.get(),value);

マップの出力キーは入力値にする必要があります。

outputCollector.collect(value, NullWritable.get());

これを試してみて、うまくいくかどうかお知らせください。

2 番目の注意: Text の代わりにIntWritableを使用しないと、並べ替えは辞書順になります。

于 2013-10-14T15:09:40.223 に答える