Kilka lat temu MapReduce został okrzyknięty rewolucją programowania rozproszonego. Byli też krytycy, ale ogólnie był entuzjastyczny szum. Zostało nawet opatentowane! [1]
Nazwa nawiązuje map
i reduce
programowania funkcjonalnego, ale kiedy czytam (Wikipedia)
Krok mapy: węzeł główny pobiera dane wejściowe, dzieli je na mniejsze podproblemy i rozdziela je na węzły robocze. Węzeł roboczy może to po kolei zrobić ponownie, prowadząc do wielopoziomowej struktury drzewa. Węzeł roboczy przetwarza mniejszy problem i przekazuje odpowiedź z powrotem do swojego węzła głównego.
Zmniejsz krok: węzeł główny zbiera następnie odpowiedzi na wszystkie podproblemy i łączy je w jakiś sposób, aby uzyskać wynik - odpowiedź na problem, który pierwotnie próbował rozwiązać.
lub [2]
Elementy wewnętrzne MAP: [...] MAP dzieli wartość wejściową na słowa. [...] MAP ma na celu powiązanie każdej podanej pary klucz / wartość wejścia z potencjalnie wieloma pośrednimi parami klucz / wartość.
Wartości wewnętrzne REDUCE: [...] [REDUCE] wykonuje agregację imperatywną (powiedzmy redukcję): weź wiele wartości i zredukuj je do jednej wartości.
Nie mogę przestać myśleć: to podział i podbój (w znaczeniu Mergesort), prosty i prosty! Czy jest więc gdzieś (konceptualna) nowość w MapReduce, czy jest to tylko nowa implementacja starych pomysłów przydatnych w niektórych scenariuszach?
- Patent USA 7650331: „System i metoda wydajnego przetwarzania danych na dużą skalę” (2010)
- Model programowania MapReduce firmy Google - ponownie odwiedził R. Lämmel (2007)
Odpowiedzi:
M / R nie dzieli i podbija. Nie wymaga wielokrotnego zastosowania algorytmu do mniejszego podzbioru poprzedniego wejścia. Jest to potok (funkcja określona jako kompozycja prostszych funkcji), w którym etapy potoku zmieniają mapę i zmniejszają operacje. Różne etapy mogą wykonywać różne operacje.
MapReduce nie stanowi przełomu w teorii obliczeń - nie pokazuje nowego sposobu rozkładania problemu na prostsze operacje. To pokazuje, że szczególne prostsze operacje są praktyczne dla określonej klasy problemu.
Wkład papieru MapReduce był
Niektóre krytyki należą do tych klas:
źródło
EDIT (marzec 2014) Powinienem powiedzieć, że od tego czasu pracowałem więcej nad algorytmami modeli obliczeniowych typu MapReduce i czuję, że byłem zbyt negatywny. Technika Divide-Compress-Conquer, o której mówię poniżej, jest zaskakująco wszechstronna i może być podstawą algorytmów, które moim zdaniem są nietrywialne i interesujące.
Pozwól, że dam odpowiedź, która będzie znacznie gorsza od Mike'a pod względem kompleksowości, ale z modelu obliczeniowego / teorii algorytmów.
Dlaczego jest podniecenie : MapReduce przeplata obliczenia równoległe i sekwencyjne; każdy procesor ma dostęp do nietrywialnego fragmentu (np. ) wejścia i może na nim wykonywać nietrywialne operacje; to bardzo różni się od modeli PRAM i wydaje się interesującym pomysłem, który może prowadzić do nowych technik algorytmicznych. W szczególności niektóre problemy można rozwiązać w kilku rundach obliczeń (o stałej wielkości wejściowej), natomiast w pamięci PRAM w nie można rozwiązać żadnych niebanalnych problemów .o ( log n )O(nϵ) o(logn)
Dlaczego model jest dla mnie trochę frustrujący : Jedyną techniką algorytmiczną, która wydaje się działać, aby uzyskać algorytmy i jest nieco nowa, są następująceO(1)
Bardzo prosty przykład techniki: oblicz sumę liczb. Każdy procesor ma tablicy i oblicza sumę tej części. Następnie wszystkie sumy można połączyć na jednym procesorze, aby obliczyć całkowitą sumę. Nieco ciekawszym ćwiczeniem jest obliczenie wszystkich sum prefiksów w ten sposób (oczywiście w takim przypadku dane wyjściowe muszą być reprezentowane w sposób rozproszony). Lub obliczyć rozciągające się drzewo gęstego wykresu.O ( √n √O(n−−√) n−−√
Teraz myślę, że to naprawdę interesujący zwrot akcji dziel i zwyciężaj, przy czym po etapie podziału musisz skompresować rozwiązania podproblemowe, aby pojedynczy procesor mógł zwyciężyć. Wydaje się jednak, że jest to jedyna technika, jaką do tej pory wymyśliliśmy. Nie działa w przypadku problemów z rzadkimi grafami, takich jak na przykład rzadka łączność. Porównaj to z modelem przesyłania strumieniowego, który doprowadził do wielu nowych pomysłów, takich jak genialny algorytm próbkowania Flajoleta i Martina, algorytm deterministycznego parowania Misry i Griesa, moc prostych technik szkicowania itp.
Jako paradygmat programowania redukcja mapy okazała się bardzo udana. Moje komentarze traktują redukcję mapy jako interesujący model obliczeń. Dobre modele teoretyczne są trochę dziwne. Jeśli zbyt blisko podążają za rzeczywistością, są nieporęczne, ale co ważniejsze (aby pożyczyć termin od uczenia maszynowego) twierdzenia udowodnione dla modeli, które są zbyt specyficzne, nie uogólniają, tj. Nie trzymają się innych modeli. Dlatego chcemy wyodrębnić jak najwięcej szczegółów, jednocześnie pozostawiając wystarczająco dużo, aby rzucić nam wyzwanie, aby wymyślić nowe algorytmy. Wreszcie, te nowe pomysły powinny ostatecznie znaleźć drogę do prawdziwego świata. PRAM to jeden nierealistyczny model, który doprowadził do interesujących pomysłów, ale te pomysły rzadko okazały się przydatne do obliczeń równoległych w świecie rzeczywistym. Z drugiej strony streaming jest również nierealny, ale zainspirowało idee algorytmiczne, które są faktycznie stosowane w prawdziwym świecie. Widziećszkic odliczający min . Techniki szkicowania są w rzeczywistości również stosowane w systemach opartych na redukcji map.
źródło
Całkowicie się z Tobą zgadzam. Z perspektywy konceptualnej nie ma nic naprawdę nowego: Map / Reduce był pierwotnie znany w Parallel Computing jako model programowania przepływu danych. Jednak z praktycznego punktu widzenia Map / Reduce zaproponowany przez Google i wraz z kolejnymi implementacjami typu open source również zasilił Cloud Computing i jest teraz dość popularny w przypadku bardzo prostych równoległych rozkładów i przetwarzania. Oczywiście nie nadaje się do niczego, co wymaga złożonej domeny lub rozkładów funkcjonalnych.
źródło
Myślę, że trafiłeś w sedno swoim komentarzem.
Nie jest prawdą, że w funkcjonalnych mapach językowych można równolegle łączyć - język musi być czysty . (Uważam, że Haskell to jedyny niejasny język funkcjonalny w mainstreamie. Lisp, OCaml i Scala nie są czyste).
O zaletach czystego kodu wiemy już od czasów dzielenia czasu, kiedy inżynierowie po raz pierwszy potokowali swoje procesory. Dlaczego więc nikt nie używa czystego języka?
To jest naprawdę bardzo trudne. Programowanie w czystym języku często przypomina programowanie obiema rękami za plecami.
MR łagodzi nieco ograniczenie czystości i zapewnia ramy dla innych elementów (takich jak faza losowania), dzięki czemu dość łatwo jest napisać kod dystrybucyjny dla dużej części problemów.
źródło
count
zmienna współdzielona jest w twoim pseudo-kodzie; po prostu przekazanie bieżącej wartości dodo_something
powinno działać. Czy możesz podać przykład „prawdziwego” algorytmu D&C (Mergesort, Quicksort, ...), dla którego wywołania rekurencyjne zależą od siebie (po wysłaniu połączenia)?