Wybierz region
pl
  • PL
  • EN
Wydrukuj

Spark dla .NET Developerów w przykładach dla .NET Core. Część 1

W poprzedniej serii wpisów mojego autorstwa poruszyłem temat Hadoopa i narzędzi zbudowanych dla niego. W tym wpisie chciałem zapoczątkować nową serię związaną z innym narzędziem wykorzystywanym do eksploracji danych dla Big Data, a jest nim Apache Spark.

Historia Apache Spark

Zacznijmy może od tego czym jest Apache Spark a potem płynnie przejdziemy do motywacji i historii jego powstania.  Apache Spark jest to ujednolicone narzędzie analityczne do wykonywania procesów na danych dużej skali. Testowe i rozwojowe prace nad projektem rozpoczęły się już w roku 2009 w ramach UC Berkley AMPLab. Pierwsza jego inicjalna wersja powstała w roku 2014 już w ramach Apache Foundation Group.

 

Powody powstania Apache Spark

Projekt ten był próbą znalezienia rozwiązań problemów, które przyniósł ze sobą Hadoop w procesie przetwarzania dużej ilości danych. Podstawowym problem, który należało rozwiązać to szybkość działania. Program MapReduce podczas wykonywania musiał odczytywać duże partie danych, jednak najbardziej czasochłonny był zapis tych danych. Jeżeli program składał się z wielu takich programów były duże straty w czasie działania spędzone na odczycie i zapisie. Innymi problemami, które należało rozwiązać to:

  • Czytelność – złożenie wielu programów MapReduce utrudniało analizę
  • Ekspresywność – kod powinien być bardziej zwarty
  • Testowalność – łatwy w testowaniu
  • Interaktywność - powinna być możliwość interaktywnej pracy zamiast tylko pisania i kompilowania programów , które piszemy i włączamy
  • Unifikacja - system narzędzi do Hadoop bardzo się rozrastał i wymagał unifikacji 

Części  Apache Spark

Spójrzmy teraz z jakich części składa się Apache Spark

  • Spark SQL – wykonywanie zapytań dotyczących danych w języku podobnym do SQL
  • Spark Streaming – do wykonywania analizy danych strumieniowych
  • MLib – biblioteka z algorytmami do Machine Learning
  • GraphX – bibliotek do pracy z grafami 

 

Języki programowania używane w Apache Spark 

Języki programowania w jakich można pisać aplikacje dla Apache Spark to:

  • Scala (język w którym stworzono Spark)
  • Java
  • Python
  • R

W maju 2019  w ramach projektu Open Source Microsoft wydał pierwszą wersję .NET for Apache Spark, która umożliwia pisanie także programów na tej platformie w .NET Core. W  drugiej części serii skupimy się na pisaniu aplikacji właśnie w tym języku.

 

Opis struktur Apache Spark

W końcowej części tego wpisu skupimy się na strukturach danych, które napotkamy podczas używania Sparka. Prześledzimy je w chronologii jakiej powstały. Omówimy ich podstawowe cechy i właściwości. Postaramy się także wyznaczyć przypadki ich użycia w obecnej wersji 2 dla platformy Apache Spark.

        

Struktura RDD

Zacznijmy od najstarszej struktury a jest nią RDD (Resilient Distributed Dataset). Pojawiła się ona już w wersji 1.0 tego projektu. RDD udostępnia wiele metod transformacji typu map, filter oraz reduce do obliczeń danych. Metody opisane powyżej powodują powstanie nowych struktur RDD, czyli ewaluacja tych operacji jest wykonywania leniwie. RDD reprezentuje tylko dane, które powstaną, a same operacje nie są wykonywane. Dopiero, gdy wykonamy operacje akcji na tej strukturze np.: collect lub saveAsObjectFile operacje zostaną faktycznie wykonane na danych.

        

Struktura DataFrame 

Następną w chronologii strukturą, która powstała dla Apache Spark jest DataFrame.  Struktura ta jest rozwinięciem RDD. Dodano w niej organizacje danych za pomocą kolumn. Metody w niej dodane są podobne do operacji  znanych nam z SQL. Możemy jak w SQL łączyć wiele DataFrame ze sobą oraz wykonywać operację grupowania i agregacji. Wiele opisywanych operacji zwraca w wyniku DataFrame co oznacza, że ich ewaluacja jest tak samo leniwa jak w RDD. Dopiero specyficzne operacje akcji powodują ich faktyczne wykonanie. Struktura ta posiada optymalizację dla wykonanych zapytań i zajmuje mniej miejsca w pamięci niż RDD.

 

Struktura DataSet

Struktura, która pojawiła się najpóźniej i próbuje łączyć zalety zarówno RDD z szybkością działania DataFrame (wykorzystuje ten sam optymalizator zapytań). DataSet mogą być konstruowane z obiektów JVM  i manipulacje na nich możemy wykonywać operacjami transformacji takimi jak map, flatMap, filter itp. Jedynie języki oparte na JVM (Scala, Java) mają pełną obsługę API dla tej struktury.

 

Przypadki użycia struktur

Używamy RDD gdy:

  • Potrzebujemy nisko poziomową kontrolę na swoim zbiorze danych
  • Dane nie posiadają struktury jak np. dane strumieniowe
  • Potrzebujemy wykonywania operacji funkcyjnych a nie specyficznych dla domeny
  • Nie potrzebujemy struktury kolumnowej
  • Nie potrzebujemy wykonywać optymalizacji danych i operacji zawartych w DataFrame oraz DataSet

Używamy DataFrame  lub DataSet gdy:

  • Potrzebujemy wysoką poziomową abstrakcję dla danych
  • Interesują nas operacje wysoko poziomowe czyli operacje filtrowania, mapowania, grupowania podobne do operacji wykonywanych w języku SQL
  • Dane posiadają strukturę specyficzną dla domeny
  • Chcemy wykorzystywać optymalizator zapytań
  • Chcemy wykonywać bezpośrednie mapowania struktur specyficznych dla swojego języka programowania (opartego na JVM) od razu do Sparka

 

Podsumowując możemy zauważyć, że Apache Spark rozwija wiele konceptów, które zapoczątkował Hadoop do przetwarzania dużych zbiorów danych. Jest także próbą znalezienia rozwiązań problemów, które przyniósł Hadoop, a w szczególności tych związanych z wydajnością wykonywanych operacji.

W kolejny wpisie skupimy się na konfiguracji środowiska dla .NET for Apache Spark oraz napiszemy pierwszy program w .NET Core dla tego środowiska.


Remigiusz Mrozek

Programista .NET oraz Java z 16 letnim stażem. Pasjonat nowych technologii. Obecnie skupia się w wolnym czasie na zagadnieniach związanych z Big Data i Machine Learning.


Wydrukuj