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.
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.
- Klient inicjuje ลผฤ danie odczytu, wywoลujฤ c metodฤ โopen()โ obiektu FileSystem; jest to obiekt typu DistributedFileSystem.
- 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.
- W odpowiedzi na to ลผฤ danie metadanych zwracane sฤ adresy wฤzลรณw danych posiadajฤ cych kopiฤ danego bloku.
- 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.
- 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.
- 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.
- 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ฤ.
- Klient inicjuje operacjฤ zapisu, wywoลujฤ c metodฤ โcreate()โ obiektu DistributedFileSystem, ktรณra tworzy nowy plik โ krok nr 1 na powyลผszym diagramie.
- 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.
- 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).
- 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).
- 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.
- 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ล danych w potoku przechowuje odebrany pakiet i przesyลa go dalej do drugiego wฤzลa danych w potoku.
- Inna kolejka, โAck Queueโ, jest obsลugiwana przez DFSOutputStream i sลuลผy do przechowywania pakietรณw oczekujฤ cych na potwierdzenie od 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.
- 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.
- 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.
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 โ/โ.
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.
4. Polecenie utworzenia nowego katalogu
$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory
Polecenie zostanie wykonane w trybie cichym, jak pokazano poniลผej.
Sprawdลบ, czy katalog zostaล utworzony. Teraz powinieneล wiedzieฤ, jak to zrobiฤ ๐




