Значит так, все мы понимаем, что такое map & reduce и как это работает с точки зрения пользователя. Я пытаюсь заглянуть под капот, и выходит какая-то каша. Я приведу два примера, насколько я понял, а вы поправьте, что не так.
Первый - подсчет частоты слов в файле (это пример с википедии) (примерный псевдокод):
1. records : file.readline
2. map : for (line <- input) accumulate <word, word count in line>
Вот здесь первый вопрос: так как это пока все работает на хосте, то, пусть и с распараллеливанием, мы выполняем фактически подзадачи основной задачи на одной ноде. Что я понял неправильно?
3. partition: здесь мы для каждой пары в аккумуляторе (там же сейчас могут быть пары с одинаковыми словами из разных строк?) считаем, например, хэш ключа и отправляем это в соответствующий reducer. Таким образом, у нас в конце-концов получится разбиение на непресекающиеся классы и все такое.
4. Полученные N списков пар <word, word frequency>, среди которых могут быть пары с одинаковыми ключами (или здесь нужно включать shuffle, чтобы он делал пары <word, {frequency_in_line1, ..., frequency_in_lineK}>?), мы теперь отправляем на N узлов, где уже традиционными методами считаем эти частоты.
5. Делаем union всех N результатов?[pre/] Здесь непонятно, потому что снова - это же уже на мастер-узле делается? Это не будет бутылочным горлышком?
Второй пример. Считаем pi методом Монте-Карло (pi/4 = (число случайных пар, выбранных из [0,1]^2, у которых радиус меньше, чем 1) / (число всех опытов)).
Здесь вход - M бросаний (пусть для конкретности 100 000), т.е. тех самых пар (x, y) <- (Uniform[0, 1], Uniform[0, 1]).
Теперь на этапе Map нужно как-то создать пары <Key, Value>, но я здесь вообще не соображаю: если считать за ключ r^2 = x^2 + y^2, а за значение - 1, если r^2 <= 1, и 0 в обратном случае, то снова - большой объем вычислений происходит на мастер-ноде. И потом на этапе «партишен» мы просто распихаем по хэшам r^2 снова на N нод, а там будем только суммировать единицы, отдавать сумму на мастер, на мастере снова суммировать выхлопы с нод, а затем просто делить сумму на M? Снова мне кажется, что reducer'ы делают меньше работы, чем Map.
Я понимаю, что примеры какие-то полувырожденные; и что я, наверное, просто ниасилил, но было бы хорошо, если бы вы помогли разобраться. Бложики хипстеров от MapReduce в основном объясняют, что такое Map & Reduce как ФВП, а не технику работы.
Скастую-ка я кого-нибудь, например, Reset как писателя хайлода (на всякий случай), maxcom как представителя джава-Ънтерпрайза, vertexua туда же, ну и всех анонимусов, которым есть что сказать. А, и buddhist, mv, quasimoto, как спв. Простите, если с кем-то мимо.