0x00 Предисловие
Вспоминая, что когда я впервые изучил Hadoop, моим первоначальным намерением было писать программы MapReduce, но потребовалась неделя на создание автономной среды, неделя на создание распределенной среды и еще неделя на запуск демо для устранения ошибки. В конце концов, я забыл, что хотел изучить MapReduce.
Я чувствую, что хоть я и занимаюсь Hadoop, писать MR гораздо меньше, чем я думал. В первые дни много сил уходило на установку и различное ежедневное обслуживание кластера.После знакомства с Hive для решения задач часто использовался Hive, а затем постепенно различные задачи переносились на Spark, поэтому акцент на MapReduce было намного меньше. Если хорошенько подумать, MapReduce сам по себе очень прост и удобен в освоении, поэтому на этот раз мы отложим в сторону принципы реализации, лежащие в основе различных MapReduce, и подробно рассмотрим его модель программирования.
0x01 Модель программирования
Вычисления MapReduce предоставляют лаконичный программный интерфейс.Для вычислительной задачи входными данными являются пары данных "ключ/значение", а выходные данные также представлены парой данных "ключ/значение".
Для разработчиков приложений параллельная пакетная обработка крупномасштабных данных может быть выполнена только путем реализации конкретных операций в двух интерфейсных функциях Map и Reduce в соответствии с бизнес-логикой.
MapФункция принимает пару данных "ключ/значение" в качестве входных данных, а входные данные вычисляются с помощью бизнес-логики для создания некоторых промежуточных данных, которые по-прежнему выражаются в форме "ключ/значение". Вычислительная среда MapReduce будет автоматически объединять записи с одинаковым значением ключа в промежуточных результатах и передавать данные в логику обработки, определенную в функции Reduce, в качестве входного значения.
ReduceФункция получает промежуточные данные, такие как значение ключа и соответствующие ему значения значений, переданные с этапа карты.Логика функции обрабатывает содержимое значения, соответствующее ключу, как правило, путем накопления, фильтрации, преобразования и других операций для создания ключа. Результат в виде /Value, это окончательный результат бизнес-расчета.
0x02 дать каштан
1. Описание проблемы
Возьмем самый классический пример MapReduce — WordCount. Предположим, вам дано 10 миллиардов текстового контента, как посчитать общее количество вхождений каждого слова? Или подсчитать N слов с наибольшим количеством вхождений?
Эта задача кажется простой, но если ее делать быстро в автономной среде, она все равно требует навыков реализации, в основном из-за огромного масштаба данных. Если это реализовать во фреймворке MapReduce, то будет намного проще, пока реализованы соответствующие функции Map и Reduce.
2. Реализация кода
Реализуем общую логику на Python:
def map(key, value):
values = value.split(" ") for v in values: print (v, "1")def reduce(key, value):
int result=0
for v in value:
result += int(v) print (key, result)
скопировать код
Ключом операции Map является идентификатор файла или идентификатор веб-страницы, а значением — его текстовое содержимое, состоящее из последовательности слов.Основная функция функции Map состоит в том, чтобы разобрать текстовое содержимое на слова и количество вхождений слов, например<w,1>
. Обычно мы не обращаем особого внимания на ключ в карте, а только разбираем значение в нем.
Ключевое значение операции Reduce — это слово, а соответствующее значение — список вхождений. Путем обхода списка вхождений одного и того же ключа и накопления вхождений можно определить общее количество вхождений слова в коллекции веб-страниц. получить.
3. Анализ
Нарисуйте общую картину, чтобы объяснить, что делает процесс MapReduce.
- В крайнем левом углу находится текстовое содержание, которое нам нужно подсчитать.Предположим, что мы сейчас имеем дело с тремя вопросами, каждый из которых имеет определенное содержание.
- На этапе «Карта» наша функция «Карта» будет читать соответствующий текст, анализировать в нем слова и затем выводить
dantezhao 1
Эта структура, где ключом является дантечжао, а значением является количество вхождений 1. - Затем будет процесс Shuffle, чтобы поместить данные с одним и тем же ключом в один и тот же Reduce для обработки.Например, мы отправим все данные с ключом dantezhao во второй Reduce.
- В фазе Уменьшить по тому же ключу подсчитывается количество раз его появления, то есть прибавляется значение.
0xFF Сводка
Простая модель программирования MapReduce на самом деле не сложна.Конечно, есть еще много деталей, которые нужно изучить более глубоко, таких как дизайн Partitioner, дизайн фазы Shuffle и некоторые оптимизации Map и Reduce. Вот основной обзор на данный момент.