Учебное пособие по HDFS: Archiтектура, чтение и запись Operaиспользование Java API

Что такое HDFS?

HDFS — это распределенная файловая система для хранения очень больших файлов данных, работающая на кластерах обычного оборудования. Он отказоустойчив, масштабируем и чрезвычайно прост в расширении. Hadoop поставляется в комплекте с HDFS (Распределенные файловые системы Hadoop).

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

HDFS Archiтекстура

Кластер HDFS в основном состоит из Имя Узел который управляет файловой системой Метаданные и еще один Узлы данных что хранит фактические данные.

  • Имя Узел: NameNode можно рассматривать как хозяина системы. Он поддерживает дерево файловой системы и метаданные для всех файлов и каталогов, присутствующих в системе. Два файла «Изображение пространства имен» и 'редактировать журнал' используются для хранения метаданных. Namenode знает обо всех узлах данных, содержащих блоки данных для данного файла, однако он не сохраняет местоположения блоков постоянно. Эта информация каждый раз восстанавливается из узлов данных при запуске системы.
  • Узел данных: DataNodes — это подчиненные устройства, которые расположены на каждой машине в кластере и обеспечивают фактическое хранилище. Он отвечает за обслуживание, чтение и запись запросов клиентов.

Операции чтения/записи в HDFS выполняются на уровне блоков. Файлы данных в HDFS разбиваются на блоки размером с блок, которые хранятся как независимые единицы. Размер блока по умолчанию составляет 64 МБ.

HDFS работает на основе концепции репликации данных, при которой создаются несколько реплик блоков данных и распределяются по узлам кластера, чтобы обеспечить высокую доступность данных в случае сбоя узла.

Знаете ли вы? Файл в HDFS, размер которого меньше одного блока, не занимает всю память блока.

Читать Operaция в HDFS

Запрос на чтение данных обслуживается HDFS, NameNode и DataNode. Назовем читателя «клиентом». На диаграмме ниже показана операция чтения файла в Hadoop.

Читать Operaция в HDFS

  1. Клиент инициирует запрос на чтение, вызывая 'открыть()' метод объекта FileSystem; это объект типа распределенная файловая система.
  2. Этот объект подключается к namenode с помощью RPC и получает информацию о метаданных, например расположение блоков файла. Обратите внимание, что эти адреса относятся к первым нескольким блокам файла.
  3. В ответ на этот запрос метаданных адреса DataNodes, имеющие копию этого блока, возвращаются обратно.
  4. После получения адресов DataNodes создается объект типа Фсдатаинпутстрим возвращается клиенту. Фсдатаинпутстрим содержит Дфсинпутстрим который заботится о взаимодействии с DataNode и NameNode. На шаге 4, показанном на диаграмме выше, клиент вызывает 'читать()' метод, который вызывает Дфсинпутстрим установить соединение с первым DataNode с первым блоком файла.
  5. Данные считываются в виде потоков, в которых клиент вызывает 'читать()' метод неоднократно. Этот процесс читать() операция продолжается до тех пор, пока не достигнет конца блока.
  6. Как только конец блока достигнут, DFSInputStream закрывает соединение и переходит к поиску следующего узла данных для следующего блока.
  7. Как только клиент закончил чтение, он вызывает близкий() метод.

Написать Operaция в HDFS

В этом разделе мы поймем, как данные записываются в HDFS через файлы.

Написать Operaция в HDFS

  1. Клиент инициирует операцию записи, вызывая метод create() объекта DistributedFileSystem, который создает новый файл – шаг №. 1 на схеме выше.
  2. Объект DistributedFileSystem подключается к NameNode с помощью вызова RPC и инициирует создание нового файла. Однако эта операция создания файла не связывает с файлом какие-либо блоки. NameNode несет ответственность за проверку того, что файл (который создается) еще не существует и что клиент имеет правильные разрешения на создание нового файла. Если файл уже существует или у клиента недостаточно прав для создания нового файла, то Исключение IO передается клиенту. В противном случае операция завершается успешно, и NameNode создает новую запись для файла.
  3. После создания новой записи в NameNode клиенту возвращается объект типа FSDataOutputStream. Клиент использует его для записи данных в HDFS. Вызывается метод записи данных (шаг 3 на схеме).
  4. FSDataOutputStream содержит объект DFSOutputStream, который обеспечивает связь с DataNodes и NameNode. Пока клиент продолжает записывать данные, ДФСаутпутстрим продолжает создавать пакеты с этими данными. Эти пакеты помещаются в очередь, которая называется Очередь данных.
  5. Есть еще один компонент под названием DataStreamer который потребляет это Очередь данных. DataStreamer также запрашивает у NameNode выделение новых блоков, тем самым выбирая желаемые узлы данных, которые будут использоваться для репликации.
  6. Теперь процесс репликации начинается с создания конвейера с использованием DataNodes. В нашем случае мы выбрали уровень репликации 3, и, следовательно, в конвейере есть 3 узла данных.
  7. DataStreamer передает пакеты в первый DataNode в конвейере.
  8. Каждый DataNode в конвейере сохраняет полученный им пакет и пересылает его второму DataNode в конвейере.
  9. Другая очередь, «Очередь подтверждения», поддерживается DFSOutputStream для хранения пакетов, ожидающих подтверждения от DataNodes.
  10. Как только подтверждение приема пакета в очереди получено от всех узлов данных в конвейере, он удаляется из «Очереди подтверждений». В случае сбоя DataNode пакеты из этой очереди используются для повторного запуска операции.
  11. После того, как клиент завершил запись данных, он вызывает метод close() (шаг 9 на диаграмме). Вызов close() приводит к сбрасыванию оставшихся пакетов данных в конвейер с последующим ожиданием подтверждения.
  12. После получения окончательного подтверждения с NameNode связываются, чтобы сообщить ему, что операция записи файла завершена.

Доступ к HDFS с помощью JAVA API

В этом разделе мы пытаемся разобраться Java интерфейс, используемый для доступа к файловой системе Hadoop.

Для программного взаимодействия с файловой системой Hadoop Hadoop предоставляет несколько классов JAVA. Пакет с именем org.apache.hadoop.fs содержит классы, полезные для манипулирования файлами в файловой системе Hadoop. К этим операциям относятся открытие, чтение, запись и закрытие. На самом деле файловый API для Hadoop является универсальным и может быть расширен для взаимодействия с другими файловыми системами, кроме HDFS.

Чтение файла из HDFS программно

Объект java.net.URL используется для чтения содержимого файла. Для начала нам нужно сделать Java распознать схему URL-адресов hdfs Hadoop. Это делается путем вызова 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' чтобы получить подробную справку по каждой команде. Здесь, 'дфс' — это команда оболочки HDFS, которая поддерживает несколько подкоманд.

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

1. Скопируйте файл из локальной файловой системы в HDFS.

$HADOOP_HOME/bin/hdfs dfs -copyFromLocal temp.txt /

Доступ к HDFS с использованием ИНТЕРФЕЙСА КОМАНДНОЙ СТРОКИ

Эта команда копирует файл temp.txt из локальной файловой системы в HDFS.

2. Мы можем перечислить файлы, присутствующие в каталоге, используя -ls

$HADOOP_HOME/bin/hdfs dfs -ls /

Доступ к HDFS с использованием ИНТЕРФЕЙСА КОМАНДНОЙ СТРОКИ

Мы видим файл 'temp.txt' (скопировано ранее) находится в списке '/' каталог.

3. Команда копирования файла в локальную файловую систему из HDFS.

$HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt

Доступ к HDFS с использованием ИНТЕРФЕЙСА КОМАНДНОЙ СТРОКИ

Мы можем увидеть темп.txt скопирован в локальную файловую систему.

4. Команда создания нового каталога

$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory

Доступ к HDFS с использованием ИНТЕРФЕЙСА КОМАНДНОЙ СТРОКИ

Проверьте, создан ли каталог или нет. Теперь вы должны знать, как это сделать 😉