Я сейчас читаю статью, и я пришел к выводу, что авторы говорят, что у них есть несколько массивов в памяти для каждой задачи карты, и когда задача карты заканчивается, они выводят этот массив.
Это статья, на которую я ссылаюсь: http://research.google.com/pubs/pub36296.html
Это выглядит немного не в духе mapreduce, но я пытаюсь реализовать этот проект, и я пришел к выводу, что это единственное решение. Я пробовал много способов использовать общую философию сокращения карт, которая заключается в обработке каждой строки и выводе пары ключ-значение, но таким образом у меня есть для каждой строки ввода много тысяч контекстных записей, и запись занимает много времени их. Так что моя задача на карте - узкое место. Эти контекстные записи стоят дорого.
Если я сделаю это по-своему, мне удастся значительно сократить количество пар ключ-значение. Поэтому мне нужно найти способ иметь в памяти структуры для каждой задачи карты.
Я могу определить эти структуры как статические в функции настройки, но я могу найти способ сказать, когда задачи карты заканчиваются, чтобы я мог вывести эту структуру. Я знаю, это звучит немного странно, но это единственный способ работать эффективно.
Это то, что они говорят в этой газете
При запуске каждый картограф загружает набор точек разделения
учитывается для каждого упорядоченного атрибута. Для каждого узла n ∈ N
и атрибут X, преобразователь поддерживает таблицу Tn, X
пары значений.
После обработки всех входных данных картографы
положить ключи вида n, X и значения v, Tn, X [v]
Вот некоторые правки после ответа Шона:
Я использую комбайнер в своей работе. Дело в том, что эти команды context.write (Text, Text) в моей функции карты действительно отнимают много времени. Мой ввод - CSV-файлы или ARFF-файлы. В каждой строке есть пример. Мои примеры могут иметь до тысячи атрибутов. Я вывожу для каждого атрибута пары ключ-значение в виде <(n, X, u), Y>, где - имя узла (я строю дерево решений), X - имя атрибута, u - значение атрибута, а Y - некоторая статистика в текстовом формате. Как вы можете сказать, если у меня есть 100 000 атрибутов, у меня будет 100 000 команд context.write (Text, Text) для каждого примера. Запустив мою задачу карты без этих команд, она работает как ветер. Если я добавлю команду context.write, это займет вечность. Даже за 2000 тысяч атрибутов учебного комплекта. Похоже, я пишу в файлах, а не в памяти. Так что мне действительно нужно уменьшить эти записи. Необходимо объединить их в памяти (в функции карты, а не в объединителе).