Samouczek HDFS: Architecture, Czytaj i pisz Operacja

โšก Inteligentne podsumowanie

HDFS to rozproszona warstwa pamiฤ™ci masowej Hadoop, dzielฤ…ca bardzo duลผe pliki na powielone bloki na maszynach komercyjnych, tak aby pojedynczy NameNode tracmetadanych ks, podczas gdy wiele wฤ™zล‚รณw danych niezawodnie obsล‚uguje ลผฤ…dania odczytu i zapisu.

  • ๐Ÿ”˜ Archistruktura: NameNode przechowuje obraz przestrzeni nazw i dziennik edycji, podczas gdy DataNode przechowuje rzeczywiste repliki blokรณw.
  • ๏ธ Rozmiar bloku: Domyล›lna wielkoล›ฤ‡ blokรณw w Hadoop 1.x wynosiล‚a 64 MB; w Hadoop 2.x i 3.x jest to 128 MB.
  • โœ… Replikacja: Domyล›lnie na blok przypadajฤ… trzy repliki, rozmieszczone na rรณลผnych stojakach, dziฤ™ki czemu awaria sprzฤ™tu nigdy nie spowoduje utraty danych.
  • ๐Ÿงช Odczyt ล›cieลผki: FSDataInputStream i DFSInputStream pobierajฤ… lokalizacjฤ™ blokรณw z NameNode, a nastฤ™pnie przesyล‚ajฤ… strumieniowo bajty bezpoล›rednio z DataNode.
  • ๐Ÿ› ๏ธ. ลšcieลผka zapisu: DFSOutputStream kolejkuje pakiety, DataStreamer buduje potok DataNode, a kolejka Ack chroni przed utratฤ… pakietรณw.
  • ๐Ÿงญ Opcje dostฤ™pu: org.apache.hadoop.fs Java API i powล‚oka hdfs dfs umoลผliwiajฤ… otwieranie, odczytywanie, zapisywanie i zamykanie.

Samouczek HDFS

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 z HDFS (Hadoop Distributed File System).

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 metadanymi systemu plikรณw i Wฤ™zล‚y danych ktรณre przechowujฤ… rzeczywiste dane.

  • NazwaWฤ™zeล‚: Wฤ™zeล‚ NameNode moลผna uznaฤ‡ za gล‚รณwnego administratora systemu. Utrzymuje on drzewo systemu plikรณw oraz metadane wszystkich plikรณw i katalogรณw obecnych w systemie. Dwa pliki: โ€žobraz przestrzeni nazwโ€ i โ€ždziennik edycjiโ€ sล‚uลผฤ… do przechowywania metadanych. Wฤ™zeล‚ 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ฤ… rekonstruowane z wฤ™zล‚รณw danych za kaลผdym razem, gdy system siฤ™ uruchamia.
  • Wฤ™zeล‚ danych: Wฤ™zล‚y danych to wฤ™zล‚y podrzฤ™dne, ktรณre znajdujฤ… siฤ™ na kaลผdej maszynie w klastrze i zapewniajฤ… rzeczywistฤ… pamiฤ™ฤ‡ masowฤ…. Odpowiadajฤ… za obsล‚ugฤ™ ลผฤ…daล„ odczytu i zapisu od klientรณw.

Poniewaลผ pojedynczy NameNode mรณgล‚by staฤ‡ siฤ™ pojedynczym punktem awarii, obecne klastry uruchamiajฤ… aktywny NameNode obok zapasowego NameNode, ktรณry udostฤ™pnia dziennik edycji za poล›rednictwem kworum JournalNode, z automatycznym przeล‚ฤ…czaniem awaryjnym miฤ™dzy nimi.

Operacje odczytu i zapisu w systemie HDFS dziaล‚ajฤ… na poziomie blokรณw. Pliki danych w systemie HDFS sฤ… dzielone na fragmenty o rozmiarze bloku, ktรณre sฤ… przechowywane jako niezaleลผne jednostki. Domyล›lny rozmiar bloku w systemie Hadoop 1.x wynosi 64 MB. Od wersji Hadoop 2.x domyล›lny rozmiar bloku wynosi 64 MB. dfs.rozmiar bloku wynosi 128 MB.

HDFS opiera siฤ™ na koncepcji replikacji danych, w ktรณrej tworzone sฤ… liczne repliki blokรณw danych, ktรณre sฤ… nastฤ™pnie rozmieszczane na wฤ™zล‚ach w klastrze, aby zapewniฤ‡ wysokฤ… dostฤ™pnoล›ฤ‡ danych w przypadku awarii wฤ™zล‚a. Domyล›lny wspรณล‚czynnik replikacji wynosi trzy (replikacja dfs), a gdy DataNode przestaje wysyล‚aฤ‡ sygnaล‚y potwierdzajฤ…ce, NameNode automatycznie replikuje swoje bloki w innym miejscu.

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. Czytnik nazwijmy โ€žklientemโ€. Poniลผszy diagram przedstawia operacjฤ™ odczytu pliku w Hadoop.

Przepล‚yw danych operacji odczytu HDFS pomiฤ™dzy klientem, NameNode i DataNodes

  1. Klient inicjuje ลผฤ…danie odczytu, wywoล‚ujฤ…c metodฤ™ โ€žopen()โ€ obiektu FileSystem; jest to obiekt typu DistributedFileSystem.
  2. Ten obiekt ล‚ฤ…czy siฤ™ z wฤ™zล‚em NameNode za pomocฤ… RPC i pobiera metadane, takie jak lokalizacje blokรณw pliku. Naleลผy pamiฤ™taฤ‡, ลผe adresy te dotyczฤ… pierwszych kilku blokรณw pliku.
  3. W odpowiedzi na to ลผฤ…danie metadanych zwracane sฤ… adresy wฤ™zล‚รณw danych posiadajฤ…cych kopiฤ™ danego bloku.
  4. Po otrzymaniu adresรณw wฤ™zล‚รณw danych, klientowi zwracany jest obiekt typu FSDataInputStream. Strumieล„ FSDataInputStream zawiera strumieล„ DFSInputStream, ktรณry obsล‚uguje interakcje z wฤ™zล‚em danych i wฤ™zล‚em nazw. W kroku 4, pokazanym na powyลผszym diagramie, klient wywoล‚uje metodฤ™ โ€žread()โ€, ktรณra powoduje, ลผe strumieล„ DFSInputStream nawiฤ…zuje poล‚ฤ…czenie z pierwszym wฤ™zล‚em danych przechowujฤ…cym pierwszy blok pliku.
  5. Dane sฤ… odczytywane w postaci strumieni, w ktรณrych klient wielokrotnie wywoล‚uje metodฤ™ โ€žread()โ€. Proces operacji read() jest kontynuowany aลผ do koล„ca bloku.
  6. Po osiฤ…gniฤ™ciu koล„ca bloku DFSInputStream zamyka poล‚ฤ…czenie i przechodzi do lokalizowania nastฤ™pnego wฤ™zล‚a danych dla nastฤ™pnego bloku.
  7. Po zakoล„czeniu odczytu klient wywoล‚uje metodฤ™ close().

Pisaฤ‡ Operaw HDFS

W tej sekcji dowiesz siฤ™, jak dane sฤ… zapisywane w systemie HDFS za poล›rednictwem plikรณw. Poniลผszy diagram traces, ktรณre zapisujฤ… ล›cieลผkฤ™.

Potok operacji zapisu HDFS z DataQueue, DataStreamer i Ack Queue

  1. Klient inicjuje operacjฤ™ zapisu, wywoล‚ujฤ…c metodฤ™ โ€žcreate()โ€ obiektu DistributedFileSystem, ktรณra tworzy nowy plik โ€“ krok nr 1 na powyลผszym diagramie.
  2. Obiekt DistributedFileSystem ล‚ฤ…czy siฤ™ z wฤ™zล‚em NameNode za pomocฤ… wywoล‚ania RPC i inicjuje tworzenie nowego pliku. Operacja ta nie wiฤ…ลผe jednak ลผadnych blokรณw z plikiem. Obowiฤ…zkiem wฤ™zล‚a NameNode jest sprawdzenie, czy plik (ktรณry jest tworzony) juลผ nie istnieje 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, zgล‚aszany jest wyjฤ…tek IOException. W przeciwnym razie operacja koล„czy siฤ™ powodzeniem, a wฤ™zeล‚ NameNode tworzy nowy rekord dla pliku.
  3. Po utworzeniu nowego rekordu w NameNode, klientowi zwracany jest obiekt typu FSDataOutputStream. Klient uลผywa go do zapisu danych w systemie HDFS. Wywoล‚ywana jest metoda zapisu danych (krok 3 na diagramie).
  4. Strumieล„ FSDataOutputStream zawiera obiekt DFSOutputStream, ktรณry zarzฤ…dza komunikacjฤ… z wฤ™zล‚ami DataNode i wฤ™zล‚em NameNode. Podczas gdy klient kontynuuje zapisywanie danych, DFSOutputStream kontynuuje tworzenie pakietรณw z tymi danymi. Pakiety te sฤ… umieszczane w kolejce zwanej kolejkฤ… danych (DataQueue).
  5. Istnieje jeszcze jeden komponent o nazwie DataStreamer, ktรณry pobiera tฤ™ kolejkฤ™ danych. DataStreamer prosi rรณwnieลผ NameNode o przydzielenie nowych blokรณw, wybierajฤ…c w ten sposรณb poลผฤ…dane DataNode do uลผycia w replikacji.
  6. 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.
  7. DataStreamer przesyล‚a pakiety do pierwszego wฤ™zล‚a DataNode w potoku.
  8. Kaลผdy wฤ™zeล‚ danych w potoku przechowuje odebrany pakiet i przesyล‚a go dalej do drugiego wฤ™zล‚a danych w potoku.
  9. Inna kolejka, โ€žAck Queueโ€, jest obsล‚ugiwana przez DFSOutputStream i sล‚uลผy do przechowywania pakietรณw oczekujฤ…cych na potwierdzenie od DataNodes.
  10. 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.
  11. Po zakoล„czeniu zapisywania danych przez klienta, wywoล‚uje on metodฤ™ close() (krok 9 na diagramie). Wywoล‚anie close() powoduje przekazanie pozostaล‚ych pakietรณw danych do potoku, a nastฤ™pnie oczekiwanie na potwierdzenie.
  12. 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ฤ… Java API

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 zapewnia wiele Java Klasy. Pakiet o nazwie org.apache.hadoop.fs zawiera klasy przydatne do manipulowania plikiem w systemie plikรณw Hadoop. Operacje te obejmujฤ… otwieranie, odczytywanie, zapisywanie i zamykanie. Interfejs API plikรณw Hadoop jest uniwersalny i moลผna go rozszerzyฤ‡ o interakcjฤ™ z systemami plikรณw innymi 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 rozpoznaj hdfs Hadoop URL schemat. Odbywa siฤ™ to poprzez wywoล‚anie zestawuURLMetoda StreamHandlerFactory na URL obiekt i przekazujฤ…c do niego instancjฤ™ FsUrlStreamHandlerFactory. Tฤ™ metodฤ™ 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ล„.

Dostฤ™p do HDFS za pomocฤ… interfejsu wiersza poleceล„

To jeden z najprostszych sposobรณw interakcji z systemem plikรณw 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 listy katalogรณw.

Moลผemy biec '$HADOOP_HOME/bin/hdfs dfs -pomoc' Aby uzyskaฤ‡ szczegรณล‚owฤ… pomoc dotyczฤ…cฤ… kaลผdego polecenia. W tym przypadku โ€ždfsโ€ to polecenie powล‚oki HDFS, ktรณre obsล‚uguje wiele podpoleceล„. W obecnych wersjach Hadoop hdfs dfs jest formฤ… preferowanฤ…, podczas gdy starsza system plikรณw Hadoop Polecenie wykonuje tฤ™ samฤ… pracฤ™ dla kaลผdego obsล‚ugiwanego systemu plikรณw.

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, jak pokazano poniลผej.

Polecenie hdfs dfs -copyFromLocal kopiujฤ…ce plik temp.txt do HDFS

2. Moลผemy wyล›wietliฤ‡ listฤ™ plikรณw znajdujฤ…cych siฤ™ w katalogu za pomocฤ… polecenia -ls

$HADOOP_HOME/bin/hdfs dfs -ls /

Na poniลผszej liล›cie moลผemy zobaczyฤ‡ plik โ€žtemp.txtโ€ (skopiowany wczeล›niej) w katalogu โ€ž/โ€.

hdfs dfs -ls wyjล›cie wyล›wietlajฤ…ce temp.txt w katalogu gล‚รณwnym HDFS

3. Polecenie skopiowania pliku do lokalnego systemu plikรณw z HDFS

$HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt

To polecenie odzwierciedla polecenie -get i akceptuje jawnฤ… lokalnฤ… ล›cieลผkฤ™ docelowฤ… jako drugi argument. Poniลผszy wynik przedstawia plik temp.txt skopiowany do lokalnego systemu plikรณw.

hdfs dfs -copyToLocal dane wyjล›ciowe pokazujฤ…ce plik temp.txt skopiowany do lokalnego systemu plikรณw

4. Polecenie utworzenia nowego katalogu

$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory

Polecenie zostanie wykonane w trybie cichym, jak pokazano poniลผej.

Polecenie hdfs dfs -mkdir tworzy folder /mydirectory w HDFS

Sprawdลบ, czy katalog zostaล‚ utworzony. Teraz powinieneล› wiedzieฤ‡, jak to zrobiฤ‡ ๐Ÿ˜‰

FAQ

Duลผe bloki utrzymujฤ… metadane NameNode na niskim poziomie i pozwalajฤ… maperowi odczytaฤ‡ dล‚ugi sekwencyjny ciฤ…g bajtรณw przed ponownym wyszukiwaniem. Czas wyszukiwania na dysku staje siฤ™ zatem niewielkim uล‚amkiem czasu transferu, co sprawia, ลผe โ€‹โ€‹skanowanie caล‚ych plikรณw jest szybkie.

Wฤ™zeล‚ NameNode przestaje odbieraฤ‡ sygnaล‚y potwierdzajฤ…ce, oznacza wฤ™zeล‚ jako martwy i planuje ponownฤ… replikacjฤ™ kaลผdego bloku, ktรณry spadล‚ poniลผej jego wspรณล‚czynnika replikacji, na sprawne wฤ™zล‚y danych. Zapisy w trakcie transmisji odzyskiwane sฤ… z kolejki potwierdzeล„, dziฤ™ki czemu klient nie traci pakietรณw.

Nie znajduje siฤ™ w poprawnie skonfigurowanym klastrze. HDFS High Availability uruchamia aktywny i zapasowy wฤ™zeล‚ NameNode, ktรณre udostฤ™pniajฤ… edycjฤ™ za poล›rednictwem JournalNodes, a kontrolery trybu failover ZooKeeper automatycznie awansujฤ… wฤ™zeล‚ zapasowy, gdy aktywny wฤ™zeล‚ przestaje odpowiadaฤ‡.

Obie opcje przesyล‚ajฤ… dane do HDFS. Opcja -copyFromLocal ogranicza ลบrรณdล‚o do lokalnego systemu plikรณw, natomiast opcja -put akceptuje dowolne obsล‚ugiwane ลบrรณdล‚o, w tym innฤ… ล›cieลผkฤ™ HDFS lub wejล›cie standardowe. Poza tym dziaล‚anie jest identyczne, wiฤ™c opcja -copyFromLocal po prostu dokumentuje intencjฤ™.

Kaลผdy plik, katalog i blok zajmuje pamiฤ™ฤ‡ w NameNode, wiฤ™c miliony maleล„kich plikรณw wyczerpujฤ… siฤ™ na dล‚ugo przed zapeล‚nieniem dyskรณw. ลฤ…czenie ich w pliki sekwencyjne, archiwa Avro, ORC, Parquet lub HAR, pozwala na ล‚atwe zarzฤ…dzanie metadanymi.

Replikacja przechowuje trzy peล‚ne kopie, co kosztuje 200% wiฤ™cej pamiฤ™ci. Kodowanie wymazujฤ…ce, dodane w Hadoop 3, przechowuje komรณrki parzystoล›ci i osiฤ…ga podobnฤ… trwaล‚oล›ฤ‡ przy okoล‚o 50% narzucie, kosztem taล„szej pamiฤ™ci masowej i wyลผszych kosztรณw procesora i sieci podczas odzyskiwania danych.

Modele uczenia maszynowego trenowane na logach audytu NameNode i metrykach DataNode mogฤ… prognozowaฤ‡ wyczerpanie pojemnoล›ci, sygnalizowaฤ‡ aktywne bloki i wykrywaฤ‡ awarie dyskรณw, zanim zostanฤ… one usuniฤ™te. Wykrywanie anomalii w schematach dostฤ™pu pozwala rรณwnieลผ na wczesne wykrywanie niekontrolowanych zadaล„.

Copilot szybko uzupeล‚nia znane schematy org.apache.hadoop.fs, takie jak pฤ™tle FileSystem.get, FSDataInputStream i wywoล‚ania IOUtils.copyBytes. Zawsze weryfikuj generowany kod pod kฤ…tem uลผywanej wersji Hadoop, poniewaลผ nazwy API i przestarzaล‚e metody rรณลผniฤ… siฤ™ zauwaลผalnie miฤ™dzy Hadoop 2.x i 3.x.

Podsumuj ten post nastฤ™pujฤ…co: