Samouczek HDFS: Architecture, Czytaj i pisz Operaza pomocą Java API
Co to jest HDFS?
HDFS to rozproszony system plików do przechowywania bardzo dużych plików danych, działający na klastrach sprzętu powszechnego użytku. Jest odporny na błędy, skalowalny i niezwykle prosty w rozbudowie. Hadoop jest dostarczany w pakiecie z HDFS (Rozproszone systemy plików Hadoop).
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 maszyn, nazywa się rozproszonym systemem plików. HDFS jest jednym z takich oprogramowań.
HDFS Architektura
Klaster HDFS składa się głównie z NazwaNode który zarządza systemem plików Metadane oraz Węzły danych który przechowuje aktualna data.
- NazwaWęzeł: NameNode można uznać za mistrza systemu. Utrzymuje drzewo systemu plików i metadane wszystkich plików i katalogów obecnych w systemie. Dwa pliki „Obraz przestrzeni nazw” i „edytuj dziennik” służą do przechowywania informacji o metadanych. Namenode posiada wiedzę o wszystkich węzłach danych zawierających bloki danych dla danego pliku, jednak nie przechowuje na stałe lokalizacji bloków. Informacje te są rekonstruowane za każdym razem z węzłów danych podczas uruchamiania systemu.
- Węzeł danych: DataNodes to podrzędne urządzenia, które znajdują się na każdej maszynie w klastrze i zapewniają rzeczywistą pamięć masową. Są odpowiedzialne za obsługę, odczyt i zapis żądań dla klientów.
Operacje odczytu/zapisu w HDFS działają na poziomie bloków. Pliki danych w HDFS są dzielone na fragmenty o rozmiarze bloku, które są przechowywane jako niezależne jednostki. Domyślny rozmiar bloku to 64 MB.
System HDFS opiera się na koncepcji replikacji danych, w której tworzone są liczne repliki bloków danych, a następnie dystrybuowane do węzłów w klastrze, co zapewnia wysoką dostępność danych w przypadku awarii węzła.
Czy wiesz? Plik w HDFS, który jest mniejszy niż pojedynczy blok, nie zajmuje całej pamięci bloku.
Czytaj Operaw HDFS
Żądanie odczytu danych jest obsługiwane przez HDFS, NameNode i DataNode. Nazwijmy czytnik „klientem”. Poniższy diagram przedstawia operację odczytu pliku w Hadoop.
- Klient inicjuje żądanie odczytu, wywołując 'otwarty()' metoda obiektu FileSystem; jest to obiekt typu Rozproszony system plików.
- Obiekt ten łączy się z węzłem nazw za pomocą protokołu RPC i pobiera informacje o metadanych, takie jak lokalizacje bloków pliku. Należy pamiętać, że adresy te dotyczą kilku pierwszych bloków pliku.
- W odpowiedzi na to żądanie metadanych zwracane są adresy węzłów DataNodes posiadających kopię tego bloku.
-
Po otrzymaniu adresów DataNodes zostanie wyświetlony obiekt typu Strumień wejściowy FSData jest zwracany klientowi. Strumień wejściowy FSData zawiera Strumień wejściowy DFS który zajmuje się interakcjami z DataNode i NameNode. W kroku 4 pokazanym na powyższym diagramie klient wywołuje 'Czytać()' metoda, która powoduje Strumień wejściowy DFS aby nawiązać połączenie z pierwszym DataNode z pierwszym blokiem pliku.
-
Dane odczytywane są w postaci strumieni, które wywołuje klient 'Czytać()' metodę wielokrotnie. Ten proces czytać() operacja będzie kontynuowana aż do osiągnięcia końca bloku.
- Po osiągnięciu końca bloku DFSInputStream zamyka połączenie i przechodzi do zlokalizowania następnego węzła DataNode dla następnego bloku
- Gdy klient zakończy czytanie, dzwoni blisko() Metoda.
Pisać Operaw HDFS
W tej sekcji zrozumiemy, w jaki sposób dane są zapisywane w systemie 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 diagramie.
- Obiekt DistributedFileSystem łączy się z NameNode za pomocą wywołania RPC i inicjuje tworzenie nowego pliku. Jednak ta operacja tworzenia pliku nie kojarzy żadnych bloków z plikiem. Odpowiedzialnością NameNode jest sprawdzenie, czy plik (który jest tworzony) nie istnieje już i czy klient ma odpowiednie uprawnienia do utworzenia nowego pliku. Jeśli plik już istnieje lub klient nie ma wystarczających uprawnień do utworzenia nowego pliku, to Wyjątek IO jest wysyłany do klienta. W przeciwnym wypadku operacja się powiedzie i nowy rekord dla pliku zostanie utworzony przez NameNode.
- Po utworzeniu nowego rekordu w NameNode do klienta zwracany jest obiekt typu FSDataOutputStream. Klient używa go do zapisywania danych w systemie HDFS. Wywoływana jest metoda zapisu danych (krok 3 na diagramie).
- FSDataOutputStream zawiera obiekt DFSOutputStream, który dba o komunikację z DataNodes i NameNode. Podczas gdy klient kontynuuje zapisywanie danych, Strumień wyjściowy DFS kontynuuje tworzenie pakietów z tymi danymi. Pakiety te są umieszczane w kolejce zwanej as Kolejka danych.
- Jest jeszcze jeden komponent tzw DataStreamer który to zużywa Kolejka danych. DataStreamer pyta również NameNode o alokację nowych bloków, wybierając w ten sposób pożądane DataNodes do użycia w replikacji.
- Teraz proces replikacji rozpoczyna się od utworzenia potoku przy użyciu DataNodes. W naszym przypadku wybraliśmy poziom replikacji 3, dlatego w potoku znajdują się 3 DataNodes.
- DataStreamer przesyła pakiety do pierwszego węzła DataNode w potoku.
- Każdy węzeł DataNode w potoku przechowuje odebrany przez siebie pakiet i przekazuje go 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 otrzymaniu potwierdzenia dla pakietu w kolejce od wszystkich DataNode w potoku, jest on usuwany z „Ack Queue”. W przypadku awarii dowolnego 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 wypuszczeniem pozostałych pakietów danych do potoku, po czym następuje oczekiwanie na potwierdzenie.
- Po otrzymaniu ostatecznego potwierdzenia nawiązywany jest kontakt z NameNode w celu poinformowania go, że operacja zapisu pliku została zakończona.
Uzyskaj dostęp do HDFS za pomocą interfejsu API JAVA
W tej sekcji staramy się zrozumieć Java interfejs używany do uzyskiwania dostępu do systemu plików Hadoopa.
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. Operacje te obejmują otwieranie, odczytywanie, zapisywanie i zamykanie. W rzeczywistości API plików dla Hadoop jest ogólne i można je rozszerzyć, aby współdziałało z innymi systemami plików niż HDFS.
Odczyt pliku z HDFS, programowo
Obiekt java.net.URL służy do odczytywania zawartości pliku. Na początek musimy zrobić Java rozpoznaje schemat adresu URL hdfs Hadoopa. Odbywa się to poprzez dzwonienie setURLStreamHandlerFactory metodę na obiekcie URL i przekazywana jest do niej instancja FsUrlStreamHandlerFactory. Metodę tę należy wykonać tylko raz na FMV, stąd jest zamknięty w bloku statycznym.
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 w systemie 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 biec '$HADOOP_HOME/bin/hdfs dfs -pomoc' aby uzyskać szczegółową pomoc dotyczącą każdego polecenia. Tutaj, „df” to polecenie powłoki systemu HDFS, które obsługuje wiele podpoleceń.
Poniżej wymieniono niektóre z powszechnie używanych poleceń wraz ze szczegółowymi informacjami na ich temat.
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 plik „temp.txt” (skopiowane wcześniej) znajduje się na liście „/” katalogiem.
3. Polecenie skopiowania pliku do lokalnego systemu plików z HDFS
$HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt
Możemy zobaczyć 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 już powinieneś wiedzieć jak to zrobić 😉