TotalOrderPartitioner игнорирует расположение файла раздела

1

Я пытался сделать простой пример сортировки с TotalOrderPartitioner. Ввод представляет собой файл последовательности с IntWritable как ключ и NullWritable как значение. Я хочу сортировать на основе ключа. Результатом является файл последовательности с IntWritable как ключ и NullWritable как значение. Я выполняю эту работу в кластерной среде. Это мой класс водителя:

public class SortDriver extends Configured implements Tool {

    @Override
    public int run(String[] args) throws Exception {
        Configuration conf = this.getConf();

        Job job = Job.getInstance(conf);
        job.setJobName("SORT-WITH-TOTAL-ORDER-PARTITIONER");
        job.setJarByClass(SortDriver.class);
        job.setInputFormatClass(SequenceFileInputFormat.class);
        SequenceFileInputFormat.setInputPaths(job, new Path("/user/client/seq-input"));
        job.setMapOutputKeyClass(IntWritable.class);
        job.setMapOutputValueClass(NullWritable.class);
        job.setMapperClass(SortMapper.class);
        job.setReducerClass(SortReducer.class);
        job.setPartitionerClass(TotalOrderPartitioner.class);
        TotalOrderPartitioner.setPartitionFile(conf, new Path("/user/client/partition.lst"));
        job.setOutputFormatClass(SequenceFileOutputFormat.class);
        SequenceFileOutputFormat.setCompressOutput(job, true);
        SequenceFileOutputFormat.setOutputCompressionType(job, SequenceFile.CompressionType.BLOCK);
        SequenceFileOutputFormat.setOutputCompressorClass(job, BZip2Codec.class);
        SequenceFileOutputFormat.setOutputPath(job, new Path("/user/client/sorted-output"));
        job.setOutputKeyClass(IntWritable.class);
        job.setOutputValueClass(NullWritable.class);
        job.setNumReduceTasks(3);

        InputSampler.Sampler<IntWritable, NullWritable> sampler = new InputSampler.RandomSampler<>(0.1, 200);
        InputSampler.writePartitionFile(job, sampler);

        boolean res = job.waitForCompletion(true);

        return res ? 0 : 1;
    }

    public static void main(String[] args) throws Exception {
        System.exit(ToolRunner.run(new Configuration(), new SortDriver(), args));
    }
}

Класс Mapper:

public class SortMapper extends Mapper<IntWritable, NullWritable, IntWritable, NullWritable>{

    @Override
    protected void map(IntWritable key, NullWritable value, Context context) throws IOException, InterruptedException {
        context.write(key, value);
    }
}

Класс Reducer:

public class SortReducer extends Reducer<IntWritable, NullWritable, IntWritable, NullWritable> {

    @Override
    protected void reduce(IntWritable key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException {
        context.write(key, NullWritable.get());
    }
}

Когда я запускаю эту работу, я получаю:

Error: java.lang.IllegalArgumentException: Can't read partitions file
    at org.apache.hadoop.mapreduce.lib.partition.TotalOrderPartitioner.setConf(TotalOrderPartitioner.java:116)
    at org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:73)
    at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:133)
    at org.apache.hadoop.mapred.MapTask$NewOutputCollector.<init>(MapTask.java:678)
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:747)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:340)
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:167)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:415)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1557)
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:162)
Caused by: java.io.FileNotFoundException: File file:/grid/hadoop/yarn/local/usercache/client/appcache/application_1406784047304_0002/container_1406784047304_0002_01_000003/_partition.lst does not exist
    at org.apache.hadoop.fs.RawLocalFileSystem.deprecatedGetFileStatus(RawLocalFileSystem.java:511)
    at org.apache.hadoop.fs.RawLocalFileSystem.getFileLinkStatusInternal(RawLocalFileSystem.java:724)
    at org.apache.hadoop.fs.RawLocalFileSystem.getFileStatus(RawLocalFileSystem.java:501)
    at org.apache.hadoop.fs.FilterFileSystem.getFileStatus(FilterFileSystem.java:397)
    at org.apache.hadoop.io.SequenceFile$Reader.<init>(SequenceFile.java:1749)
    at org.apache.hadoop.io.SequenceFile$Reader.<init>(SequenceFile.java:1773)
    at org.apache.hadoop.mapreduce.lib.partition.TotalOrderPartitioner.readPartitions(TotalOrderPartitioner.java:301)
    at org.apache.hadoop.mapreduce.lib.partition.TotalOrderPartitioner.setConf(TotalOrderPartitioner.java:88)
    ... 10 more

Я нашел файл раздела в своем домашнем каталоге (/user/client) с именем _partition.lst. Имя файла раздела не совпадает с кодом: TotalOrderPartitioner.setPartitionFile(conf, new Path("/user/client/partition.lst")); , Может ли кто-нибудь помочь мне с этой проблемой? Я использую hasoop 2.4 в распространении HDP 2.1.

Теги:
sorting
hadoop
mapreduce

3 ответа

2
Лучший ответ

Я думаю, проблема в строке:

TotalOrderPartitioner.setPartitionFile(conf, new Path("/user/client/partition.lst"));

Вы должны заменить его:

TotalOrderPartitioner.setPartitionFile(job.getConfiguration(), new Path("/user/client/partition.lst"));

поскольку вы используете

InputSampler.writePartitionFile(job, sampler);

В противном случае попробуйте заменить последнюю строку только:

InputSampler.writePartitionFile(conf, sampler);

Но я не уверен, что он работает так, как в новом API.

Надеюсь, поможет! Удачи!

0

получил эту ошибку, когда у меня была job.setNumReduceTasks(3); и выполнял мой код в автономном режиме

изменил его на job.setNumReduceTasks(1) и отлично работал в автономном режиме

0

Я также обнаружил эту ошибку, когда я использовал hasoop mapreduce, и служба mapreduce не была установлена и запущена. После установки mapreduce и запуска его исключение исчезло.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню