2015-08-16 2 views
3

Я хочу понять, что делать в этом случае.
Например, у меня есть 1 ТБ текстовых данных, и предположим, что 300 ГБ это слово «Привет».
После каждой операции с картой у меня будет набор пар ключ-значение < «Hello», 1>.Что делать, если вход редуктора слишком велик в Hadoop MapReduce

Но, как я уже сказал, это огромная коллекция, 300 ГБ, и, насколько я понимаю, редуктор получает все это и будет раздавлен.

Какое решение для этого?
Предположим, что объединитель мне не поможет (пример WordCount просто для простоты), и данные все равно будут слишком большими для редуктора.

ответ

3

Промежуточный (Mapper) выход хранится в локальной файловой системе узлов, выполняющих задачу mapper, и затем очищается. Обратите внимание, что этот вывод отображения не сохраняется в HDFS. Редуктор действительно получает все промежуточные пары ключ-значение для любого конкретного ключа (т. Е. Весь вывод 300 ГБ для ключа «Hello» будет обрабатываться той же задачей Reducer). Эти данные выводятся в память только тогда, когда это необходимо.

Надеюсь, это поможет.

+1

Что делать, если у меня на диске нет места на 300 ГБ? Будет ли он разделен? – member555

+0

Чтобы справиться с этой ситуацией, существует свойство mappeduce.cluster.local.dir, которое может быть установлено в файле mapred-site.xml. Он может содержать список разделенных запятыми путей к каталогам, которые могут указывать на каталоги на разных устройствах для распространения дискового ввода-вывода. Если не установлено, его значением по умолчанию является $ {hadoop.tmp.dir}/mapred/local. Примечание: свойство hasoop.tmp.dir задано в файле core-site.xml. Его значением по умолчанию для большинства дистрибутивов Linux является «/ tmp». Обращайтесь к нижеуказанному файлу для справки: https://hadoop.apache.org/docs/stable/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml –

2

Редуктор получает все эти данные, но эти данные фактически записываются на диск и записываются только в память при повторении итерации значений. Фактически, объект, возвращаемый этой итерацией, повторно используется для каждого значения: поля и другое состояние просто заменяются до того, как объект будет передан вам. Это означает, что вы должны явно скопировать объект значения, чтобы одновременно иметь все объекты значений в памяти.

+1

но я как понял, Hadoop не сохраняет промежуточные значения на диске. Я ошибаюсь? Кстати, не могли бы вы сказать мне, где здесь Spark отличается? – member555

+2

Задачи карты записывают свой вывод на локальный диск, а не в HDFS. – Marcel

Смежные вопросы