Введение
Файлы товаров компании организованы и доступны. Теперь можно ответить на вопрос первой работы: какие обозначения товаров встречаются чаще всего? Несколько строк можно подсчитать вручную, но растущему набору данных нужно воспроизводимое вычисление.
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.



