Разберитесь в Map, Shuffle и Reduce

Биг датаBeginner
Практиковаться сейчас

Введение

Файлы товаров компании организованы и доступны. Теперь можно ответить на вопрос первой работы: какие обозначения товаров встречаются чаще всего? Несколько строк можно подсчитать вручную, но растущему набору данных нужно воспроизводимое вычисление.

MapReduce — способ организации пакетного вычисления. Map превращает входные записи в пары ключ/значение; Shuffle собирает значения с одинаковым ключом вместе; Reduce объединяет значения каждого ключа в результат. В WordCount ключ — обозначение товара, а каждое появление добавляет значение 1. Подсчёт слов — небольшой пример, делающий поток данных наглядным, а не полноценная система анализа продаж.

Вы изучите эти этапы с подготовленным учебным инструментом, затем запустите настоящую заранее скомпилированную программу Hadoop WordCount на тех же входных данных. Учебный инструмент выводит этапы алгоритма в одном процессе; это не трассировка распределённого выполнения. Hadoop будет работать в локальном режиме, чтобы вы сосредоточились на вычислении перед переносом того же алгоритма в YARN в следующей работе. Программирование на Java и Python не требуется.

Превратите обозначения товаров в пары ключ/значение

На этом шаге вы изучите входные данные и проследите каждое появление товара на этапе Map.

Начните в локальном рабочем каталоге:

cd /home/labex/project

Прочитайте шесть входных строк:

cat /home/labex/project/data/product-words.txt

Ожидаемый текст:

notebook pen
notebook folder
pen pen
folder notebook
notebook
folder pen

Остановитесь и подсчитайте один товар вручную. notebook появляется в четырёх строках, по одному разу в каждой; pen встречается всего четыре раза, включая два появления в третьей строке. folder появляется три раза. Программа должна получить те же итоговые значения.

Пара ключ/значение связывает обозначение со значением. В этом алгоритме Map выдаёт (product, 1) для каждого появления. Два вхождения pen создают две отдельные пары, а не одну пару на входную строку.

Предоставленный исполняемый файл wordcount-stages принимает имя этапа и локальный входной файл. Используйте его представление map:

/home/labex/project/tools/wordcount-stages map /home/labex/project/data/product-words.txt

Начало вывода:

notebook 1
pen 1
notebook 1
folder 1

Между каждым ключом и значением стоит символ табуляции. Всего одиннадцать пар, по одной на каждое появление товара. Инструмент делает алгоритм наглядным; он не запускает службы Hadoop и не планирует задачи. Сохраните вывод этапа:

/home/labex/project/tools/wordcount-stages map /home/labex/project/data/product-words.txt > /home/labex/project/output/map-pairs.txt

Вы изменили представление входных данных: целые строки превратились в отдельные вклады, которые можно сгруппировать по товару.

Сгруппируйте и суммируйте вклады

На этом шаге вы проследите пары через Shuffle и Reduce, затем свяжете результат со своим ручным подсчётом.

Map выдаёт отдельные вклады. Чтобы получить итог по товару, его вклады нужно собрать вместе. Shuffle и сортировка организуют пары по ключу, чтобы обработчик Reduce получил значения определённого товара. В распределённом задании это может требовать передачи данных между задачами; учебный инструмент только показывает сгруппированные значения.

Изучите сгруппированное представление:

/home/labex/project/tools/wordcount-stages shuffle /home/labex/project/data/product-words.txt

Ожидаемые сгруппированные значения:

folder 1,1,1
notebook 1,1,1,1
pen 1,1,1,1

Ключи отсортированы. Каждое значение 1, отделённое запятой, по-прежнему представляет исходное появление, а не новую запись. Сохраните группировку:

/home/labex/project/tools/wordcount-stages shuffle /home/labex/project/data/product-words.txt > /home/labex/project/output/shuffled-values.txt

Reduce объединяет значения каждого ключа. Здесь он складывает целые числа. В другом приложении значения можно объединять иначе; MapReduce не ограничивается подсчётом.

Изучите представление результата Reduce:

/home/labex/project/tools/wordcount-stages reduce /home/labex/project/data/product-words.txt

Ожидаемые результаты:

folder 3
notebook 4
pen 4

Сравните значения с ручным подсчётом из шага 1. Сохраните результат, чтобы далее сравнить его с настоящим приложением Hadoop:

/home/labex/project/tools/wordcount-stages reduce /home/labex/project/data/product-words.txt > /home/labex/project/output/teaching-counts.txt

Результат зависит от всех появлений каждого ключа, даже когда исходные появления находились в разных строках. Именно поэтому между отображением Map и свёрткой Reduce стоит группировка.

Запустите настоящую программу Hadoop WordCount

На этом шаге вы выполните тот же подсчёт с заранее скомпилированным примером Hadoop в локальном режиме.

JAR упаковывает код программы Java. Hadoop и JAR с примерами уже установлены, поэтому компилировать код не нужно. hadoop jar запускает указанный JAR; wordcount выбирает пример WordCount. Две настройки -D ниже выбирают локальную среду выполнения и локальную файловую систему для этого вызова. Последние два аргумента — входной файл и новый выходной каталог:

hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.5.0.jar wordcount -Dmapreduce.framework.name=local -Dfs.defaultFS=file:/// /home/labex/project/data/product-words.txt /home/labex/project/output/local-wordcount

Дождитесь приглашения. Hadoop выводит сообщения о ходе выполнения и диагностике; пути, идентификаторы и время различаются. Это настоящая программа Hadoop с локальным исполнителем, а не приложение YARN. В работе не запускаются службы HDFS или YARN, и входные, и выходные данные локальные.

Выведите список локального выходного каталога:

ls /home/labex/project/output/local-wordcount

Вы должны увидеть маркер _SUCCESS и файл результатов part-.... _SUCCESS указывает на успешное завершение записи результата, а файл результатов содержит данные, которые нужно проверить. Шаблон локальной оболочки part-* выбирает файлы результатов. Передайте их объединённое содержимое через sort, чтобы сравнение было стабильным:

cat /home/labex/project/output/local-wordcount/part-* | sort > /home/labex/project/output/hadoop-counts.txt

Сравните его с количествами учебного инструмента:

diff /home/labex/project/output/teaching-counts.txt /home/labex/project/output/hadoop-counts.txt

Различия не должны появляться. Вы связали объяснённый алгоритм с настоящим выводом программы. Если выходной каталог этого запуска уже существует, изучите готовые файлы, а не удаляйте его вслепую и не предполагайте, что повторная отправка их перезапишет.

Позже будет важно одно различие: блок HDFS хранит байты, входное разбиение (input split) описывает единицу входной работы, а задача (task) выполняет работу. Они связаны, но не всегда соответствуют друг другу один к одному. Файлы результатов — выходные данные задач обработки, а не копии исходных блоков хранения.

Предположите и проверьте одно изменение входных данных

На этом шаге вы добавите одно появление товара в рабочую копию и проверите, какой результат изменится.

Оставьте исходный входной файл только для чтения без изменений. Локальной командой cat с > запишите новую доступную для записи рабочую копию. Оба пути здесь локальные; менять вы будете выходной файл:

cat /home/labex/project/data/product-words.txt > /home/labex/project/output/changed-product-words.txt

Предположите новые количества при добавлении одного появления notebook: только его итог должен увеличиться с 4 до 5. printf выводит заданный текст, \n означает новую строку, а >> дописывает вывод вместо замены существующего содержимого:

printf 'notebook\n' >> /home/labex/project/output/changed-product-words.txt

Изучите изменённый входной файл:

cat /home/labex/project/output/changed-product-words.txt

Должна появиться одна новая последняя строка. Запустите ту же программу Hadoop, изменив только входной и выходной пути:

hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.5.0.jar wordcount -Dmapreduce.framework.name=local -Dfs.defaultFS=file:/// /home/labex/project/output/changed-product-words.txt /home/labex/project/output/changed-wordcount

Прочитайте фактические результаты в отсортированном порядке:

cat /home/labex/project/output/changed-wordcount/part-* | sort

Ожидаемые результаты:

folder 3
notebook 5
pen 4

Новая пара Map относится к группе notebook, поэтому меняется только этот итог Reduce. Теперь вы можете объяснить результат, а не просто распознать успешную команду. В следующей работе алгоритм и правила подсчёта останутся прежними, а HDFS предоставит входные данные и YARN будет управлять ресурсами выполнения.

Итоги

Вы проследили превращение появлений товаров в пары Map, группировку значений через Shuffle и их объединение через Reduce. Результаты настоящего Hadoop WordCount совпали с ручным подсчётом и учебным инструментом, а затем изменились предсказанным образом при добавлении одного появления во входных данных.

Вы использовали локальный исполнитель, чтобы отдельно изучить алгоритм. Далее вы сохраните этот алгоритм и узнаете, как настоящее приложение YARN читает входные данные HDFS и создаёт результаты в HDFS.