Введение
Вы умеете загружать файл в HDFS, но куда терминал его на самом деле отправил? Ежедневный файл розничной компании может находиться на ноутбуке, на текущем сервере или в общем хранилище. Чтение не той копии способно привести к совершенно корректным вычислениям над неверными данными. Прежде чем управлять большим числом файлов, нужно научиться распознавать хранилище, используемое вашими командами.
Hadoop разделяет обязанности. Hadoop Common предоставляет общие библиотеки и утилиты. HDFS хранит файлы. MapReduce описывает и выполняет задачи пакетной обработки. YARN выделяет ресурсы приложениям, в том числе заданиям MapReduce. Вы будете постепенно знакомиться с этими названиями; сегодня вы изучите хранение и конфигурацию без запуска вычислений и установки служб.
У этой работы три результата: определить файловую систему по умолчанию, доказать, что одинаковый текст пути может указывать на разные файлы, и определить работающие службы HDFS. В конце у вас будут наблюдения, полученные из собственной среды. Все учебные данные подготовлены независимо от предыдущей работы. Используйте терминал; программирование не требуется.
Определите настроенное назначение
На этом шаге вы узнаете файловую систему по умолчанию и прочитаете настройку способа выполнения MapReduce.
В терминале вы запускаете команду клиента. Клиент просит службу выполнить работу; служба может находиться на этой или другой машине. Конфигурация связывает короткую команду клиента с нужным назначением. Начните в локальном рабочем каталоге:
cd /home/labex/project
Команда hdfs getconf читает конфигурацию Hadoop. Параметр -confKey запрашивает одну настройку по имени. fs.defaultFS — файловая система по умолчанию, используемая, когда путь файловой системы Hadoop не содержит явно указанной схемы:
hdfs getconf -confKey fs.defaultFS
Ожидаемое значение:
hdfs://localhost:9000
Это URI — адрес, указывающий способ доступа к ресурсу. Здесь hdfs выбирает HDFS, localhost обозначает эту машину, а 9000 — порт подключения службы. Порт обозначает сетевую конечную точку, используемую службой. Открывать этот порт самостоятельно не требуется.
Сохраните полученное значение. Как и в первой работе, > записывает вывод команды в локальный файл, заменяя предыдущее содержимое:
hdfs getconf -confKey fs.defaultFS > /home/labex/project/output/default-filesystem.txt
Файлы конфигурации Hadoop используют XML: у свойства есть name и value. Сейчас достаточно прочитать одно свойство. grep выбирает строки с совпадающим текстом, а -A 1 включает строку сразу после совпадения:
grep -A 1 '<name>mapreduce.framework.name</name>' /etc/labex-bigdata/hadoop/mapred-site.xml
Две нужные строки:
<name>mapreduce.framework.name</name>
<value>yarn</value>
yarn означает, что приложения MapReduce настроены на использование YARN для управления ресурсами. Сама по себе эта настройка не доказывает, что приложение запущено. В этой работе запущена HDFS; вычислительные службы вы будете использовать при изучении отправки заданий.
Сохраните эти строки конфигурации как подтверждение, а не вводите ожидаемое значение вручную:
grep -A 1 '<name>mapreduce.framework.name</name>' /etc/labex-bigdata/hadoop/mapred-site.xml > /home/labex/project/output/execution-setting.txt
Для маленькой временной таблицы может хватить локальной файловой системы. Для архивов, совместно используемых заданиями Hadoop, назначение HDFS имеет значение. Выбор инструмента начинается с потребности, а не с автоматической загрузки каждого файла в Hadoop.
Прочитайте одинаковый путь в двух файловых системах
На этом шаге вы прочитаете два подготовленных файла с одинаковым текстом пути и докажете, какую файловую систему выбирает каждая команда.
Специально для этого сравнения при подготовке среды в каждой файловой системе размещён свой файл /home/labex/project/data/location.txt с разным содержимым. Это возможно, поскольку у локальной файловой системы и HDFS отдельные деревья каталогов. Обычно в курсе рабочий каталог HDFS — /user/labex; сегодня совпадающий путь помогает наглядно увидеть различие.
URI file:/// явно выбирает локальную файловую систему. Три косые черты образуются при соединении разделителя схемы с абсолютным путём. Прежде чем выполнить следующую команду, предположите, какую версию она прочитает: локальную или общую:
hdfs dfs -cat file:///home/labex/project/data/location.txt
Ожидаемый вывод:
Local store: draft product file
Хотя вы использовали клиент Hadoop, URI выбрал локальный файл. Теперь явно выберите HDFS, указав адрес службы, полученный на шаге 1:
hdfs dfs -cat hdfs://localhost:9000/home/labex/project/data/location.txt
Ожидаемый вывод:
HDFS store: shared product file
Наконец, опустите схему и адрес службы. Предположите, какую версию выберет значение по умолчанию из шага 1:
hdfs dfs -cat /home/labex/project/data/location.txt
Появляется общая версия из HDFS. Абсолютный путь определяет расположение внутри файловой системы; сам по себе он не выбирает эту систему. Обычная команда Linux cat /home/labex/project/data/location.txt по-прежнему прочитала бы локальную версию.
Сохраните три результата отдельно, чтобы сравнить свои предположения с наблюдениями:
hdfs dfs -cat file:///home/labex/project/data/location.txt > /home/labex/project/output/local-result.txt
hdfs dfs -cat hdfs://localhost:9000/home/labex/project/data/location.txt > /home/labex/project/output/hdfs-result.txt
hdfs dfs -cat /home/labex/project/data/location.txt > /home/labex/project/output/default-result.txt
Результаты явного обращения к HDFS и обращения по умолчанию должны совпадать. Используйте diff: при совпадении файлов она ничего не выводит:
diff /home/labex/project/output/hdfs-result.txt /home/labex/project/output/default-result.txt
Этот эксперимент объясняет, почему одного пути недостаточно при диагностике: проверяйте и путь, и файловую систему, которой он принадлежит.
Определите службы хранения
На этом шаге вы свяжете файловые операции с ролями NameNode и DataNode и объедините наблюдения о своей среде.
HDFS отделяет имя и сведения о расположении файла от его данных. NameNode управляет деревом каталогов и знает, какие DataNode хранят блоки файла. DataNode хранят эти блоки и передают содержимое файлов. Представьте библиотечный каталог и полки: каталог помогает найти книгу, а полки хранят её страницы.
Клиент HDFS → NameNode: запрос расположения данных файла
Клиент HDFS ↔ DataNode: передача данных файла
Блок — часть файла, которой управляет HDFS. Позже вы непосредственно изучите блоки и реплики. Пока проверьте, что службы этих двух ролей активны. systemctl is-active запрашивает у операционной системы состояние каждой указанной службы; команда только просматривает состояние:
systemctl is-active labex-hdfs-namenode labex-hdfs-datanode
Вы должны увидеть две строки active, по одной для каждой службы. Сохраните это наблюдение:
systemctl is-active labex-hdfs-namenode labex-hdfs-datanode > /home/labex/project/output/storage-services.txt
HDFS также предоставляет свой отчёт об узлах хранения. dfsadmin -report — административный отчёт только для чтения. Следующая команда использует подготовленную служебную учётную запись hdfs через sudo -u hdfs исключительно для чтения отчёта; обычную работу с файлами выполняйте от своей учётной записи labex:
sudo -u hdfs /usr/local/bin/hdfs dfsadmin -report
Найдите Live datanodes (1) и узел, у которого Decommission Status равен Normal. Ёмкость, занятое пространство, идентификаторы хоста и временные метки различаются; они не обязаны совпадать с виртуальной машиной другого учащегося. Действующий узел обменивается данными с NameNode, а Normal означает, что его не выводят из эксплуатации.
Сохраните отчёт:
sudo -u hdfs /usr/local/bin/hdfs dfsadmin -report > /home/labex/project/output/storage-report.txt
Это одноузловой псевдораспределённый режим: отдельные процессы служб Hadoop работают на одной машине. В локальном режиме программа может работать с локальными файлами без служб HDFS; в кластере из нескольких машин службы и хранилище распределены по хостам. Наличие одного DataNode здесь не демонстрирует устойчивость к отказу целой машины.
Когда позже вы отправите задание, ResourceManager в YARN выделит ресурсы, а NodeManager будет управлять работой на каждой рабочей машине. Для сегодняшнего изучения хранения запуск задания не нужен.
Составьте небольшой отчёт, объединив сохранённые наблюдения. cat принимает несколько локальных входных путей по порядку, а > сохраняет их объединённое содержимое:
cat /home/labex/project/output/default-filesystem.txt /home/labex/project/output/execution-setting.txt /home/labex/project/output/storage-services.txt /home/labex/project/output/storage-report.txt > /home/labex/project/output/environment-report.txt
Прочитайте его:
cat /home/labex/project/output/environment-report.txt
Найдите URI файловой системы, настройку yarn, состояния двух служб и число действующих узлов. Теперь у вас есть подтверждения связи команд с реальной средой. Далее вы будете управлять жизненным циклом файла в нужной файловой системе.
Итоги
Вы изучили настроенную файловую систему и способ выполнения, затем с помощью локального пути, явного пути HDFS и пути по умолчанию доказали, откуда поступают данные. Вы связали результаты с ролью NameNode в управлении метаданными и ролью DataNode в хранении, а также поняли ограничения учебной среды на одной машине.
Следующая задача — осознанно управлять входными данными: копировать, архивировать, выгружать, измерять и удалять только нужные временные файлы.



