Урок за HDFS: Архитектура, четене и усилвател; Пишете операция с помощта на Java API

Съдържание:

Anonim

Какво е HDFS?

HDFS е разпределена файлова система за съхраняване на много големи файлове с данни, работеща на клъстери на стоковия хардуер. Той е устойчив на повреди, мащабируем и изключително лесен за разширяване. Hadoop се доставя в комплект с HDFS ( Hadoop Distributed File Systems ).

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

В този урок ще научим,

  • Какво е HDFS?
  • HDFS архитектура
  • Прочетете Операция
  • Пишете операция
  • Достъп до HDFS с помощта на JAVA API
  • Достъп до HDFS с помощта на COMMAND-LINE INTERFACE

HDFS архитектура

HDFS клъстерът се състои предимно от NameNode, който управлява файловата система Метаданни и DataNodes, който съхранява действителните данни .

  • NameNode: NameNode може да се разглежда като главен на системата. Той поддържа дървото на файловата система и метаданните за всички файлове и директории, присъстващи в системата. Два файла 'Imagepace image' и 'log log' се използват за съхраняване на информация за метаданни. Namenode има познания за всички възли на данни, съдържащи блокове с данни за даден файл, но не съхранява постоянно местоположенията на блокове. Тази информация се реконструира всеки път от възлите на данни при стартиране на системата.
  • DataNode: DataNodes са подчинени устройства, които се намират на всяка машина в клъстер и осигуряват действителното съхранение. Той отговаря за обслужването, четенето и писането на заявки за клиентите.

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

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

Знаеш ли? Файл в HDFS, който е по-малък от единичен блок, не заема пълното хранилище на даден блок.

Прочетете операция в HDFS

Искането за четене на данни се обслужва от HDFS, NameNode и DataNode. Нека наречем читателя като „клиент“. По-долу диаграмата изобразява операцията за четене на файлове в Hadoop.

  1. Клиентът инициира заявка за четене, като извика метода 'open ()' на обекта FileSystem; това е обект от тип DistributedFileSystem .
  2. Този обект се свързва с namenode с помощта на RPC и получава информация за метаданни, като местоположението на блоковете на файла. Моля, обърнете внимание, че тези адреси са от първите няколко блока на файл.
  3. В отговор на тази заявка за метаданни адресите на DataNodes с копие на този блок се връщат обратно.
  4. След като се получат адреси на DataNodes, обект от тип FSDataInputStream се връща на клиента. FSDataInputStream съдържа DFSInputStream, който се грижи за взаимодействията с DataNode и NameNode. В стъпка 4, показана в горната диаграма, клиент извиква метод 'read ()' , който кара DFSInputStream да установи връзка с първия DataNode с първия блок на файл.
  5. Данните се четат под формата на потоци, при които клиентът извиква многократно метода 'read ()' . Този процес на операция read () продължава, докато достигне края на блока.
  6. След като се стигне до края на блок, DFSInputStream затваря връзката и продължава, за да намери следващия DataNode за следващия блок
  7. След като клиентът приключи с четенето, той извиква метод close () .

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

В този раздел ще разберем как данните се записват в HDFS чрез файлове.

  1. Клиентът инициира операция за запис чрез извикване на метод 'create ()' на обект DistributedFileSystem, който създава нов файл - Стъпка №. 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 DataNodes в конвейера.
  7. DataStreamer излива пакети в първия DataNode в конвейера.
  8. Всеки DataNode в конвейер съхранява пакета, получен от него, и го препраща към втория DataNode в конвейер.
  9. Друга опашка „Ack Queue“ се поддържа от DFSOutputStream за съхраняване на пакети, които чакат потвърждение от DataNodes.
  10. След като потвърждението за пакет в опашката е получено от всички DataNodes в конвейера, то се премахва от „Ack Queue“. В случай на неуспех на DataNode, пакетите от тази опашка се използват за повторно иницииране на операцията.
  11. След като клиентът приключи с записването на данни, той извиква метод close () (Стъпка 9 на диаграмата) Извикване за затваряне (), води до изчистване на останалите пакети данни към конвейера, последвано от изчакване на потвърждение.
  12. След като бъде получено окончателно потвърждение, NameNode се свързва, за да му каже, че операцията по запис на файл е завършена.

Достъп до HDFS с помощта на JAVA API

В този раздел се опитваме да разберем интерфейса на Java, използван за достъп до файловата система на Hadoop.

За да взаимодейства програмно с файловата система на Hadoop, Hadoop предоставя множество класове JAVA. Пакетът с име org.apache.hadoop.fs съдържа класове, полезни при манипулиране на файл във файловата система на Hadoop. Тези операции включват, отваряне, четене, записване и затваряне. Всъщност файловият API за Hadoop е общ и може да бъде разширен, за да взаимодейства с други файлови системи, различни от HDFS.

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

Обектът java.net.URL се използва за четене на съдържание на файл. Като начало трябва да накараме Java да разпознае схемата на Hadoop за URL на 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 с помощта на COMMAND-LINE INTERFACE

Това е един от най-простите начини за взаимодействие с 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

Проверете дали е създадена директория или не. Сега трябва да знаете как да го направите ;-)