В Hadoop где фреймворк сохраняет выходные данные задачи Map в обычном приложении Map-Reduce? - PullRequest
7 голосов
/ 22 декабря 2011

Я пытаюсь выяснить, где выходные данные задачи «Карта» сохраняются на диске, прежде чем они могут быть использованы задачей «Уменьшить».

Примечание: - используется версия Hadoop 0.20.204 с новым API

Например, при перезаписи метода карты в классе Map:

public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
    String line = value.toString();
    StringTokenizer tokenizer = new StringTokenizer(line);
    while (tokenizer.hasMoreTokens()) {
        word.set(tokenizer.nextToken());
        context.write(word, one);
    }

    // code that starts a new Job.

}

Мне интересно узнать, где context.write () заканчивает записывать данные. До сих пор я столкнулся с:

FileOutputFormat.getWorkOutputPath(context);

Что дает мне следующее местоположение в hdfs:

hdfs://localhost:9000/tmp/outputs/1/_temporary/_attempt_201112221334_0001_m_000000_0

Когда я пытаюсь использовать его как вход для другой работы, это выдает мне следующую ошибку:

org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist: hdfs://localhost:9000/tmp/outputs/1/_temporary/_attempt_201112221334_0001_m_000000_0

Примечание: задание запускается в Mapper, поэтому технически временная папка, в которую записывается задача Mapper, выводится, когда начинается новое задание. С другой стороны, он по-прежнему говорит, что входной путь не существует.

Есть идеи, куда записывается временный вывод? Или, может быть, в каком месте я могу найти выходные данные задачи «Карта» во время работы с этапами «Карта» и «Сокращение»?

Ответы [ 3 ]

5 голосов
/ 05 августа 2013

Каркас редукции карт будет хранить промежуточный вывод на локальный диск, а не HDFS, так как это приведет к ненужной репликации файлов.

4 голосов
/ 27 декабря 2011

Итак, я выяснил, что на самом деле происходит.

Выходная информация маппера буферизируется до тех пор, пока он не достигнет примерно 80% своего размера, и в этот момент он начинает выводить результатна свой локальный диск и продолжает принимать элементы в буфер.

Я хотел получить промежуточный вывод маппера и использовать его как ввод для другого задания, пока маппер еще работал.Оказывается, это невозможно без значительных изменений в развертывании hadoop 0.20.204.Система работает даже после того, как все, что указано в контексте карты:

map .... {
  setup(context)
  .
  .
  cleanup(context)
}

и вызвана очистка, по-прежнему нет дампа во временную папку.

После всего вычисления карты все в конечном итоге объединяется и сбрасывается на диск и становится входом для этапов перемешивания и сортировки, которые предшествуют восстановителю.

Так далеко от всего, что я прочитал и посмотрел, временная папка, в которой в конечном итоге должен быть вывод, - это та, о которой я догадывался заранее.

FileOutputFormat.getWorkOutputPath(context)

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

2 голосов
/ 23 декабря 2011

Средство отслеживания задач запускает отдельный процесс JVM для каждой задачи Map или Reduce.

Вывод Mapper (промежуточные данные) записывается в локальную файловую систему (НЕ HDFS) каждого подчиненного узла Mapper.После передачи данных в Reducer мы не сможем получить доступ к этим временным файлам.

Если вы хотите просмотреть свои выходные данные Mapper, я предлагаю использовать IdentityReducer?

...