Ваша первая лабораторная работа с Hadoop

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

Введение

Вы помогаете розничной компании ответить на простой вопрос: какие товары чаще всего встречались в ежедневных записях наших магазинов? Прежде чем что-либо подсчитывать, нужно собрать файлы и убедиться, что их содержимое доступно и корректно. Эта лабораторная работа — первый шаг на этом пути.

От повседневных данных к большим данным

Один магазин может хранить ежедневные записи в небольшом файле, который можно открыть на ноутбуке. Теперь представьте тысячи магазинов, ежедневно отправляющих записи, а также данные об активности сайта и обновления со складов. Хранить нужно больше данных, новые данные поступают постоянно, а структура файлов может различаться.

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

Для небольшого файла продаж может хватить электронной таблицы, базы данных или скрипта Python. По мере роста нагрузки один из подходов — распределять хранение и обработку между несколькими соединёнными компьютерами. Группа компьютеров, работающих совместно, называется кластером, а разделение работы между ними — распределёнными вычислениями.

Роль Hadoop

Apache Hadoop — набор инструментов с открытым исходным кодом для хранения и обработки данных в кластере. Для первого представления полезно познакомиться с двумя его частями:

Часть Её задача Вопрос розничной компании
HDFS — распределённая файловая система Hadoop (Hadoop Distributed File System) Хранить файлы на разных машинах и поддерживать копии их данных, если это предусмотрено настройками Где хранить ежедневные входные файлы?
MapReduce — платформа пакетной обработки Разделять задание обработки на более мелкие задачи и объединять их результаты Как подсчитать обозначения товаров во всех этих файлах?

Пакет — ограниченный набор данных, обрабатываемых вместе, например вчерашние файлы. В следующих работах вы запустите готовую программу подсчёта. Здесь вы будете работать с HDFS, то есть с хранением: вычисление полезно лишь тогда, когда оно читает нужные данные.

Hadoop — часть более широкого набора инструментов работы с данными. В последующих курсах вы познакомитесь с Hive для SQL-запросов к файлам, Spark для программной обработки данных и Kafka для непрерывной передачи событий. Для начала этой работы эти инструменты не нужны; запоминать их названия сейчас тоже необязательно.

Первая часть вашего рабочего процесса

Упрощённый рабочий процесс розничной компании выглядит так:

Собрать файлы товаров → Сохранить в HDFS → Обработать пакет → Проверить количества
                         Вы начинаете здесь

Ваша задача — загрузить один файл, прочитать его обратно и проверить, сохранилось ли содержимое. Представьте, что вы проверяете ингредиент перед приготовлением блюда: прежде чем доверять вычислению, нужно убедиться в правильном сохранении данных.

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

К концу работы вы сможете:

  • Отличать локальный файл от файла в HDFS.
  • Создавать каталог HDFS и загружать файл.
  • Читать файл HDFS и сравнивать его с локальным оригиналом.
  • Загружать те же данные под другим именем назначения.

Всю работу выполняйте на вкладке Terminal. Достаточно базовых навыков работы с терминалом; программирование на Java и Python не требуется. Если пути и команды терминала вам незнакомы, начните с учебного пути Linux.

Загрузите первый файл в HDFS

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

В терминале вы вводите запросы. Команда hdfs — это клиент: она отправляет запросы работающей службе HDFS, которая управляет хранящимися файлами. Ниже встретятся и локальные команды Linux, и команды HDFS; сама команда указывает, к какому хранилищу вы обращаетесь.

Службы HDFS уже запущены, а небольшой входной файл подготовлен. Щёлкните в терминале и выполняйте приведённые ниже команды по очереди, каждый раз дожидаясь возвращения приглашения. Копируйте только команду, без символов приглашения.

Командой cd перейдите в локальный каталог проекта:

cd /home/labex/project

Путь начинается с /, поэтому он абсолютный. Локальный входной файл находится в подкаталоге data этого каталога. Обычная команда Linux cat показывает содержимое локального файла:

cat /home/labex/project/data/products.txt

Ожидаемое содержимое:

notebook pen notebook
folder pen
notebook folder

Каждое слово — обозначение товара, а каждое его появление соответствует одной учтённой единице в этом упрощённом примере. Уже сейчас можно вручную насчитать пять появлений notebook и pen вместе: три блокнота и две ручки. При большом числе крупных файлов такой подсчёт могла бы выполнять программа пакетной обработки.

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

У HDFS есть собственное дерево каталогов. В этой среде hdfs dfs отправляет команды файловой системы в HDFS. Создание локального каталога командой Linux mkdir не создаст каталог HDFS.

Создайте каталог внутри своего домашнего каталога HDFS /user/labex. Операция -mkdir создаёт каталог; -p дополнительно создаёт недостающие родительские каталоги и допускает существование целевого каталога:

hdfs dfs -mkdir -p /user/labex/your-first-hadoop-lab

При успехе обычно ничего не выводится. После завершения операции возвращается приглашение. Этот каталог находится в HDFS, хотя в пути используются такие же косые черты, как в локальном пути.

Операция -put копирует локальный исходный файл в место назначения в HDFS. Первый путь ниже локальный, второй относится к HDFS:

hdfs dfs -put /home/labex/project/data/products.txt /user/labex/your-first-hadoop-lab/products.txt

Успешная загрузка обычно не выводит сообщений и оставляет локальный оригинал на месте. Если повторить эту команду после успешной загрузки, HDFS сообщит, что файл назначения уже существует. Продолжайте с просмотра файла; удалять или перезаписывать его не нужно.

Выведите содержимое каталога HDFS с помощью -ls:

hdfs dfs -ls /user/labex/your-first-hadoop-lab

Вы должны увидеть Found 1 items и запись файла, оканчивающуюся следующим путём:

/user/labex/your-first-hadoop-lab/products.txt

Запись также содержит права доступа, владельца, группу, размер и время изменения. Эти сведения вы изучите позже. На этом шаге путь назначения подтверждает наличие файла в HDFS. Далее вы проверите его содержимое.

Прочитайте файл обратно и проверьте содержимое

На этом шаге вы прочитаете файл HDFS, сохраните его содержимое локально и сравните с оригиналом.

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

Перед чтением предположите, что вы увидите: должна ли загрузка изменить обозначения товаров или удалить строки? Операция HDFS -cat читает файл из HDFS и выводит его содержимое в терминале:

hdfs dfs -cat /user/labex/your-first-hadoop-lab/products.txt

Ожидаемое содержимое:

notebook pen notebook
folder pen
notebook folder

Сравните его с локальным файлом, просмотренным на шаге 1. Слова и переносы строк должны совпадать. Обратите внимание на различие команд: cat читает локальный файл, а hdfs dfs -cat в этой среде читает файл HDFS.

Чтобы сохранить локальную копию прочитанных данных, используйте оператор оболочки >. Он перенаправляет вывод команды в локальный файл, создавая его или заменяя существующее содержимое. Подготовленный каталог output предназначен для ваших результатов:

hdfs dfs -cat /user/labex/your-first-hadoop-lab/products.txt > /home/labex/project/output/products-readback.txt

Теперь текст товаров не появляется в терминале, поскольку он записан в локальный выходной файл. Исходный файл HDFS не изменился. Прочитайте сохранённый результат локальной командой cat:

cat /home/labex/project/output/products-readback.txt

Должны появиться те же три строки. Теперь у вас есть локальный оригинал, файл HDFS и локальный файл с прочитанными обратно данными.

Сравните оригинал и сохранённый результат с помощью diff. Если два файла одинаковы, diff ничего не выводит и завершается успешно:

diff /home/labex/project/data/products.txt /home/labex/project/output/products-readback.txt

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

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

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

Перед следующей командой предположите результат: если оставить локальный источник прежним, изменив только имя файла назначения в HDFS, изменятся ли обозначения товаров? Останется ли первый файл HDFS на месте?

Снова загрузите исходный локальный файл, на этот раз указав имя назначения products-copy.txt:

hdfs dfs -put /home/labex/project/data/products.txt /user/labex/your-first-hadoop-lab/products-copy.txt

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

Выведите содержимое каталога HDFS, чтобы проверить своё предположение:

hdfs dfs -ls /user/labex/your-first-hadoop-lab

Теперь должны появиться Found 2 items и записи, оканчивающиеся следующими путями:

/user/labex/your-first-hadoop-lab/products-copy.txt
/user/labex/your-first-hadoop-lab/products.txt

Оба файла остаются на месте, поскольку -put копирует локальный источник в указанное назначение, а не переименовывает предыдущий файл HDFS. Второй файл — учебная копия тех же записей, а не продажи за новый день. Когда вы будете учиться готовить пакетные входные данные, потребуется внимательно выбирать файлы, чтобы дубликаты не учитывались дважды.

Прочитайте новый файл HDFS:

hdfs dfs -cat /user/labex/your-first-hadoop-lab/products-copy.txt

Вывод должен содержать те же три строки с обозначениями товаров. Изменение имени файла не меняет его содержимое.

Тем же способом чтения сохраните новый файл локально:

hdfs dfs -cat /user/labex/your-first-hadoop-lab/products-copy.txt > /home/labex/project/output/products-copy-readback.txt

Сравните сохранённый результат с оригиналом:

diff /home/labex/project/data/products.txt /home/labex/project/output/products-copy-readback.txt

Различия не должны выводиться. Вы проверили обе части своего предположения: первый файл HDFS сохранился, а второй содержит те же данные.

Прежде чем продолжать, определите, какие команды читают локальные файлы, а какие — файлы HDFS. В следующей работе вы изучите конфигурацию, указывающую командам HDFS, куда подключаться.

Итоги

Вы начали с потребности розничной компании собирать и подсчитывать записи о товарах. Вы узнали, почему рост нагрузки на данные может потребовать распределённого хранения и обработки и какую роль играет Hadoop: HDFS хранит файлы, а MapReduce может обработать пакет.

Вы выполнили часть рабочего процесса, связанную с хранением: загрузили локальный текстовый файл с товарами в HDFS, прочитали его обратно и командой diff подтвердили сохранность содержимого. Затем вы предположили и проверили, что произойдёт при изменении только имени назначения в HDFS.

Вы попрактиковались в использовании hdfs dfs -mkdir -p, -put, -ls и -cat, отличая эти операции HDFS от локальной команды cat и перенаправления вывода оболочки. Далее вы узнаете, как клиент Hadoop находит HDFS и как связаны хранение и вычисления.