Почему бы не картер / редуктор для hadoop TeraSort - PullRequest
1 голос
/ 04 июля 2011

Я планирую вставить некоторый код в преобразователь класса TeraSort в Hadoop 0.20.2.Однако после просмотра исходного кода я не могу найти сегмент, в котором реализован картограф.Обычно мы увидим метод с именем job.setMapperClass (), который указывает класс сопоставления.Однако для TeraSort я вижу только такие вещи, как setInputformat, setOutputFormat.Я не могу найти, где называются методы преобразования и сокращения?Кто-нибудь может дать несколько советов по этому поводу?Спасибо, исходный код выглядит примерно так:

public int run(String[] args) throws Exception {
   LOG.info("starting");
   JobConf job = (JobConf) getConf();
   Path inputDir = new Path(args[0]);
   inputDir = inputDir.makeQualified(inputDir.getFileSystem(job));
   Path partitionFile = new Path(inputDir, TeraInputFormat.PARTITION_FILENAME);
   URI partitionUri = new URI(partitionFile.toString() +
                           "#" + TeraInputFormat.PARTITION_FILENAME);
   TeraInputFormat.setInputPaths(job, new Path(args[0]));
   FileOutputFormat.setOutputPath(job, new Path(args[1]));
   job.setJobName("TeraSort");
   job.setJarByClass(TeraSort.class);
   job.setOutputKeyClass(Text.class);
   job.setOutputValueClass(Text.class);
   job.setInputFormat(TeraInputFormat.class);
   job.setOutputFormat(TeraOutputFormat.class);
   job.setPartitionerClass(TotalOrderPartitioner.class);
   TeraInputFormat.writePartitionFile(job, partitionFile);
   DistributedCache.addCacheFile(partitionUri, job);
   DistributedCache.createSymlink(job);
   job.setInt("dfs.replication", 1);
   // TeraOutputFormat.setFinalSync(job, true);                                                                                                                                                                                             
   job.setNumReduceTasks(0);
   JobClient.runJob(job);
   LOG.info("done");
   return 0;
 }

Для других классов, таких как TeraValidate, мы можем найти код, подобный

job.setMapperClass(ValidateMapper.class);
job.setReducerClass(ValidateReducer.class);

Я не вижу таких методов для TeraSort.

Спасибо,

Ответы [ 2 ]

3 голосов
/ 04 июля 2011

Почему для сортировки необходимо установить класс Mapper и Reducer?

Значением по умолчанию является стандарт Mapper (прежнее удостоверение личности) и стандарт Reducer. Это классы, которые вы обычно наследуете.

По сути, вы можете сказать, что вы просто излучаете все из входных данных и позволяете Hadoop выполнять свою собственную сортировку. Так что сортировка работает по умолчанию.

1 голос
/ 27 июня 2013

Томас ответил правильно, т. Е. Маппер и редукторы идентичны, так как перемешанные данные сортируются перед применением функции сокращения. Что особенного в terasort - это его собственный разделитель (который не является хэш-функцией по умолчанию). Вы должны прочитать больше об этом здесь Реализация Hadoop для Terasort . Это заявляет

"TeraSort - это стандартная сортировка карты / сокращения, за исключением пользовательского разделителя, который использует отсортированный список из N - 1 выборочных ключей, которые определяют диапазон ключей для каждого сокращения. В частности, все ключи, такие как [i - 1 ] <= key <sample [i] отправляются для сокращения i. Это гарантирует, что все выходные данные Reduce i меньше, чем выходные данные Reduce i + 1. "</p>

...