Підручник HDFS: Архітектура, читання та підсилювач; Операція запису за допомогою Java API

Зміст:

Anonim

Що таке HDFS?

HDFS - це розподілена файлова система для зберігання дуже великих файлів даних, що працює на кластерах товарного обладнання. Він стійкий до несправностей, масштабований і надзвичайно простий у розширенні. Hadoop постачається в комплекті з HDFS ( розподіленими файловими системами Hadoop ).

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

У цьому підручнику ми дізнаємось,

  • Що таке HDFS?
  • Архітектура HDFS
  • Прочитайте операцію
  • Операція запису
  • Доступ до HDFS за допомогою API JAVA
  • Доступ до HDFS за допомогою КОМАНДНО-РЯДОВОГО ІНТЕРФЕЙСУ

Архітектура HDFS

Кластер HDFS складається насамперед із NameNode, який управляє метаданими файлової системи, та DataNodes, що зберігає фактичні дані .

  • NameNode: NameNode можна розглядати як ведучий системи. Він підтримує дерево файлової системи та метадані для всіх файлів та каталогів, присутніх у системі. Два файли "Зображення простору імен" і "Журнал редагування" використовуються для зберігання інформації про метадані. Namenode має знання про всі вузли даних, що містять блоки даних для даного файлу, однак він не зберігає постійно розташування блоків. Ця інформація відновлюється кожного разу з вузлів даних при запуску системи.
  • Вузол даних: Вузли даних - це підлеглі пристрої, які знаходяться на кожній машині в кластері та забезпечують фактичне зберігання. Він відповідає за обслуговування, читання та написання запитів для клієнтів.

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

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

Чи ти знаєш? Файл у форматі HDFS, розмір якого менше одного блоку, не займає повного сховища блоку.

Прочитайте роботу в HDFS

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

  1. Клієнт ініціює запит на читання, викликаючи метод 'open ()' об'єкта FileSystem; це об'єкт типу DistributedFileSystem .
  2. Цей об'єкт підключається до namenode за допомогою RPC і отримує інформацію про метадані, таку як розташування блоків файлу. Зверніть увагу, що ці адреси є першими кількома блоками файлу.
  3. У відповідь на цей запит на метадані адреси вузлів даних, що мають копію цього блоку, повертаються назад.
  4. Після отримання адрес DataNodes об'єкт типу FSDataInputStream повертається клієнту. FSDataInputStream містить DFSInputStream, який піклується про взаємодію з DataNode та NameNode. На кроці 4, показаному на наведеній вище схемі, клієнт викликає метод 'read ()', що змушує DFSInputStream встановити з'єднання з першим вузлом даних з першим блоком файлу.
  5. Дані зчитуються у формі потоків, де клієнт неодноразово викликає метод 'read ()' . Цей процес операції read () триває до кінця блоку.
  6. Як тільки кінець блоку досягнуто, DFSInputStream закриває з'єднання і рухається далі, щоб знайти наступний DataNode для наступного блоку
  7. Після того, як клієнт закінчив читання, він викликає метод close () .

Операція запису в HDFS

У цьому розділі ми зрозуміємо, як дані записуються у HDFS через файли.

  1. Клієнт ініціює операцію запису, викликаючи метод 'create ()' об'єкта DistributedFileSystem, який створює новий файл - Крок No. 1 на наведеній вище схемі.
  2. Об'єкт DistributedFileSystem підключається до NameNode за допомогою виклику RPC та ініціює створення нового файлу. Однак цей файл створює операцію, не пов'язану з ним файлами. Обов'язок NameNode - перевірити, що файл (який створюється) ще не існує, а клієнт має правильні дозволи на створення нового файлу. Якщо файл уже існує або клієнт не має достатнього дозволу на створення нового файлу, IOException передається клієнту. В іншому випадку операція вдається, і NameNode створює новий запис для файлу.
  3. Після створення нового запису в NameNode об’єкт типу FSDataOutputStream повертається клієнту. Клієнт використовує його для запису даних у HDFS. Викликається метод запису даних (крок 3 на схемі).
  4. FSDataOutputStream містить об'єкт DFSOutputStream, який контролює зв'язок з DataNodes та NameNode. Поки клієнт продовжує записувати дані, DFSOutputStream продовжує створювати пакети з цими даними. Ці пакети потрапляють у чергу в чергу, яка називається DataQueue .
  5. Існує ще один компонент , званий DataStreamer , який споживає цей DataQueue . DataStreamer також просить NameNode виділити нові блоки, тим самим вибираючи бажані DataNodes, які будуть використовуватися для реплікації.
  6. Тепер процес реплікації починається зі створення конвеєру за допомогою DataNodes. У нашому випадку ми вибрали рівень реплікації 3, отже, у конвеєрі є 3 Вузли даних.
  7. DataStreamer вливає пакети в перший вузол даних у конвеєрі.
  8. Кожен вузол даних у конвеєрі зберігає отриманий ним пакет і пересилає його на другий вузол даних у конвеєрі.
  9. Інша черга, "Ack Queue", підтримується DFSOutputStream для зберігання пакетів, які чекають підтвердження від DataNodes.
  10. Після отримання підтвердження для пакета в черзі від усіх вузлів даних у конвеєрі, воно видаляється з "Черги перевірки". У разі будь-якої помилки DataNode, пакети з цієї черги використовуються для відновлення операції.
  11. Після того, як клієнт закінчить запис даних, він викликає метод close () (крок 9 на схемі) Виклик close (), що призводить до змиву решти пакетів даних до конвеєру з подальшим очікуванням підтвердження.
  12. Після отримання остаточного підтвердження зв’язується з NameNode, щоб повідомити, що операція запису файлу завершена.

Доступ до HDFS за допомогою API JAVA

У цьому розділі ми намагаємося зрозуміти інтерфейс 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', щоб отримати детальну довідку щодо кожної команди. Тут '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

Перевірте, створений каталог чи ні. Тепер ви повинні знати, як це зробити ;-)