4.1 Основы Hadoop. HDFS Flashcards
HDFS
(Hadoop Distributed File System) — это распределенная файловая система для хранения файлов больших размеров с возможностью потокового доступа к информации, поблочно распределённой по узлам вычислительного кластера, который может состоять из произвольного аппаратного обеспечения. Как и любая файловая система, HDFS это иерархия каталогов с вложенными в них подкаталогами и файлами.
Архитектура HDFS (компоненты)
1) Управляющий узел, узел имен или сервер имен (NameNode)
2) Secondary NameNode — вторичный узел имен
3) Узел или сервер данных (DataNode, Node)
4) Клиент (client)
NameNode
Управляющий узел, узел имен или сервер имен (NameNode) – отдельный, единственный в кластере сервер с программным кодом для управления пространством имен файловой системы, хранящий дерево файлов, а также мета-данные файлов и каталогов. NameNode – обязательный компонент кластера HDFS, который отвечает за открытие и закрытие файлов, создание и удаление каталогов, управление доступом со стороны внешних клиентов и соответствие между файлами и блоками, дублированными (реплицированными) на узлах данных. Сервер имён раскрывает для всех желающих расположение блоков данных на машинах кластера.
Secondary NameNode
Вторичный узел имен, отдельный сервер, единственный в кластере, который копирует образ HDFS и лог транзакций операций с файловыми блоками во временную папку, применяет изменения, накопленные в логе транзакций к образу HDFS, а также записывает его на узел NameNode и очищает лог транзакций. Secondary NameNode необходим для быстрого ручного восстановления NameNode в случае его выхода из строя.
DataNode
Узел или сервер данных – один их множества серверов кластера с программным кодом, отвечающим за файловые операции и работу с блоками данных. DataNode – обязательный компонент кластера HDFS, который отвечает за запись и чтение данных, выполнение команд от узла NameNode по созданию, удалению и репликации блоков, а также периодическую отправку сообщения о состоянии (heartbeats) и обработку запросов на чтение и запись, поступающих от клиентов файловой системы HDFS. Стоит отметить, что данные проходят с остальных узлов кластера к клиенту мимо узла NameNode.
Клиент (client)
Пользователь или приложение, взаимодействующий через специальный интерфейс (API – Application Programming Interface) с распределенной файловой системой. При наличии достаточных прав, клиенту разрешены следующие операции с файлами и каталогами: создание, удаление, чтение, запись, переименование и перемещение.
Репликация, replication factor
Создавая файл, клиент может явно указать размер блока файла (по умолчанию 64 Мб) и количество создаваемых реплик (replication factor). Репликация — это избыточность хранения информации, которая позволяет нам потерять одну или несколько о копий. По умолчанию все HDFS-блоки реплицируются 3 раза (replication factor - 3), если клиентом (пользователем или приложением) не задано другое значение коэффициента репликации. С целью повышения надежности для хранения 2-ой и 3-ей реплики выбираются те узлы данных, которые расположены в разных серверных стойках. Последующие реплики могут храниться на любых серверах.
В каких случаях выполняется репликация данных в HDFS?
- создание нового файла (операция записи);
- обнаружение сервером имен отказа одного из узлов данных – если NameNode не получает от DataNode heartbeat-сообщений, он запускает механизм репликации;
- повреждение существующих реплик;
- увеличение количества реплик, присущих каждому блоку.
Процесс выполнения репликации?
Репликация данных выполняется следующим образом:
1) NameNode выбирает новые узлов данных для размещения реплик;
сервер имен выполняет балансировку размещения данных по узлам и составляет список узлов для репликации;
2) 1-я реплика размещается на первом узле из списка;
3) 2-я реплика копируется на другой узел в этой же серверной стойке;
4) 3-я реплика записывается на произвольный узел в другой серверной стойке;
5) остальные реплики размещаются произвольным способом.
Проблема мелких файлов
Наличие большого количества файлов/блоков, приводит к тому, что количество объектов, которые хранятся в памяти увеличиваются в разы. Рассмотрим несколько вариантов хранения файлов.
Вариант 1. Размер файла 1 Гб, размер блока 1 Гб
Для описания метаинформации о файле в первом случае нам нужно иметь 3 объекта:
Файл — 1 шт.
Блок — 1 шт.
Массив, который хранит информацию о блоках этого файла — 1 шт.
Вариант 2. Размер файла 1 Гб, размер блока 1 Мб
Если мы уменьшим размер блока, во втором случае нам нужно уже иметь 1002 объекта:
Файл - 1 шт.
Блок - 1000 шт.
Массив, который хранит информацию о блоках этого файла - 1 шт.
Вариант 3. 1000 файлов по 1 Мб, размер блока 1 Мб
Теперь представим, что размер блока остался с прошлого примера, а файл мы разбили по частям. В таком случае нам нужно 3000 объектов:
Файл — 1000 шт.
Блок — 1000 шт.
Массив, который хранит информацию о блоках этого файла — 1000 шт.
Вывод: большое количество объектов загружает оперативную память NameNode, но использовать 1 блок для 1 большого файла тоже не целесообразно, так как увеличивается нагрузка на сеть, потому что чтобы найти маленькие данные нужно читать полностью большой блок файла
Процесс чтения клиентом
Клиент HDFS через специальный интерфейс Distributed Filesystem запрашивает у NameNode какой-либо файл. NameNode проверяет существует ли этот файл, его права доступа и т.п. Далее если все проверки были успешны - выдает клиенту информацию о файле (где он находится, из каких блоков состоит). Потом клиент самостоятельно используя интерфейс FSData InputStream идет на каждую конкретную DataNode из выданного списка, которого ему вадала NameNode и выкачивает нужную ему информацию.
Важно отметить, что основной трафик идет между клиентом и конкретными DataNode, а не через NameNode.
Процесс записи файла клиентом
1) Клиент инициирует запрос для записи файла к NameNode.
2) NameNode проверяет, существует ли файл и есть ли у клиента права для записи, и в случае успеха создает запись для файла.
3) Клиент делит файл на несколько пакетов в соответствии с размером блока и управляет ими в форме «очереди данных» и получает количество репликаций блока.
4) Запишите пакеты для всех репликаций в форме конвейера, сначала запишите в первый DataNode.После того, как DataNode сохранит пакеты, передайте их следующему DataNode в конвейере до последнего DataNode (конвейерная форма).
5) После успешного сохранения последнего DataNode он вернет подтверждение и передаст его клиенту в конвейере.
6) Если DataNode выходит из строя во время передачи, текущий конвейер будет остановлен, отказавший DataNode будет удален, а оставшиеся DataNode будут по-прежнему передаваться в форме конвейера.
7) После того, как клиент заканчивает запись данных, он вызывает метод close (), чтобы закрыть поток данных.
Хранение данных NameNode (основные группы файлов, которые хранятся в NameNode)
- VERSION: информация о версии HDFS
- edits: журнал изменений
- fsimage: контрольная точка метаданных
- fstime: время создания контрольной точки
Процесс обновления fsimage в NameNode
Secondary NameNode не является репликой NameNode. Состояние файловой системы хранится непосредственно в файле fsimage и в лог файле edits, содержащим последние изменения файловой системы (похоже на лог транзакций в мире РСУБД). Работа Secondary NameNode заключается в поддержании актуальности её собственного fsimage и периодическом мерже fsimage и edits — Secondary NameNode поддерживает размер edits в разумных пределах.
Основные команды CLI
Команда Пример
appendToFile hdfs dfs -appendToFile localfile /user/hadoop/hadoopfile
cat hdfs dfs -cat hdfs://nn1.example.com/file1
copyFromLocal hdfs dfs -copyFromLocal localfile /user/hadoop/data/
copyToLocal hdfs dfs -copyToLocal localfile /tmp/data/ localfile
cp hdfs dfs -cp [-f] [-p | -p[topax]] URI [URI …] <dest>
du hdfs dfs -du -s /tmp/test.data
expunge hdfs dfs -expunge
get hdfs dfs -get /user/hadoop/file localfile
getmerge hdfs dfs -getmerge <src> <localdst> [addnl]
ls hdfs dfs -ls /user/hadoop/file1
mkdir hdfs dfs -mkdir /user/hadoop/dir1 /user/hadoop/dir2
mv hdfs dfs -mv /user/hadoop/file1 /user/hadoop/file2
put hdfs dfs -put localfile /user/hadoop/hadoopfile
rm hdfs dfs -rm [-f] [-r|-R] [-skipTrash] URI [URI ...]
tail hdfs dfs -tail pathname
setrep hdfs dfs -setrep [-R] [-w] <numReplicas> <path></path></numReplicas></localdst></src></dest>