Проследите хранение файла в блоках HDFS

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

Введение

У файлов розничной компании есть имена и каталоги, но машины должны где-то хранить и их содержимое. Как один большой файл можно распределить между узлами хранения? Что именно копирует HDFS при создании реплики и занимает ли почти пустой блок на диске место, равное полному размеру блока?

Вы уже умеете организовывать и сохранять файлы. В этой работе вы заглянете глубже их путей. Блок HDFS — часть файла, которую HDFS учитывает и хранит. NameNode хранит метаданные о файлах и расположении блоков; DataNode хранят данные блоков. Реплика — ещё одна сохранённая копия блока, а не новая запись о товаре или дополнительный файл, видимый пользователю.

Вы загрузите два подготовленных файла с намеренно небольшим допустимым размером блока, предположите число блоков и изучите их реальное расположение. В этой среде с одним DataNode используется коэффициент репликации 1. Она позволяет получить реальные наблюдения, но не демонстрирует восстановление на нескольких машинах. Все данные и службы подготовлены независимо. Используйте терминал; программирование не нужно.

Свяжите размер файла с блоками

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

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

Начните в каталоге проекта:

cd /home/labex/project

Локальная команда wc -c считает байты. Примените её к первому подготовленному файлу:

wc -c /home/labex/project/data/products-a.txt

Результат начинается с 1572864: ровно 1,5 МиБ. Один МиБ (MiB) равен 1 048 576 байтам. В файле повторяется простое обозначение товара, поэтому эксперимент с хранением не требует сложных бизнес-правил.

Создайте личный каталог HDFS:

hdfs dfs -mkdir -p /user/labex/block-study

Для этой демонстрации -Ddfs.blocksize=1048576 переопределяет настройку размера блока клиента для следующей загрузки. -D задаёт свойство конфигурации для этой команды; общие файлы конфигурации не изменяются. Один МиБ удовлетворяет минимальному ограничению размера блока в этом образе и сохраняет небольшой масштаб демонстрации:

hdfs dfs -Ddfs.blocksize=1048576 -put /home/labex/project/data/products-a.txt /user/labex/block-study/products-a.txt

Предположите структуру: для 1,5 МиБ при размере блока 1 МиБ нужен один полный и один наполовину заполненный блок, всего два блока.

Операция HDFS -stat выводит выбранные метаданные. В формате в кавычках %b означает длину файла в байтах, %o — размер блока, а %r — коэффициент репликации:

hdfs dfs -stat 'bytes=%b blocksize=%o replication=%r' /user/labex/block-study/products-a.txt

Ожидаемые значения:

bytes=1572864 blocksize=1048576 replication=1

Длина файла по-прежнему равна 1,5 МиБ. Коэффициент репликации 1 означает одну сохранённую копию каждого блока, а не один блок на весь файл. Сохраните фактические метаданные:

hdfs dfs -stat 'bytes=%b blocksize=%o replication=%r' /user/labex/block-study/products-a.txt > /home/labex/project/output/file-a-metadata.txt

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

Изучите расположение и предположите результат изменения

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

Команда hdfs fsck позволяет изучить состояние хранения файла. При следующем просмотре только для чтения -files включает сведения о файлах, -blocks — сведения о блоках, а -locations — DataNode, хранящие каждый блок. Ни один из этих параметров не исправляет и не удаляет файлы:

hdfs fsck /user/labex/block-study/products-a.txt -files -blocks -locations

Найдите строку длины файла, записи блоков и поле итогов Total blocks (validated). Блоков должно быть два. Один содержит 1 048 576 байт, другой — 524 288 байт. Идентификаторы блоков, адреса и временные метки различаются. Итоговая сводка состояния файловой системы должна содержать HEALTHY.

Сохраните результаты просмотра:

hdfs fsck /user/labex/block-study/products-a.txt -files -blocks -locations > /home/labex/project/output/file-a-blocks.txt

Исправное состояние означает, что эта проверка нашла необходимые блоки и реплики. При одной реплике каждого блока на одной машине это не означает, что файл сохранится при потере этой машины.

Теперь изучите размер второго локального файла:

wc -c /home/labex/project/data/products-b.txt

Его длина — 2621440 байт, или 2,5 МиБ. Перед загрузкой предположите число и размеры его блоков при том же размере блока 1 МиБ. Меняется только длина файла:

hdfs dfs -Ddfs.blocksize=1048576 -put /home/labex/project/data/products-b.txt /user/labex/block-study/products-b.txt

Изучите результат:

hdfs fsck /user/labex/block-study/products-b.txt -files -blocks -locations

Вы должны найти три блока: два полных и один размером 524 288 байт. В этой работе все расположения относятся к одному DataNode. Сохраните наблюдение:

hdfs fsck /user/labex/block-study/products-b.txt -files -blocks -locations > /home/labex/project/output/file-b-blocks.txt

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

Объясните занимаемое место, реплики и путь данных

На этом шаге вы свяжете наблюдения о блоках с размером файла и фактическим отчётом об узле хранения.

Наполовину заполненный последний блок не резервирует целый МиБ места для данных лишь потому, что размер блока настроен на 1 МиБ. Используйте -du без -h, чтобы видеть точные значения в байтах:

hdfs dfs -du /user/labex/block-study

Первые два столбца для каждого файла должны выглядеть так:

1572864  1572864  .../products-a.txt
2621440  2621440  .../products-b.txt

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

hdfs dfs -du /user/labex/block-study > /home/labex/project/output/block-report.txt

Проверьте фактический отчёт об узле хранения административной командой только для чтения, изученной в работе о среде:

sudo -u hdfs /usr/local/bin/hdfs dfsadmin -report

Найдите Live datanodes (1). Установка коэффициента репликации 3 не создаст три машины; в этой работе он остаётся равным 1, чтобы блоки не ожидали недоступных реплик.

Свяжите наблюдения с путём данных:

Запись: клиент просит NameNode создать файл, затем отправляет данные блоков DataNode.
Чтение: клиент запрашивает у NameNode расположения, затем читает данные блоков с DataNode.

При наличии нескольких реплик в большом кластере клиент может использовать доступную копию, а система обработки — стараться выполнять работу рядом с данными. Эта идея называется локальностью данных. Именованная копия, созданная с помощью -cp, — второй логический файл; реплики — хранимые копии блоков внутри логического файла. Они решают разные задачи.

В упражнении с предположением вы меняли размер файла, а не коэффициент репликации. У файла A по-прежнему два блока, у B — три, и у обоих по одной реплике каждого блока. Далее вы узнаете, почему существующий исправный файл может быть недоступен для чтения конкретному пользователю: из-за прав доступа.

Итоги

Вы предположили и проверили, как файлы размером 1,5 МиБ и 2,5 МиБ делятся на два и три блока по 1 МиБ. Вы изучили реальное расположение блоков и научились отличать логическую длину файла, хранение реплик и дополнительные именованные файлы.

Вы также связали результаты с метаданными NameNode и передачей данных DataNode. Одноузловая среда иллюстрирует эти обязанности; ёмкость нескольких машин и отказоустойчивость остаются темами дальнейшего изучения.