Strona głównaArtykuły

Ekoystem Hadoop: Jak HDFS, MapReduce i YARN Rozdzieliły Prace

Zaprezentowanie tego, jak system Hadoop podzielił przechowywanie, przetwarzanie i harmonogramowanie klastrów na trzy współpracujące systemy, dlaczego ta separacja była rewolucyjna oraz gdzie została już zastąpiona.

mysimulator teamZaktualizowano — czerwiec 2026≈ 5 min czytania▶ Otwórz symulację

Trzy problemy, trzy podsystemy

Zanim Hadoop, standardowym rozwiązaniem dla „mamy więcej danych niż jedno urządzenie może przechować” było zakup większego urządzenia: więcej dysków, więcej RAM, grubszej maszyny RAID. Ta metoda ma swoje granice i są one drogowskazowo wysoce kosztowne. Odkrycie Hadoopa, które pochodzi z Google'owych wewnętrznych dokumentów GFS i MapReduce, polegało na tym, aby zamiast skaliować w górę, skaliować w dół — rozprowadzić zarówno dane, jak i obliczenia po setkach lub tysiącach zwykłych serwerów, które mogą się wykrzyknąć, a do ukrywania tych awarii od programisty jest odpowiedzialna sama aplikacja.

Aby to zrobić dobrze, Hadoop podzielił problem na trzy różne zagadnienia, które wcześniej systemy zazwyczaj łączyły w jedną całość. System plików rozproszony HDFS (Hadoop Distributed File System) jest odpowiedzialny tylko za trwałą przechowywanie bajtów po całej klastrze. MapReduce jest odpowiedzialny tylko za wyrażanie i wykonanie obliczeń nad tymi danymi. YARN — Yet Another Resource Negotiator — jest odpowiedzialny tylko za decyzję, które maszyny otrzymują do uruchomienia zadań w dowolnym momencie. Każdy warstwa może być rozumiana i późniejsze zamiany dokonywane są niezależnie od innych dwóch, co dokładnie się stało, gdy ekosystem dorastał.

HDFS: replikacja zamiast RAID

HDFS przy każdym zapisywaniu pliku dzieli go na duże bloki, zwykle o rozmiarze 128 MB — znacznie większych niż standardowe 4 KB bloki systemu plików, ponieważ cel jest minimalizacja kosztów wyszukiwania podczas sekwencyjnych skanów. Każdy blok jest domyślnie trzykrotnie powtarzany i kopie są zamiernie rozłożone: jeden replikat na rachwie, w którym znajduje się pisanie, drugi na innym węźle tego samego rachwu, a trzeci na węźle z innej rachwi. Jedyną metadane — które bloki tworzą dany plik i gdzie znajduje się każda replika — przechowuje pojedynczy NameNode w pamięci dla szybkości, podczas gdy rzeczywiste bajty są umieszczone na DataNodes rozproszonych po całości klastrze.

Ta zrozumiała strategia lokalizacji jest świadomym kompromisem między dwiema formami awarii. Trzy replikaty w tym samym rachwie oznacza, że blok może być szybko odtworzony używając wysokobitowych sieciowych łączy w rachwi, jeśli jeden węzeł zemści się. Trzydziestka replikatów w innym rachwie chroni przed całym rachwem, który jest ciemny — awarią przełącznika lub przekrojem jednostki rozkładu mocy, co się zdarza częściej w rzeczywistych centrum danych niż ludzie sądzą. Jeśli DataNode przestanie wysyłać regularne serca, NameNode oznacza bloki jako niedostarczone i planuje nowe kopie w innych miejscach automatycznie, bez konieczności podjęcia interwencji przez operatora. Praktyczny rezultat to system plików, który traktuje awarię dysku i serwera jak poniedziałek, a nie jako kryzys.

MapReduce: obliczenia idą do danych

Głównym genialnym elementem MapReduce nie było abstrakcja map/reduce sama w sobie — programiści funkcyjni używali map i fold już przez lata — ale decyzja, aby rozdzielić każde zadanie map na, lub bardzo blisko, węzeł, który już ma odpowiedni blok HDFS. Przenoszenie terabajtu danych przez sieć do węzła obliczeniowego jest wolne; przenoszenie kilku kilobajtów kodu do miejsca, gdzie dane już są, prawie nie kosztuje niczego. Ta zasada, lokalizacja danych, jest przyczyną tego, dlaczego klastry Hadoop zwykle uruchamiają magazynowanie i obliczenia na tym samym fizycznym węźle, a nie oddzielnym, co było pierwotnym zaprojektowaniem.

Zadanie MapReduce wykonuje się w dwóch zdecydowanie uporządkowanych fazach połączonej przez skarbiony krok o nazwie shuffle. Faza map jest równoległa i czyta podziały wejściowe, emiterując pary klucz-wartość — liczenie słów emite (słowo, 1) dla każdego tokenu. Po mapie i zanim dojdzie do redukcji, ramka dzieli wszystkie wyprowadzone pary według klucza, sortuje każdą grupę i przesyła je przez sieć tak, aby każda wartość dla danego klucza była na tym samym reducerze; ten krok shuffle i sortowanie jest zwykle najdroższym elementem całego zadania, ponieważ to jedna z faz, która nie może być wykonana lokalnie. Faza reduce następnie sumuje wartości dla każdego klucza — sumując liczby wystąpień słów — i zapisuje wynik z powrotem do HDFS. Każdy intermedacyjny wynik między fazami jest zapisywany na dysku, co stanowi jedyną największą przyczynę, dlaczego MapReduce w końcu został nadal używany dla obciążen iteracyjnych: dziesięciofazowa pipeline oznaczała dziesięć wyjazdów do dysku, nawet gdy całe zestaw danych mogłoby zadowolić się pamięcią RAM klastra.

YARN: oddzielenie planowania od wykonywania

W pierwszej generacji Hadoopu JobTracker MapReduce pełnił podwójną rolę jako zarządzacz zasobów dla całego klastru oraz silnik wykonujący zadania MapReduce. Ta wyciągana relacja oznaczała, że klaster mógł wykonywać tylko zadania MapReduce; nie było sposobu na planowanie i uruchamianie innych aplikacji, takich jak zadania Spark lub MPI, bez rywalizacji zasobów ad hoc. YARN wprowadzony w Hadoop 2 oddzielił logikę planowania zasobów do osobnej warstwy, która była wystarczająco ogólna, aby hostować dowolne rodzaje aplikacji rozproszonych.

Architektura YARN odzwierciedla delegowanie zarządcy zatrudnieniemu prowadzącemu projekt. Jedna instancja ResourceManager śledzi, ile jest wolnych CPU i pamięci na każdym NodeManagerze (jednej dla każdego maszyny roboczej) i negocjuje kontenery — pakietów z ustaloną ilością CPU i pamięci — na żądanie. Gdy nowe zadanie dotrze do klastra, ResourceManager najpierw uruchamia mały ApplicationMaster dla tego konkretnego zadania w jednym kontenerze; ApplicationMaster następnie prosi o dodatkowe kontenery, aby rzeczywiście wykonać zadania zadań, monitoruje ich postępy i żąda wymiany, jeśli jakieś z nich się nie powiedzą. Ta dwuwarstwowa struktura oznaczała, że szerszy planer klastra już nie musiał znać szczegółów MapReduce, Sparka, Tez lub innych — wystarczyło mu tylko rozdawać kontenery w sposób równy, co jest powodem dla którego od 2013 roku pojedynczy klaster YARN mógł zarządzanie mieszonymi obciążeniami z wielu różnych silników przetwarzania jednocześnie.

Gdzie ekosystem kontynuuje swoje rozwój

Trójstronna separacja okazała się wartościowa prawie od momentu jej zastosowania: ponieważ MapReduce był odłączony od zarządzania zasobami, Apache Spark i Apache Tez mogły bez zmian w HDFS ani planifierze wstawić się do YARN jako alternatywne motorzy wykonywania. Specjalnie Spark przechowywał intermedialne dane w pamięci między etapami, zamiast wracać na dysk po każdym kroku, co sprawiło, że był o pięć do dziesięć razy szybszy w iteracyjnych zadaniach uczenia maszynowego i przetwarzaniu graficznym. W ciągu kilku lat praktycznie zastąpił MapReduce jako domyślne narzędzie przetwarzania, nawet na clustercach nadal używających HDFS.

Sam HDFS miał dłuższy okres istnienia, ale teraz podlega presji ze strony usługi obiektowej w chmurze. Usługi takie jak Amazon S3 oferują podobne gwarancje trwałości, skrajnie nieograniczonego skalowania i — kluczowo — odłączają przechowywanie danych od konkretnego klastra obliczeniowego, co pozwala na uruchamianie i zamykanie obliczeń bez przesuwania danych. Wiele organizacji, które kiedyś korzystały z wewnętrznych klastrów Hadoop, przeniosło swoje dane do S3 lub równoważnych magazynów obiektowych, zachowując tylko warstwę przetwarzania (Spark, Presto, Trino) działającą na ich szczycie. To pokazuje, że podział między przechowywanie a obliczenia, który Hadoop wprowadził jako pierwszy, wykazał się dłużej niż implementacja własnego systemu przechowywania Hadoop. Nauka, którą zasugerowała, nawet gdy pojedyncze komponenty były wymieniane, była architektoniczna: oddzielaj konsekwencje jasno i każdy z nich może być zamieniony na lepszą opcję, gdy się pojawi.

Często zadawane pytania

Czy Hadoop nadal jest używany dzisiaj?

Duże legitymacyjne instalacje nadal wykorzystują HDFS i YARN, szczególnie w organizacjach z intensywnym inwestowaniem na miejscu, ale nowe projekty przewagę mają nad chmurą i Spark lub całkowicie zarządzane magazyny danych, ponieważ unikają obciążenia operacyjnego związanego z zarządzaniem dużą klastrami.

Dlaczego HDFS używa tak dużych rozmiarów bloków?

Duże bloki (zazwyczaj 128 MB) minimalizują liczbę potrzebnych operacji odczytu dyskowych podczas sekwencyjnego przetwarzania dużych plików, co pasuje znacznie lepiej do obciążen analitycznych w ramach Hadoop niż małe bloki używane przez ogólne systemy plików.

Co dokładnie dodaje YARN, co MapReduce samodzielnie nie miało?

YARN oddziela negocjacje zasobów na poziomie klastra od logiki dowolnego ramka przetwarzania, tak że wielu silników jak np. Spark, Tez i MapReduce mogą dzielone być tym samym fizycznym klastrzem i być harmonijnie zaplanowane względem siebie.

Dlaczego faza shuffle była taka granatowa dla MapReduce?

Faza shuffle wymaga sortowania i przenoszenia danych między każdym etapem mapowania a redukcji, a ponieważ MapReduce zapisuje intermedialne wyniki na dysk przy każdym granicznym punkcie etapu, wielokrotnie płaciło się koszt dysku i sieci w pipeline wielo-etapowym.

Wypróbuj na żywo

Wszystko powyżej działa bezpośrednio w Twojej przeglądarce — otwórz The Hadoop Ecosystem: HDFS, MapReduce & YARN i zmieniaj parametry podczas działania. Nic nie jest instalowane ani przesyłane na serwer, cały model działa w jednej karcie.

▶ Otwórz symulację The Hadoop Ecosystem: HDFS, MapReduce & YARN

Co znalazłeś?

Dodaj kroki odtworzenia (opcjonalnie)