Я думаю, что я хорошо разбираюсь в модели программирования MapReduce в целом, но даже после прочтения оригинальной статьи и некоторых других источников для меня неясны многие детали, особенно в отношении разделения промежуточных результатов.
Я быстро подытожу свое понимание MapReduce до сих пор: у нас есть потенциально очень большой набор входных данных, который автоматически разбивается на M разных частей с помощью MR-Framework. Для каждой части фреймворк планирует одну задачу карты, которая выполняется одним из доступных процессоров/машин в моем кластере. Каждая из задач M-карты выводит набор пар ключей-значений, которые хранятся локально на той же машине, которая выполняла эту задачу карты. Каждая машина делит свой диск на разделы R и распределяет пары вычисленных промежуточных ключей на основе промежуточных ключей между разделами. Затем среда начинается для каждого отдельного промежуточного ключа, который уменьшает задачу, которая снова выполняется любой из доступных машин.
Теперь мои вопросы:
- В некоторых учебных пособиях звучит так, будто может быть карта и уменьшить задачи, выполняемые параллельно. Это правильно? Как это могло быть, если предположить, что для каждого отдельного промежуточного ключа запускается только одна задача сокращения? Не нужно ли ждать завершения последней задачи карты, прежде чем мы сможем начать первую задачу сокращения?
- Поскольку у нас есть одна задача сокращения на отдельный промежуточный ключ, правильно ли, что каждая задача сокращения требует, чтобы исполняющая машина загружала соответствующий раздел из любой другой машины? Потенциально, каждая машина может иметь пару "ключ-значение" с требуемым промежуточным ключом, поэтому для каждой задачи сокращения мы потенциально должны запрашивать все остальные машины. Это действительно эффективно?
- В оригинальной статье указано, что количество разделов (R) указано пользователем. Но не является ли раздел для задачи сокращения? Или, точнее: не является ли объединение всех разделов с одинаковым числом среди всех машин вводом одной задачи сокращения? Это будет означать, что R зависит от количества отдельных промежуточных ключей, которые пользователь обычно не знает.
Концептуально ясно, какие входные и выходные данные карты и уменьшить функции/задачи. Но я думаю, что я еще не понял MapReduce на техническом уровне. Может кто-нибудь, пожалуйста, помогите мне понять?