W tym poście spróbuję przedstawić Ci główną różnice pomiędzy metodami Apache Spark RDD ReduceByKey vs RDD GroupByKey i dlaczego powinieneś unikać tej drugiej. A dlaczego? Odpowiedź kryję się pod pojęciem shuffle.
Shuffle w Apache Spark RDD ReduceByKey vs RDD GroupByKey
W środowisku gromadzenia danych przetwarzania równoległego tj. https://hadoop.apache.org/ ważne jest, aby podczas obliczeń „wymiana” danych pomiędzy nodami była jak najmniejsza. „Wymiana danych” to nic innego jak ruch sieciowy pomiędzy maszynami. Dodatkowo za każdym razem dane muszą być serializowane i deserializowane. Im mniej danych przesyłamy tym mniej danych serializujemy deserializujemy. Każdy z tych kroków niesie za sobą zużycie mocy obliczeniowe, pamięci i co najważniejsze i jednocześnie najgorsze – czasu.
Przyjrzyjmy się poniższym dwóm analizom, aby na przykładzie zobaczyć co różni te dwie metody i dlaczego jedna z nich jest lepsza. (Apache Spark RDD ReduceByKey vs RDD GroupByKey)
RDD ReduceByKey
Zaczniemy od metody ReduceByKey, czyli tej „lepszej”. Zielone prostokąty przedstawiają poszczególne nody w klastrze.
Przeanalizujmy node 1, czyli pierwszy od lewej. Mamy tam trzy pary danych (big,1), (big,2) i (data,1). Chcemy zliczyć ile razy występuje każde słowo. Widzimy, że na nodzie lokalnie zostały obliczone sumy dla każdego słowa (big,2) (data,1). Możemy inaczej powiedzieć, że operacja reduce została najpierw wykonana na każdym nodzie bazując na swojej lokalnej porcji danych, zanim dane wysłane zostały do nodów, gdzie odbędzie się ostateczna faza reduce, dzięki której otrzymamy wynik. (Apache Spark RDD ReduceByKey vs RDD GroupByKey)
Dzięki wykonaniu operacji reduce lokalnie ograniczmy ilość danych, która „krąży” pomiędzy nodami w klastrze. Dodatkowo zmniejszamy ilość danych, które zostały Serializowane i Deserialozowene.

RDD GroupByKey
Teraz przyjrzyjmy się co się dzieje w przypadku, gdy używamy metody RDD GroupByKey. Jak widać na poniższym rysunku nie występuje faza reduce. W wyniku czego wymiana danych pomiędzy nodami jest większa. Dodatkowo pamiętajmy o procesie Serializacji i Deserializacji, który w tym przypadku musi być wykonany na większej ilości danych. (Apache Spark RDD ReduceByKey vs RDD GroupByKey)
