один маппер или редуктор для обработки одного файла или каталога - PullRequest
2 голосов
/ 12 января 2012

Я новичок в Hadoop и MapReduce. У меня есть некоторые каталоги и файлы в этом (каждый файл размером 10 МБ и N может быть 100. Файлы могут быть сжаты или не сжаты), как: MyDir1 / file1 MyDir1 / file2 ... MyDir1 / fileN

MyDir2 / file1 MyDir2 / file2 ... MyDir3 / fileN

Я хочу разработать приложение MapReduce, в котором один преобразователь или преобразователь будет обрабатывать весь MyDir1, т. Е. Я не хочу, чтобы MyDir1 разделялся на несколько сопоставителей. Точно так же я хочу, чтобы MyDir2 обрабатывался другим картографом / редуктором полностью без разделения.

Есть идеи, как это сделать? Нужно ли мне писать свой InputFormat и читать входные файлы?

1 Ответ

5 голосов
/ 12 января 2012

Реализация FileInputFormat # isSplitable () .Тогда входные файлы не разделяются и обрабатываются по одному на карту.Обратите внимание, что время выполнения задания зависит от времени обработки самого большого входного файла, несмотря на то, что преобразователи выполняются параллельно.Кроме того, это может быть неэффективно, так как будет происходить много перетасовки данных между узлами.

import org.apache.hadoop.fs.*;
import org.apache.hadoop.mapred.TextInputFormat;
public class NonSplittableTextInputFormat extends TextInputFormat {
    @Override
    protected boolean isSplitable(FileSystem fs, Path file) {
        return false;
    }
}

Текущий API не позволяет обрабатывать весь каталог одним преобразователем.Возможно, вам придется написать свой InputFormat .Или же создайте список каталогов, которые нужно обработать, и передайте один каталог каждому обрабатываемому преобразователю, опять же, это неэффективно из-за перестановки данных между узлами.

Возвращаясь к редукторам, они работают на выходеKV-пары из картографов, а не входные файлы / каталоги.

...