Что такое HDFS?
HDFS - это распределенная файловая система для хранения очень больших файлов данных, работающая на кластерах стандартного оборудования. Это отказоустойчивый, масштабируемый и чрезвычайно простой в расширении. Hadoop поставляется в комплекте с HDFS ( распределенными файловыми системами Hadoop ).
Когда данные превышают емкость хранилища на одной физической машине, становится важным разделить их между несколькими отдельными машинами. Файловая система, которая управляет определенными операциями хранения в сети машин, называется распределенной файловой системой. HDFS - одно из таких программ.
В этом уроке мы узнаем,
- Что такое HDFS?
- Архитектура HDFS
- Читать операцию
- Запись Операция
- Доступ к HDFS с помощью JAVA API
- Доступ к HDFS с помощью ИНТЕРФЕЙСА КОМАНДНОЙ СТРОКИ
Архитектура HDFS
Кластер HDFS в основном состоит из NameNode, который управляет метаданными файловой системы, и DataNode, в котором хранятся фактические данные .
- NameNode: NameNode можно рассматривать как хозяин системы. Он поддерживает дерево файловой системы и метаданные для всех файлов и каталогов, имеющихся в системе. Два файла «Изображение пространства имен» и «журнал редактирования» используются для хранения информации метаданных. Namenode знает обо всех узлах данных, содержащих блоки данных для данного файла, однако он не хранит местоположения блоков постоянно. Эта информация восстанавливается каждый раз с узлов данных при запуске системы.
- DataNode: DataNodes - это подчиненные устройства, которые находятся на каждой машине в кластере и обеспечивают фактическое хранилище. Он отвечает за обслуживание, чтение и запись запросов для клиентов.
Операции чтения / записи в HDFS работают на уровне блоков. Файлы данных в HDFS разбиты на блоки размером с блок, которые хранятся как независимые единицы. Размер блока по умолчанию - 64 МБ.
HDFS работает на основе концепции репликации данных, в которой создаются несколько реплик блоков данных, которые распределяются по узлам в кластере, чтобы обеспечить высокую доступность данных в случае отказа узла.
Вы знаете? Файл в HDFS, который меньше одного блока, не занимает всего хранилища блока.
Операция чтения в HDFS
Запрос на чтение данных обслуживается HDFS, NameNode и DataNode. Назовем читателя «клиентом». На диаграмме ниже изображена операция чтения файла в Hadoop.
- Клиент инициирует запрос на чтение, вызывая метод open () объекта FileSystem; это объект типа DistributedFileSystem .
- Этот объект подключается к namenode с помощью RPC и получает информацию метаданных, такую как расположение блоков файла. Обратите внимание, что это адреса первых нескольких блоков файла.
- В ответ на этот запрос метаданных, адреса узлов данных, у которых есть копия этого блока, возвращаются обратно.
- После получения адресов DataNodes клиенту возвращается объект типа FSDataInputStream . FSDataInputStream содержит DFSInputStream, который заботится о взаимодействии с DataNode и NameNode. На шаге 4, показанном на приведенной выше диаграмме, клиент вызывает метод read (), который заставляет DFSInputStream установить соединение с первым DataNode с первым блоком файла.
- Данные читаются в виде потоков, в которых клиент повторно вызывает метод read () . Этот процесс операции read () продолжается до конца блока.
- По достижении конца блока DFSInputStream закрывает соединение и переходит к поиску следующего DataNode для следующего блока.
- После того, как клиент завершил чтение, он вызывает метод close () .
Операция записи в HDFS
В этом разделе мы поймем, как данные записываются в HDFS через файлы.
- Клиент инициирует операцию записи, вызывая метод create () объекта DistributedFileSystem, который создает новый файл - Шаг №. 1 на диаграмме выше.
- Объект DistributedFileSystem подключается к NameNode с помощью вызова RPC и инициирует создание нового файла. Однако этот файл создает операцию, не связывая никаких блоков с файлом. NameNode несет ответственность за проверку того, что файл (который создается) еще не существует, и что у клиента есть правильные разрешения для создания нового файла. Если файл уже существует или у клиента нет достаточных разрешений для создания нового файла, клиенту выдается исключение IOException . В противном случае операция завершается успешно, и NameNode создает новую запись для файла.
- После создания новой записи в NameNode клиенту возвращается объект типа FSDataOutputStream. Клиент использует его для записи данных в HDFS. Вызывается метод записи данных (шаг 3 на схеме).
- FSDataOutputStream содержит объект DFSOutputStream, который обеспечивает связь с DataNodes и NameNode. Пока клиент продолжает запись данных, DFSOutputStream продолжает создавать пакеты с этими данными. Эти пакеты помещаются в очередь, которая называется DataQueue .
- Есть еще один компонент, называемый DataStreamer, который использует этот DataQueue . DataStreamer также запрашивает у NameNode выделение новых блоков, тем самым выбирая желаемые DataNodes, которые будут использоваться для репликации.
- Теперь процесс репликации начинается с создания конвейера с использованием узлов данных. В нашем случае мы выбрали уровень репликации 3 и, следовательно, в конвейере есть 3 узла данных.
- DataStreamer перенаправляет пакеты в первый DataNode в конвейере.
- Каждый DataNode в конвейере хранит принятый им пакет и пересылает его второму DataNode в конвейере.
- Другая очередь, Ack Queue, поддерживается DFSOutputStream для хранения пакетов, ожидающих подтверждения от DataNodes.
- Как только подтверждение для пакета в очереди получено от всех узлов данных в конвейере, он удаляется из «очереди подтверждения». В случае сбоя любого узла данных пакеты из этой очереди используются для повторного запуска операции.
- После того, как клиент завершил запись данных, он вызывает метод close () (шаг 9 на схеме). Call to close () приводит к сбросу оставшихся пакетов данных в конвейер с последующим ожиданием подтверждения.
- После получения окончательного подтверждения к NameNode связываются, чтобы сообщить ему, что операция записи файла завершена.
Доступ к HDFS с помощью JAVA API
В этом разделе мы пытаемся понять интерфейс Java, используемый для доступа к файловой системе Hadoop.
Для программного взаимодействия с файловой системой Hadoop Hadoop предоставляет несколько классов JAVA. Пакет с именем org.apache.hadoop.fs содержит классы, полезные для работы с файлом в файловой системе Hadoop. Эти операции включают открытие, чтение, запись и закрытие. Фактически, файловый API для Hadoop является универсальным и может быть расширен для взаимодействия с другими файловыми системами, отличными от HDFS.
Чтение файла из HDFS программным способом
Объект java.net.URL используется для чтения содержимого файла. Для начала нам нужно заставить Java распознавать URL-схему Hadoop hdfs. Это делается путем вызова метода setURLStreamHandlerFactory для объекта URL и передачи ему экземпляра FsUrlStreamHandlerFactory. Этот метод необходимо выполнять только один раз для каждой JVM, поэтому он заключен в статический блок.
Пример кода -
public class URLCat {static {URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());}public static void main(String[] args) throws Exception {InputStream in = null;try {in = new URL(args[0]).openStream();IOUtils.copyBytes(in, System.out, 4096, false);} finally {IOUtils.closeStream(in);}}}
Этот код открывает и читает содержимое файла. Путь к этому файлу в HDFS передается программе в качестве аргумента командной строки.
Доступ к HDFS с помощью ИНТЕРФЕЙСА КОМАНДНОЙ СТРОКИ
Это один из самых простых способов взаимодействия с HDFS. Интерфейс командной строки поддерживает такие операции файловой системы, как чтение файла, создание каталогов, перемещение файлов, удаление данных и перечисление каталогов.
Мы можем запустить $ HADOOP_HOME / bin / hdfs dfs -help, чтобы получить подробную справку по каждой команде. Здесь dfs - это команда оболочки HDFS, которая поддерживает несколько подкоманд.
Некоторые из широко используемых команд перечислены ниже вместе с некоторыми подробностями о каждой из них.
1. Скопируйте файл из локальной файловой системы в HDFS.
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal temp.txt /
Эта команда копирует файл temp.txt из локальной файловой системы в HDFS.
2. Мы можем перечислить файлы, присутствующие в каталоге, используя -ls
$HADOOP_HOME/bin/hdfs dfs -ls /
Мы можем увидеть файл «temp.txt» (скопировано ранее) , которые перечислены под «/» директории.
3. Команда для копирования файла в локальную файловую систему из HDFS.
$HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt
Мы видим, что temp.txt скопирован в локальную файловую систему.
4. Команда для создания нового каталога
$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory
Проверьте, создан ли каталог. Теперь вы должны знать, как это сделать ;-)