Урок за HDFS: Archiтекстура, четене и писане Operaизползване на ция Java API
Какво е HDFS?
HDFS е разпределена файлова система за съхраняване на много големи файлове с данни, работеща на клъстери от стандартен хардуер. Той е устойчив на грешки, мащабируем и изключително лесен за разширяване. Hadoop идва в комплект с HDFS (Разпределени файлови системи Hadoop).
Когато данните надхвърлят капацитета за съхранение на една физическа машина, става важно да ги разделите на няколко отделни машини. Файлова система, която управлява специфични операции за съхранение в мрежа от машини, се нарича разпределена файлова система. HDFS е един такъв софтуер.
HDFS Archiтекстура
HDFS клъстерът се състои основно от a NameNode който управлява файловата система Metadata и DataNodes който съхранява действителни данни.
- NameNode: NameNode може да се счита за главен на системата. Той поддържа дървото на файловата система и метаданните за всички файлове и директории, налични в системата. Два файла „Изображение на пространство от имена“ и "редактиране на дневник" се използват за съхраняване на информация за метаданни. Namenode познава всички възли с данни, съдържащи блокове с данни за даден файл, но не съхранява местоположенията на блокове постоянно. Тази информация се реконструира всеки път от възлите на данни, когато системата стартира.
- DataNode: DataNodes са подчинени устройства, които се намират на всяка машина в клъстер и осигуряват действителното съхранение. Той отговаря за обслужването, четенето и писането на заявки за клиентите.
Операциите за четене/запис в HDFS работят на ниво блок. Файловете с данни в HDFS са разделени на блокове с размер на блок, които се съхраняват като независими единици. Размерът на блока по подразбиране е 64 MB.
HDFS работи на концепция за репликация на данни, при която се създават множество реплики на блокове с данни и се разпределят по възли в клъстер, за да се даде възможност за висока наличност на данни в случай на повреда на възел.
Знаеш ли? Файл в HDFS, който е по-малък от единичен блок, не заема пълното хранилище на блока.
Чети Operaция в HDFS
Заявката за четене на данни се обслужва от HDFS, NameNode и DataNode. Нека наречем читателя „клиент“. Диаграмата по-долу изобразява операция за четене на файл Hadoop.
- Клиент инициира заявка за четене чрез повикване 'open()' метод на обект FileSystem; това е обект от тип Разпределена файлова система.
- Този обект се свързва с namenode с помощта на RPC и получава информация за метаданни, като например местоположенията на блоковете на файла. Моля, обърнете внимание, че тези адреси са на първите няколко блока от файл.
- В отговор на тази заявка за метаданни, адресите на DataNodes, имащи копие на този блок, се връщат обратно.
-
След като бъдат получени адресите на DataNodes, обект от тип FSDataInputStream се връща на клиента. FSDataInputStream съдържа DFSInputStream който се грижи за взаимодействията с DataNode и NameNode. В стъпка 4, показана на горната диаграма, клиент извиква 'чете()' метод, който причинява DFSInputStream за установяване на връзка с първия DataNode с първия блок на файл.
-
Данните се четат под формата на потоци, в които клиентът извиква 'чете()' метод многократно. Този процес на Прочети() операцията продължава, докато достигне края на блока.
- След като бъде достигнат краят на блок, 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.
- След като бъде получено потвърждение за пакет в опашката от всички DataNodes в тръбопровода, той се премахва от „опашката за потвърждение“. В случай на повреда на DataNode, пакетите от тази опашка се използват за повторно иницииране на операцията.
- След като клиентът приключи със записването на данни, той извиква метод 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 разпознават hdfs 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 чрез ИНТЕРФЕЙС НА КОМАНДНИЯ РЕД
Това е един от най-простите начини за взаимодействие с 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
Проверете дали е създадена директория или не. Сега трябва да знаете как да го направите 😉