В настоящее время я читаю статью, и я пришел к выводу, что писатели говорят, что у них есть несколько массивов в памяти для каждой задачи карты, и когда задача карты заканчивается, они выводят этот массив.Hadoop: Возможно ли иметь в структуре памяти функцию карты и суммировать их?
Это документ, который я имею в виду: http://research.google.com/pubs/pub36296.html
Это выглядит несколько по битам, не MapReduce, что нужно сделать, но я пытаюсь реализовать этот проект, и я пришел к точке были это только решение. Я пробовал много способов использовать общую философию уменьшения карты, которая обрабатывает каждую строку и выводит пару ключевых значений, но таким образом у меня есть для каждой строки ввода много тысяч контекстных записей, и ее занимает много времени, чтобы написать их. Таким образом, моя задача карты является узким местом. Эти контекстные записи стоят дорого.
Если я сделаю это по-своему, мне удастся значительно сократить количество пар ключ-значение. Поэтому мне нужно найти способ иметь в структурах памяти для каждой задачи карты. Я могу определить эти структуры как статические в функции установки, но я могу найти способ сказать, когда заканчиваются задачи карты, чтобы я мог выводить эту структуру. Я знаю, это звучит немного странно, но это единственный способ работать эффективно.
Это то, что они говорят, в этой статье
При загрузке каждый преобразователь загружает набор разделенных точками, которые будут рассматриваться для каждого заказанного атрибута. Для каждого узла n ∈ N и атрибута X, картограф поддерживает таблицу Tn, X ключей- пары значений.
После обработки всех входных данных, то картостроители OUT- пут ключей вида п, 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 тысяч наборов атрибутов. Мне кажется, что я пишу в файлах, а не в памяти. Поэтому мне действительно нужно уменьшить эти записи. Агрегация их в памяти (в функции карты, а не в объединителе) необходима.
да, это именно то, что я хочу. агрегировать и выводить на редуктор (и, возможно, иметь объединитель). Закрыть кажется хорошим решением. И да, если статические переменные могут вызвать некоторые проблемы. Спасибо что подметил это. Поэтому я попытаюсь сделать что-то вроде context.write внутри close (я просто проверил, что он называется очисткой). Я сообщу вам, если это сработает. Я просто попробовал написать несколько более мелких текстовых переменных, и это стало быстрее. Спасибо за ваши ответы. Они не могли быть более полезными. – jojoba
Хорошо, я сделал это. Это полностью описано в статье. Это происходит намного быстрее. Мне все еще нужно немного оптимизировать мой код, и все будет хорошо. Большое спасибо за ваши предложения – jojoba