Підручник HDFS: Archiтектура, читання та запис Operaвикористанням Java API
Що таке HDFS?
HDFS — це розподілена файлова система для зберігання дуже великих файлів даних, яка працює на кластерах звичайного обладнання. Він відмовостійкий, масштабований і надзвичайно простий у розширенні. Hadoop постачається в комплекті HDFS (Розподілені файлові системи Hadoop).
Коли дані перевищують ємність сховища на одній фізичній машині, стає важливим розділити їх на кілька окремих машин. Файлова система, яка керує специфічними операціями зберігання в мережі машин, називається розподіленою файловою системою. HDFS є одним із таких програм.
HDFS Archiтектура
Кластер HDFS в основному складається з a NameNode який керує файловою системою метадані і Вузли даних що зберігає фактичні дані.
- NameNode: NameNode можна вважати головним у системі. Він підтримує дерево файлової системи та метадані для всіх файлів і каталогів, наявних у системі. Два файли «Зображення простору імен» і 'редагувати журнал' використовуються для зберігання інформації метаданих. Namenode має відомості про всі вузли даних, що містять блоки даних для даного файлу, однак він не зберігає розташування блоків постійно. Ця інформація щоразу реконструюється з вузлів даних під час запуску системи.
- DataNode: DataNodes — це підлеглі пристрої, які знаходяться на кожній машині в кластері та забезпечують фактичне зберігання. Він відповідає за обслуговування, читання та написання запитів для клієнтів.
Операції читання/запису в HDFS працюють на рівні блоків. Файли даних у HDFS розбиваються на фрагменти розміром з блоки, які зберігаються як незалежні одиниці. Розмір блоку за замовчуванням становить 64 Мб.
HDFS працює на основі концепції реплікації даних, у якій створюється кілька копій блоків даних, які розподіляються на вузлах у кластері, щоб забезпечити високу доступність даних у разі збою вузла.
Чи знаєте ви? Файл у HDFS, менший за один блок, не займає повну пам’ять блоку.
Читати Operaв HDFS
Запит на читання даних обслуговується HDFS, NameNode і DataNode. Назвемо читача «клієнтом». На діаграмі нижче показано операцію читання файлу Hadoop.
- Клієнт ініціює запит на читання шляхом виклику 'ВІДЧИНЕНО()' метод об'єкта FileSystem; це об'єкт типу Розподілена файлова система.
- Цей об’єкт з’єднується з namenode за допомогою RPC і отримує інформацію про метадані, наприклад розташування блоків файлу. Зверніть увагу, що ці адреси є першими кількома блоками файлу.
- У відповідь на цей запит метаданих повертаються адреси DataNodes, які мають копію цього блоку.
-
Після отримання адрес DataNodes об’єкт типу FSDataInputStream повертається клієнту. FSDataInputStream містить DFSInputStream який піклується про взаємодію з DataNode і NameNode. На кроці 4, показаному на схемі вище, клієнт викликає 'read()' метод, який викликає DFSInputStream щоб встановити з'єднання з першим DataNode з першим блоком файлу.
-
Дані зчитуються у вигляді потоків, які викликає клієнт 'read()' метод повторно. Цей процес читати () операція продовжується, поки не досягне кінця блоку.
- Після досягнення кінця блоку DFSInputStream закриває з’єднання та переходить до пошуку наступного DataNode для наступного блоку
- Щойно клієнт завершив читання, він телефонує закрити () метод.
Запис Operaв HDFS
У цьому розділі ми розберемося, як дані записуються в HDFS через файли.
- Клієнт ініціює операцію запису, викликаючи метод «create()» об’єкта DistributedFileSystem, який створює новий файл – крок №. 1 на схемі вище.
- Об’єкт DistributedFileSystem підключається до NameNode за допомогою виклику RPC та ініціює створення нового файлу. Однак ця операція створення файлу не пов’язує жодні блоки з файлом. NameNode відповідає за перевірку того, що файл (який створюється) ще не існує, і клієнт має належні дозволи для створення нового файлу. Якщо файл уже існує або клієнт не має достатнього дозволу для створення нового файлу, тоді IOException кидається клієнту. В іншому випадку операція завершується успішно, і NameNode створює новий запис для файлу.
- Після створення нового запису в NameNode клієнту повертається об’єкт типу FSDataOutputStream. Клієнт використовує його для запису даних у HDFS. Викликається метод запису даних (крок 3 на схемі).
- FSDataOutputStream містить об’єкт DFSOutputStream, який забезпечує зв’язок із DataNodes і NameNode. Поки клієнт продовжує записувати дані, DFSOutputStream продовжує створювати пакети з цими даними. Ці пакети ставляться в чергу, яка називається as DataQueue.
- Є ще один компонент, який називається DataStreamer яка споживає це DataQueue. DataStreamer також запитує NameNode про виділення нових блоків, таким чином вибираючи бажані DataNodes для використання для реплікації.
- Тепер процес реплікації починається зі створення конвеєра за допомогою DataNodes. У нашому випадку ми вибрали рівень реплікації 3, тому в конвеєрі є 3 DataNodes.
- DataStreamer заливає пакети в перший DataNode у конвеєрі.
- Кожен DataNode у конвеєрі зберігає пакет, отриманий ним, і пересилає його другому DataNode у конвеєрі.
- Інша черга, «Ack Queue», підтримується DFSOutputStream для зберігання пакетів, які очікують підтвердження від DataNodes.
- Після отримання підтвердження пакета в черзі від усіх вузлів даних у конвеєрі він видаляється з «черги підтвердження». У разі будь-якої помилки DataNode пакети з цієї черги використовуються для повторного запуску операції.
- Після того, як клієнт завершив запис даних, він викликає метод close() (Крок 9 на діаграмі). Виклик close(), призводить до очищення решти пакетів даних у конвеєр з подальшим очікуванням підтвердження.
- Після отримання остаточного підтвердження з’являється 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' щоб отримати детальну довідку щодо кожної команди. тут, '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
Перевірте, чи створено каталог чи ні. Тепер ви повинні знати, як це зробити 😉