Co to jest HDFS?
HDFS to rozproszony system plików do przechowywania bardzo dużych plików danych, działający na klastrach standardowego sprzętu. Jest odporny na błędy, skalowalny i niezwykle prosty w rozbudowie. Hadoop jest dostarczany w pakiecie z HDFS ( Hadoop Distributed File Systems ).
Gdy dane przekraczają pojemność pamięci masowej na pojedynczej maszynie fizycznej, konieczne staje się podzielenie ich na kilka oddzielnych maszyn. System plików, który zarządza operacjami specyficznymi dla pamięci masowej w sieci komputerów, nazywany jest rozproszonym systemem plików. HDFS jest jednym z takich programów.
W tym samouczku nauczymy się,
- Co to jest HDFS?
- Architektura HDFS
- Przeczytaj operację
- Operacja zapisu
- Uzyskaj dostęp do HDFS za pomocą JAVA API
- Uzyskaj dostęp do HDFS za pomocą INTERFEJSU LINII POLECEŃ
Architektura HDFS
Klaster HDFS składa się głównie z węzła NameNode, który zarządza metadanymi systemu plików, oraz węzła DataNodes, który przechowuje rzeczywiste dane .
- NameNode: NameNode można uznać za administratora systemu. Utrzymuje drzewo systemu plików i metadane dla wszystkich plików i katalogów obecnych w systemie. Do przechowywania informacji o metadanych używane są dwa pliki „Namespace image” i „edit log” . Namenode posiada wiedzę o wszystkich węzłach danych zawierających bloki danych dla danego pliku, jednak nie przechowuje trwale lokalizacji bloków. Informacje te są odtwarzane za każdym razem z węzłów danych podczas uruchamiania systemu.
- DataNode: DataNodes to slave'y, które znajdują się na każdej maszynie w klastrze i zapewniają rzeczywistą pamięć. Odpowiada za obsługę, odczytywanie i zapisywanie żądań klientów.
Operacje odczytu / zapisu w HDFS działają na poziomie blokowym. Pliki danych w HDFS są dzielone na bloki, które są przechowywane jako niezależne jednostki. Domyślny rozmiar bloku to 64 MB.
HDFS działa w oparciu o koncepcję replikacji danych, w której wiele replik bloków danych jest tworzonych i dystrybuowanych w węzłach w całym klastrze, aby zapewnić wysoką dostępność danych w przypadku awarii węzła.
Czy wiesz? Plik w formacie HDFS, który jest mniejszy niż pojedynczy blok, nie zajmuje pełnej pamięci bloku.
Czytaj operację w HDFS
Żądanie odczytu danych jest obsługiwane przez HDFS, NameNode i DataNode. Nazwijmy czytelnika „klientem”. Poniższy diagram przedstawia operację odczytu plików w Hadoop.
- Klient inicjuje żądanie odczytu przez wywołanie metody „open ()” obiektu FileSystem; jest to obiekt typu DistributedFileSystem .
- Ten obiekt łączy się z kodem nazw za pomocą RPC i pobiera informacje o metadanych, takie jak lokalizacje bloków pliku. Zwróć uwagę, że te adresy stanowią kilka pierwszych bloków pliku.
- W odpowiedzi na to żądanie metadanych zwracane są adresy węzłów DataNodes posiadających kopię tego bloku.
- Po odebraniu adresów DataNodes do klienta zwracany jest obiekt typu FSDataInputStream . FSDataInputStream zawiera DFSInputStream, który zajmuje się interakcjami z DataNode i NameNode. W kroku 4 pokazanym na powyższym diagramie klient wywołuje metodę 'read ()' , która powoduje, że DFSInputStream ustanawia połączenie z pierwszym DataNode z pierwszym blokiem pliku.
- Dane odczytywane są w postaci strumieni, przy czym klient wielokrotnie wywołuje metodę „read ()” . Ten proces odczytu () trwa aż do końca bloku.
- Po osiągnięciu końca bloku DFSInputStream zamyka połączenie i przechodzi do lokalizacji następnego DataNode dla następnego bloku
- Gdy klient zakończy odczyt, wywołuje metodę close () .
Operacja zapisu w HDFS
W tej sekcji zrozumiemy, w jaki sposób dane są zapisywane w formacie HDFS za pośrednictwem plików.
- Klient inicjuje operację zapisu poprzez wywołanie metody „create ()” obiektu DistributedFileSystem, która tworzy nowy plik - krok nr. 1 na powyższym schemacie.
- Obiekt DistributedFileSystem łączy się z NameNode przy użyciu wywołania RPC i inicjuje tworzenie nowego pliku. Jednak ten plik tworzy operację nie wiąże żadnych bloków z plikiem. Obowiązkiem NameNode jest sprawdzenie, czy plik (który jest tworzony) już nie istnieje, a klient ma poprawne uprawnienia do tworzenia nowego pliku. Jeśli plik już istnieje lub klient nie ma wystarczających uprawnień do utworzenia nowego pliku, do klienta zostanie zgłoszony wyjątek IOException . W przeciwnym razie operacja powiedzie się i NameNode utworzy nowy rekord dla pliku.
- Po utworzeniu nowego rekordu w NameNode obiekt typu FSDataOutputStream jest zwracany do klienta. Klient używa go do zapisywania danych w HDFS. Wywoływana jest metoda zapisu danych (krok 3 na schemacie).
- FSDataOutputStream zawiera obiekt DFSOutputStream, który zajmuje się komunikacją z DataNodes i NameNode. Podczas gdy klient kontynuuje zapisywanie danych, DFSOutputStream kontynuuje tworzenie pakietów z tymi danymi. Pakiety te są umieszczane w kolejce o nazwie DataQueue .
- Jest jeszcze jeden komponent o nazwie DataStreamer, który zużywa tę DataQueue . DataStreamer prosi również NameNode o przydzielenie nowych bloków, wybierając w ten sposób pożądane DataNodes, które mają być używane do replikacji.
- Teraz proces replikacji rozpoczyna się od utworzenia potoku przy użyciu DataNodes. W naszym przypadku wybraliśmy poziom replikacji 3, a zatem w potoku są 3 węzły danych.
- DataStreamer przesyła pakiety do pierwszego DataNode w potoku.
- Każdy węzeł DataNode w potoku przechowuje odebrany pakiet i przekazuje go dalej do drugiego węzła DataNode w potoku.
- Inna kolejka „Ack Queue” jest utrzymywana przez DFSOutputStream w celu przechowywania pakietów oczekujących na potwierdzenie z DataNodes.
- Po odebraniu potwierdzenia pakietu w kolejce ze wszystkich DataNodes w potoku jest on usuwany z „Ack Queue”. W przypadku jakiejkolwiek awarii DataNode, pakiety z tej kolejki są używane do ponownego zainicjowania operacji.
- Gdy klient zakończy zapisywanie danych, wywołuje metodę close () (krok 9 na diagramie) Call to close (), co skutkuje opróżnieniem pozostałych pakietów danych do potoku, po czym następuje oczekiwanie na potwierdzenie.
- Po otrzymaniu końcowego potwierdzenia kontaktuje się z NameNode w celu poinformowania go, że operacja zapisu pliku została zakończona.
Uzyskaj dostęp do HDFS za pomocą JAVA API
W tej sekcji próbujemy zrozumieć interfejs Java używany do uzyskiwania dostępu do systemu plików Hadoop.
Aby programowo współdziałać z systemem plików Hadoop, Hadoop udostępnia wiele klas JAVA. Pakiet o nazwie org.apache.hadoop.fs zawiera klasy przydatne w manipulowaniu plikiem w systemie plików Hadoop. Te operacje obejmują otwieranie, odczytywanie, zapisywanie i zamykanie. W rzeczywistości interfejs API plików dla Hadoop jest ogólny i można go rozszerzyć w celu interakcji z innymi systemami plików innymi niż HDFS.
Czytanie pliku z HDFS, programowo
Do odczytu zawartości pliku służy obiekt java.net.URL . Na początek musimy sprawić, by Java rozpoznawała schemat adresu URL hdfs Hadoopa. Odbywa się to poprzez wywołanie metody setURLStreamHandlerFactory na obiekcie URL i przekazanie do niego instancji FsUrlStreamHandlerFactory. Tę metodę należy wykonać tylko raz na JVM, dlatego jest ujęta w statyczny blok.
Przykładowy kod to
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);}}}
Ten kod otwiera i odczytuje zawartość pliku. Ścieżka do tego pliku na HDFS jest przekazywana do programu jako argument wiersza poleceń.
Uzyskaj dostęp do HDFS za pomocą INTERFEJSU LINII POLECEŃ
To jeden z najprostszych sposobów interakcji z HDFS. Interfejs wiersza poleceń obsługuje operacje systemu plików, takie jak odczyt pliku, tworzenie katalogów, przenoszenie plików, usuwanie danych i wyświetlanie katalogów.
Możemy uruchomić '$ HADOOP_HOME / bin / hdfs dfs -help', aby uzyskać szczegółową pomoc dotyczącą każdego polecenia. Tutaj „dfs” jest poleceniem powłoki HDFS, które obsługuje wiele podpoleceń.
Poniżej wymieniono niektóre z powszechnie używanych poleceń, wraz z niektórymi szczegółami każdego z nich.
1. Skopiuj plik z lokalnego systemu plików do HDFS
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal temp.txt /
To polecenie kopiuje plik temp.txt z lokalnego systemu plików do HDFS.
2. Możemy wyświetlić listę plików znajdujących się w katalogu za pomocą -ls
$HADOOP_HOME/bin/hdfs dfs -ls /
Widzimy, że plik „temp.txt” (skopiowany wcześniej) jest wymieniony w katalogu „/” .
3. Polecenie skopiowania pliku do lokalnego systemu plików z HDFS
$HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt
Widzimy plik temp.txt skopiowany do lokalnego systemu plików.
4. Polecenie utworzenia nowego katalogu
$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory
Sprawdź, czy katalog został utworzony, czy nie. Teraz powinieneś wiedzieć, jak to zrobić ;-)