MapReduce to sprawdzony sposób zrównoleglania zapytań o dane, ale czy ta alternatywa może oferować jeszcze więcej korzyści?
Kluczowe dania na wynos
- MapReduce i potok agregacji to dwie metody złożonego przetwarzania danych w MongoDB. Struktura agregacji jest nowsza i bardziej wydajna.
- MapReduce polega na określaniu oddzielnych funkcji mapowania i zmniejszania za pomocą JavaScript, podczas gdy potok agregacji wykorzystuje wbudowane operatory MongoDB.
- Potok agregacji jest zalecany przez MongoDB w celu uzyskania lepszej wydajności, ale MapReduce oferuje większą elastyczność i jest odpowiedni dla rozproszonych systemów plików, takich jak Hadoop.
MapReduce i potok agregacji to dwie metody, których możesz użyć do radzenia sobie ze złożonym przetwarzaniem danych w MongoDB. Struktura agregacji jest nowsza i znana ze swojej wydajności. Ale niektórzy programiści nadal wolą trzymać się MapReduce, który uważają za wygodniejszy.
W praktyce chcesz wybrać jedną z tych złożonych metod zapytań, ponieważ osiągają one ten sam cel. Ale jak one działają? Czym się różnią i z którego warto skorzystać?
Jak działa MapReduce w MongoDB
MapReduce w MongoDB pozwala przeprowadzać złożone obliczenia na dużej ilości danych i agregować wyniki w bardziej kompleksowy fragment. Metoda MapReduce posiada dwie funkcje: map i reduce.
Pracując z MapReduce w MongoDB, będziesz oddzielnie określać funkcje map i redukujące za pomocą JavaScript i wstawiać je do wbudowanego mapZredukuj zapytanie.
Funkcja map najpierw dzieli przychodzące dane na pary klucz-wartość — zwykle w oparciu o zmapowane grupowanie. W tym miejscu określasz sposób grupowania danych. Funkcja reduce uruchamia następnie niestandardowe obliczenia na wartościach w każdej grupie danych i agreguje wynik do oddzielnej kolekcji przechowywanej w bazie danych.
Jak działa potok agregacji w MongoDB
Potok agregacji w MongoDB jest ulepszoną alternatywą dla MapReduce. Podobnie jak MapReduce, umożliwia wykonywanie złożonych obliczeń i transformacji danych bezpośrednio w bazie danych. Ale agregacja nie wymaga pisania dedykowanych funkcji JavaScript, które mogą zmniejszyć wydajność zapytań.
Zamiast tego używa wbudowanych operatorów MongoDB do manipulowania, grupowania i obliczania danych. Następnie agreguje wyniki po każdym zapytaniu. W związku z tym potok agregacji jest bardziej konfigurowalny, ponieważ można dowolnie kształtować dane wyjściowe.
Czym różnią się zapytania między MapReduce a agregacją
Załóżmy, że chcesz obliczyć całkowitą sprzedaż artykułów na podstawie kategorii produktów. W przypadku MapReduce i agregacji kategorie produktów stają się kluczami, a sumy pozycji w ramach każdej kategorii stają się odpowiadającymi im wartościami.
Weźmy przykładowe surowe dane dla opisanego stwierdzenia problemu, które wygląda tak:
Rozwiążmy ten scenariusz problemu za pomocą MapReduce i potoku agregacji, aby rozróżnić ich zapytania i metody rozwiązywania problemów.
Metoda MapReduce
Używając Pythona jako podstawowego języka programowania, mapZredukuj zapytanie opisanego wcześniej scenariusza problemu wygląda następująco:
import pymongo
client = pymongo.MongoClient(
"mongodb://localhost/"
)db = client.my_database
sales = db["sales"]
map_function =
function() {
emit(this.Section, this.Sold);
}reduce_function =
function(key, values) {
return Array.sum(values);
}result = db.command(
"mapReduce",
"sales",
map=map_function,
reduce=reduce_function,
out="section_totals"
)
doc = [doc for doc in db.section_totals.find()]
print(doc)
Jeśli porównasz to z oryginalnymi przykładowymi danymi, zobaczysz takie dane wyjściowe:
[{
'_id': 'Adidas',
'value': 9.0
},{
'_id': 'Nike',
'value': 12.0
}]
Przyjrzyj się uważnie, a powinieneś zobaczyć, że mapa i redukcja procesorów są Funkcje JavaScriptu wewnątrz zmiennych Pythona. Kod przekazuje je do mapZredukuj zapytanie, które określa dedykowaną kolekcję wyjściową (sekcja_sumy).
Korzystanie z potoku agregacji
Oprócz zapewnienia płynniejszego wyniku zapytanie potoku agregacji jest bardziej bezpośrednie. Oto jak wygląda poprzednia operacja z potokiem agregacji:
import pymongo
client = pymongo.MongoClient("mongodb://localhost/")
db = client.funmi
sales = db["sales"]pipeline = [
{
"$group": {
"_id": "$Section",
"totalSold": { "$sum": "$Sold" }
}
},
{
"$project": {
"_id": 0,
"Section": "$_id",
"TotalSold": "$totalSold"
}
}
]
result = list(sales.aggregate(pipeline))
print(result)
Uruchomienie tego zapytania agregującego da następujące wyniki, które są podobne do wyników z podejścia MapReduce:
[{
'Section': 'Nike',
'TotalSold': 12
},{
'Section': 'Adidas',
'TotalSold': 9
}]
Wydajność i szybkość zapytań
Potok agregacji jest zaktualizowaną wersją MapReduce. MongoDB zaleca używanie potoku agregacji zamiast MapReduce, ponieważ ten pierwszy jest bardziej wydajny.
Próbowaliśmy potwierdzić to twierdzenie podczas uruchamiania zapytań w poprzedniej sekcji. A gdy wykonywano je równolegle na maszynie z 12 GB pamięci RAM, potok agregacji wydawał się szybszy, średnio 0,014 sekundy podczas wykonywania. Wykonanie zapytania MapReduce zajęło tej samej maszynie średnio 0,058 sekundy.
To nie jest miara do podsumowania ich występów, ale wydaje się, że potwierdza zalecenie MongoDB. Możesz uznać tę różnicę czasu za nieistotną, ale sumuje się znacznie w tysiącach lub milionach zapytań.
Plusy i minusy MapReduce
Rozważ zalety i wady MapReduce, aby określić, gdzie wyróżnia się w przetwarzaniu danych.
Zalety
- Daje większą elastyczność dostosowywania, ponieważ osobno piszesz mapę i redukujesz funkcje.
- Możesz łatwo zapisać dane wyjściowe w nowej kolekcji MongoDB w bazie danych.
- Możesz użyć MapReduce w rozproszonych systemach plików jak Hadoop, który łatwo integruje się z MongoDB.
- Jego obsługa skryptów innych firm sprawia, że jest on bardziej skalowalny i łatwiejszy do nauczenia niż potok agregacji. Więc ktoś z doświadczeniem w programowaniu JavaScript może zaimplementować MapReduce.
Cons
- Wymaga skryptów innych firm; przyczynia się to do jego niższej wydajności niż potok agregacji.
- MapReduce może być nieefektywny pod względem pamięci i wymagać kilku węzłów, zwłaszcza w przypadku zbyt złożonych danych.
- Nie nadaje się do przetwarzania danych w czasie rzeczywistym, ponieważ zapytania mogą być powolne.
Plusy i minusy potoku agregacji
A co z potokiem agregacji? Rozważenie jego mocnych i słabych stron zapewnia lepszy wgląd.
Zalety
- Zapytanie jest wieloetapowe, zwykle krótsze, bardziej zwięzłe i bardziej czytelne.
- Potok agregacji jest bardziej wydajny i oferuje znaczną poprawę w stosunku do MapReduce.
- Obsługuje wbudowane operatory MongoDB, które umożliwiają elastyczne projektowanie zapytań.
- Obsługuje przetwarzanie danych w czasie rzeczywistym.
- Potok agregacji można łatwo przetworzyć w MongoDB i nie wymaga skryptów innych firm.
- Możesz utwórz nową kolekcję MongoDB dla wyjść, jeśli chcesz je zapisać.
Cons
- Może nie być tak elastyczny jak MapReduce w przypadku bardziej złożonych struktur danych. Ponieważ nie korzysta ze skryptów innych firm, ogranicza Cię do określonej metody agregowania danych.
- Jego wdrożenie i krzywa uczenia się mogą stanowić wyzwanie dla programistów z niewielkim doświadczeniem lub bez doświadczenia z MongoDB.
Kiedy należy używać MapReduce lub Aggregation Pipeline?
Ogólnie rzecz biorąc, najlepiej jest wziąć pod uwagę wymagania dotyczące przetwarzania danych przy wyborze między MapReduce a potokiem agregacji.
Idealnie, jeśli Twoje dane są bardziej złożone, wymagają zaawansowanej logiki i algorytmów w rozproszonym systemie plików, MapReduce może się przydać. Wynika to z faktu, że można łatwo dostosować funkcje zmniejszania map i wprowadzić je do kilku węzłów. Wybierz MapReduce, jeśli Twoje zadanie przetwarzania danych wymaga skalowalności poziomej zamiast wydajności.
Z drugiej strony potok agregacji jest bardziej odpowiedni do obliczania złożonych danych, które nie wymagają niestandardowej logiki ani algorytmów. Jeśli Twoje dane znajdują się tylko w MongoDB, sensowne jest użycie potoku agregacji, ponieważ zawiera on wiele wbudowanych operatorów.
Potok agregacji jest również najlepszy do przetwarzania danych w czasie rzeczywistym. Jeśli wymagania dotyczące obliczeń stawiają wydajność przed innymi czynnikami, warto wybrać potok agregacji.
Uruchamiaj złożone obliczenia w MongoDB
Chociaż obie metody MongoDB są zapytaniami do przetwarzania dużych zbiorów danych, mają wiele wspólnych cech. Zamiast pobierania danych przed wykonaniem obliczeń, co może być wolniejsze, obie metody bezpośrednio wykonują obliczenia na danych przechowywanych w bazie danych, zwiększając wydajność zapytań.
Jednak jeden zastępuje drugi pod względem wydajności i dobrze zgadłeś. Potok agregacji przewyższa MapReduce wydajnością i wydajnością. Chociaż możesz chcieć za wszelką cenę zastąpić MapReduce potokiem agregacji, nadal istnieją określone obszary zastosowań, w których użycie MapReduce ma większy sens.