Contents

Map-Reduce vs. Aggregation Pipeline w MongoDB

Kluczowe dania na wynos

MapReduce, technika wykorzystywana przez MongoDB do skomplikowanej manipulacji danymi, została zastąpiona przez Aggregation Pipeline pod względem wydajności i nowości.

MapReduce w MongoDB zapewnia mechanizm przetwarzania dużych zbiorów danych poprzez dzielenie ich na mniejsze fragmenty i dystrybucję pracy na wiele węzłów w klastrze. Takie podejście pozwala na wydajne równoległe przetwarzanie danych. Natomiast struktura agregacji opiera się na wbudowanych operatorach do wykonywania operacji, takich jak filtrowanie, sortowanie i grupowanie na zbiorze danych przechowywanym w samej bazie danych. Operatory te są przeznaczone do użycia z określonymi typami danych i zapewniają bardziej usprawniony proces w porównaniu z dostosowywaniem wymaganym w MapReduce.

MongoDB sugeruje wykorzystanie potoku agregacji w celu optymalizacji wydajności, jednak MapReduce zapewnia większy stopień wszechstronności i dobrze nadaje się do rozproszonych systemów plików, takich jak te, które można znaleźć w Hadoop.

MapReduce i potok agregacji to dwa popularne podejścia wykorzystywane do obsługi skomplikowanych zadań przetwarzania danych w obszarze MongoDB. Chociaż struktura agregacji stanowi nowszą innowację, zyskała uznanie za wyjątkową wydajność. Jednak pozostaje grupa programistów, którzy nadal preferują MapReduce jako preferowaną metodę, powołując się na znajomość i łatwość użycia jako czynniki napędzające tę preferencję.

Zasadniczo wybór jednej z tych skomplikowanych strategii zapytań jest niezbędny, ponieważ wszystkie prowadzą do tego samego wyniku. Kluczowe jest jednak zrozumienie ich podstawowych mechanizmów, rozróżnień i optymalnego wykorzystania.

Jak działa MapReduce w MongoDB

mapowanie i redukcja.

Korzystając z MapReduce w kontekście MongoDB, można niezależnie nakreślić operacje mapowania i redukcji, stosując JavaScript i włączyć je odpowiednio do nieodłącznej konstrukcji zapytania mapReduce.

Funkcja map służy do rozdzielania przychodzących informacji na pary klucz-wartość, które zazwyczaj opierają się na predefiniowanych kategoryzacjach. W tym momencie określa się metodę grupowania danych. Następnie funkcja reduce wykonuje na zamówienie obliczenia na wartościach powiązanych z każdym zestawem danych i kompiluje wynik do oddzielnego repozytorium utrzymywanego w bazie danych.

Jak działa potok agregacji w MongoDB

Potok agregacji MongoDB służy jako bardziej zaawansowany substytut MapReduce, umożliwiając użytkownikom przeprowadzanie skomplikowanych obliczeń i manipulowanie danymi w samej bazie danych. W przeciwieństwie do MapReduce, który wymaga tworzenia określonych funkcji JavaScript dostosowanych do optymalizacji wydajności zapytań, proces agregacji eliminuje ten wymóg, co skutkuje usprawnioną funkcjonalnością przy zachowaniu możliwości wysokiej wydajności.

Zamiast polegać na zewnętrznych bibliotekach do manipulacji danymi, ta metoda wykorzystuje możliwości wbudowanych operatorów MongoDB do wykonywania operacji, takich jak grupowanie i obliczenia. Wyniki są następnie grupowane w potoku agregacji, co zapewnia wysoki stopień elastyczności w zakresie strukturyzowania wyników końcowych.

Czym różnią się zapytania między MapReduce a agregacją

Aby określić zagregowane dane dotyczące sprzedaży dla różnych kategorii produktów przy użyciu platformy MapReduce z agregacją danych, kategorie produktów służą jako unikalne identyfikatory lub „klucze”, podczas gdy sumy częściowe sprzedaży poszczególnych produktów stanowią powiązane „wartości” dla każdego odpowiedniego klucza.

Biorąc pod uwagę konkretne sformułowanie problemu i towarzyszący mu zestaw danych, często pomocne jest przedstawienie reprezentatywnej próbki danych w celu zilustrowania jego charakterystyki i struktury. W przypadku przedstawionego problemu hipotetyczny zestaw surowych danych można przedstawić w następujący sposób: pythonimport pandas as pdfrom sklearn.model_selection import train_test_splitfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.metrics import precision_scoredf=pd.read_csv(‘data.csv’) # wczytaj ramkę danych z pliku CSVX=df[[‘feature1’,‘feature2’]] # wybierz odpowiednie funkcjey=df[’target’] # target variabletrain_size=int(0.8 * len(df)) # /pl/images/sample-data-mongodb.jpg

Możemy podejść do tego problemu, wykorzystując framework MapReduce w połączeniu z potokiem do agregacji, ponieważ pozwoli nam to rozróżnić różnice w naszych technikach zapytań i rozwiązywania problemów.

Metoda MapReduce

Wykorzystując Pythona jako podstawę programowania, implementacja MapReduce powyższej sytuacji problemowej przyjmuje następującą postać:

 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)

Po wykonaniu tej operacji na początkowym zbiorze danych kolejne dane wyjściowe będą miały podobny wzór do następującego:

 [{
  '_id': 'Adidas',
  'value': 9.0
},{
  '_id': 'Nike',
  'value': 12.0
}] 

Po bliższym przyjrzeniu się można zauważyć, że procesory Map i Reduce w tym skrypcie są zamknięte jako funkcje JavaScript, zawarte w zmiennych Pythona. Zmienne te są następnie przekazywane do zapytania MapReduce, które kieruje je do przydzielonego zbioru wyjściowego oznaczonego nazwą „section\_totals”.

Korzystanie z potoku agregacji

Włączenie potoku agregacji zapewnia bardziej usprawniony i bezpośredni wynik w porównaniu z oryginalną metodą. Poniżej przedstawiono wyżej wspomniany proces z wykorzystaniem potoku 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)

Oczekuje się, że wykonanie tej operacji agregacji da wyniki bardzo podobne do tych uzyskanych za pomocą metodologii MapReduce:

 [{
  'Section': 'Nike',
  'TotalSold': 12
},{
  'Section': 'Adidas',
  'TotalSold': 9
}] 

Wydajność i szybkość zapytań

MongoDB opowiada się za wykorzystaniem zaawansowanego potoku agregacji w porównaniu z tradycyjnym MapReduce ze względu na jego zwiększoną wydajność i usprawnioną funkcjonalność.

W poprzedniej sekcji przeprowadziliśmy eksperyment, w którym próbowaliśmy uzasadnić nasze twierdzenie, wykonując jednocześnie zapytania na komputerze wyposażonym w 12 gigabajtów pamięci RAM. Wyniki wykazały, że potok agregacji działał wydajniej, a jego wykonanie trwało średnio tylko 0,014 sekundy. W przeciwieństwie do tego ten sam system potrzebował około 0,058 sekundy na przetworzenie zapytania MapReduce.

Chociaż może to nie być dokładna miara wydajności, dane wydają się potwierdzać sugestię MongoDB. Wpływ tej rozbieżności może wydawać się nieistotny przy rozważaniu poszczególnych zapytań; jednak jego skumulowany efekt staje się znaczny w przypadku wielu próśb, od tysięcy do milionów.

Plusy i minusy MapReduce

Oceń zalety i wady MapReduce, aby określić jego mocne strony w przetwarzaniu danych.

Plusy

Wykorzystując oddzielną implementację zarówno funkcji mapowania, jak i redukcji, RDD Apache Spark zapewnia większy stopień adaptacji, umożliwiając użytkownikom dostosowanie potoku przetwarzania do określonych wymagań.

Korzystając z bezproblemowej integracji tej aplikacji z MongoDB, użytkownicy mogą bez wysiłku przechowywać wygenerowane dane wyjściowe w nowo utworzonej kolekcji w swojej bazie danych.

MapReduce to potężne narzędzie, które można wykorzystać w rozproszonych systemach plików, takich jak Hadoop, aby bezproblemowo zintegrować się z MongoDB.

Kompatybilność z zewnętrznymi językami skryptowymi, takimi jak JavaScript, zwiększa zarówno skalowalność, jak i dostępność, ułatwiając osobom z wcześniejszym doświadczeniem w programowaniu efektywne stosowanie koncepcji MapReduce.

Cons

Wykorzystanie zewnętrznych zasobów skryptowych jest warunkiem wstępnym wdrożenia tej metody, co nieuchronnie skutkuje zmniejszoną wydajnością w porównaniu z potokiem agregacji.

MapReduce, chociaż jest skutecznym rozwiązaniem do przetwarzania dużych ilości danych rozproszonych na wielu komputerach, może wykazywać problemy z wydajnością pamięci w przypadku skomplikowanych zestawów danych, które wymagają dużej mocy obliczeniowej. Często wymaga to wykorzystania wielu węzłów obliczeniowych do efektywnego zarządzania i przetwarzania takich informacji.

Przetwarzanie danych w czasie rzeczywistym może wiązać się z pewnymi wyzwaniami, ponieważ na zapytania może niekorzystnie wpływać wolniejsza wydajność w porównaniu ze scenariuszami innymi niż w czasie rzeczywistym.

Plusy i minusy potoku agregacji

Bardziej szczegółowe zbadanie potoku agregacji, biorąc pod uwagę zarówno jego zalety, jak i wady, pozwala na głębsze zrozumienie jego możliwości.

Plusy

Zapytanie ma charakter wieloaspektowy, charakteryzuje się zwięzłością, jasnością i łatwością zrozumienia.

Implementacja potoku agregacji wykazuje imponujący wzrost wydajności w porównaniu z tradycyjnymi metodami MapReduce, co skutkuje godną uwagi poprawą wydajności.

Aplikacja oferuje kompleksowy zestaw zintegrowanych operatorów MongoDB, umożliwiając użytkownikom konstruowanie zapytań o niezwykłej wszechstronności i możliwościach adaptacji.

⭐Obsługuje przetwarzanie danych w czasie rzeczywistym.

Integrację potoku agregacji z MongoDB można bezproblemowo przeprowadzić bez polegania na zewnętrznych skryptach lub oprogramowaniu.

Masz możliwość utworzenia zupełnie nowej kolekcji w swojej bazie danych MongoDB do przechowywania wygenerowanych wyników, jeśli chcesz je zachować.

Cons

Ograniczenia narzucone przez podejście Flink do przetwarzania danych w porównaniu z modelem Apache Spark MapReduce są takie, że może on nie wykazywać tego samego poziomu adaptacji i wszechstronności podczas obsługi skomplikowanych struktur danych. Wynika to z polegania na przetwarzaniu strumieniowym zamiast wykorzystywania zewnętrznych języków skryptowych do agregacji danych, co ogranicza zakres dostępnych metod manipulacji danymi.

Biegłość wymagana do efektywnego wykorzystania i zrozumienia zawiłości implementacji MongoDB może stanowić ogromną przeszkodę dla programistów, którzy są nowicjuszami w tym systemie bazodanowym i nie mają wcześniejszego kontaktu z jego cechami i funkcjonalnościami.

Kiedy należy używać MapReduce lub Aggregation Pipeline?

/pl/images/question-mark-logos-with-code.jpg

Przy podejmowaniu decyzji o wykorzystaniu MapReduce lub potoku agregacji do przetwarzania danych, zaleca się uważną ocenę konkretnych potrzeb danego projektu pod kątem wymagań dotyczących przetwarzania danych.

MapReduce oferuje idealne rozwiązanie w przypadku skomplikowanych zbiorów danych, które wymagają skomplikowanych operacji logicznych i procesów algorytmicznych w ramach zdecentralizowanego systemu zarządzania plikami. Dostosowując funkcje MapReduce do konkretnych wymagań i rozdzielając je na wiele jednostek obliczeniowych, można skutecznie skalować zadania przetwarzania danych w poziomie, zamiast nadawać priorytet optymalizacji wydajności.

W przeciwieństwie do tego potok agregacji doskonale radzi sobie z przetwarzaniem skomplikowanych informacji, które nie wymagają dostosowanego rozumowania ani metodologii. Gdy Twoje dane są przechowywane wyłącznie w MongoDB, wykorzystanie potoku agregacji staje się racjonalnym wyborem ze względu na szeroki wachlarz zintegrowanych operacji.

Potok agregacji oferuje doskonałe rozwiązanie do przetwarzania danych w czasie rzeczywistym, gdy wydajność obliczeniowa ma ogromne znaczenie. Jest to zalecane jako preferowana opcja w takich scenariuszach.

Uruchom złożone obliczenia w MongoDB

MongoDB stosuje dwa różne podejścia do wykonywania operacji przetwarzania dużych zbiorów danych i chociaż każda metodologia ma swoje unikalne cechy, istnieje między nimi kilka godnych uwagi różnic. W przeciwieństwie do konwencjonalnej praktyki wstępnego pobierania danych przed przeprowadzeniem obliczeń, co może skutkować mniejszą wydajnością, techniki te wybierają zamiast tego przeprowadzanie obliczeń bezpośrednio na informacjach znajdujących się w samej bazie danych. To bezpośrednie podejście do obliczeń zapewnia bardziej usprawnione wykonywanie zapytań, zwiększając w ten sposób ogólną wydajność.

Chociaż prawdą jest, że potok agregacji zwykle przewyższa MapReduce zarówno pod względem szybkości, jak i wydajności, należy zauważyć, że istnieją pewne scenariusze, w których użycie MapReduce może być bardziej odpowiednią opcją. Mimo to idealnie byłoby nadać priorytet wykorzystaniu potoku agregacji, gdy tylko jest to możliwe, ze względu na jego doskonałą wydajność.