Hadoop: наличие потоков внутри функции карты - PullRequest
3 голосов
/ 07 марта 2012

Могу ли я иметь потоки внутри функции карты? У меня есть задача, чтобы темы могли мне помочь. Мне нужно одновременно добавить значения в hashmap для каждой строки ввода. Моя строка ввода становится массивом строк, и для каждого значения этого массива мне нужно добавить его в хэш-карту. Позже я использую этот hashmap в функции очистки.

Я делаю это с помощью цикла for, и кажется, что это узкое место для моего проекта. Поэтому я подумал об использовании одновременной хэш-карты и разделении массива строк на несколько меньших массивов. Таким образом, каждый поток будет отвечать за добавление соответствующего «меньшего» массива в hashmap. Дело в том, что я реализовал его в локальном Java-приложении, и оно работает. Когда я использую его внутри Hadoop, результаты не ожидаемые. Я использую Thread.join () для каждого потока, так что для каждой строки ввода я проверяю, что потоки закончили до следующей строки. Ну, это то, что я думал, что сделал. Обрабатывает ли hadoop потоки особым образом?

   edits for duffymo

Вот гугл цитата http://research.google.com/pubs/pub36296.html.

Алгоритм 2 - это та часть, о которой я говорю. Как видите, для каждого атрибута есть цикл for, а для каждого атрибута мне нужно обновить структуру памяти. Они должны прогнозировать только одно значение в своем подходе (обучение по одной метке), в моем случае у меня может быть много значений для прогнозирования (обучение по нескольким меткам). Итак, что говорит Google значение y, для них это массив из 3 значений. Для меня это может быть до тысячи. Агрегирование двух 3-мерных векторов происходит намного быстрее, чем агрегация двух 10000-мерных векторов.

Если я добавлю в алгоритм только одну метку, у меня вообще не будет никаких проблем. 45 секунд, которые я упомянул, уменьшены до менее 5. Так что да, он работает правильно только для одной метки.

45 секунд, которые я упомянул, предназначены только для цикла for. Я не считал разбор и все остальное. Цикл for наверняка является узким местом, поскольку это единственное, что я измеряю, и это занимает около 45 секунд, в то время как вся задача занимает около 1 минуты (включая инициализацию задачи и многое другое). Я хочу попробовать и разбить этот цикл for на 2 или 3 меньших цикла for и обрабатывать их одновременно. Попытка означает, что это может работать и что это может не работать. Иногда такие сумасшедшие вещи, как я упомянул, могут быть необходимостью. Хорошо, это то, что уважаемый программист рассказал мне в предыдущей ветке о hadoop.

Раньше я не предоставлял эти подробности, так как думал, что мне нужно только мнение о hadoop и потоках внутри функции карты. Не думал, что кто-то так сильно меня спросит: P.

Ответы [ 2 ]

4 голосов
/ 07 марта 2012

Hadoop, сам по себе построен для параллелизма. Но он делает это очень грубо. Параллелизм Hadoop хорош, когда набор данных большой, и его можно разделить на множество подмножеств, которые обрабатываются отдельно и независимо (здесь для простоты я имею в виду только этап «Карта»), например, для поиска одного шаблона в тексте.
Теперь давайте рассмотрим следующий случай: у нас много данных, и мы хотим найти тысячи различных шаблонов в этом тексте. Теперь у нас есть два варианта использования наших многоядерных процессоров.
1. Обрабатывать каждый файл с помощью отдельного сопоставителя в одном потоке и иметь несколько сопоставителей на узел
2. Определите один маппер на узел и обработайте один файл всеми ядрами.
Второй способ может быть гораздо более дружественным к кешу и, следовательно, более эффективным.
В итоге - в случаях, когда мелкозернистый, многоядерный дружественный параллелизм оправдан характером обработки - использование многопоточности в mapper может принести нам пользу.

3 голосов
/ 07 марта 2012

Вам не нужны потоки, если я правильно понимаю Hadoop и правильно отображаю / уменьшаю.

Что заставляет вас думать, что анализ одной строки ввода является узким местом в вашем проекте?Вам просто кажется, что это проблема, или у вас есть данные, чтобы доказать это?

ОБНОВЛЕНИЕ: Спасибо за цитату.Это, очевидно, что-то, что придется переварить мне и другим, поэтому у меня не будет никаких быстрых советов в краткосрочной перспективе.Но я очень ценю цитату и ваше терпение.

...