Przetwarzanie rozległych zbiorów danych stanowi jedno z największych wyzwań dla współczesnych organizacji. Sytuacja komplikuje się jeszcze bardziej, gdy mamy do czynienia z ogromnymi ilościami danych generowanymi w czasie rzeczywistym.
W tym artykule zgłębimy temat przetwarzania big data, omówimy jego metody i przyjrzymy się dwóm popularnym narzędziom: Apache Kafka i Apache Spark.
Na czym polega przetwarzanie danych i jak się je realizuje?
Przetwarzanie danych to wszelkie operacje, automatyczne lub manualne, mające na celu gromadzenie, porządkowanie i organizowanie informacji w sposób logiczny i umożliwiający ich interpretację.
Kiedy użytkownik wyszukuje informacje w bazie danych, proces przetwarzania danych dostarcza mu odpowiednie wyniki. Wyszukane informacje są owocem tego procesu. Dlatego też, przetwarzanie danych jest kluczowym elementem technologii informatycznych.
W przeszłości, do przetwarzania danych wykorzystywano proste oprogramowanie. Jednak wraz z pojawieniem się big data, sytuacja uległa zmianie. Big data to ogromne zbiory danych, których objętość może przekraczać setki terabajtów, a nawet petabajty.
Co więcej, takie zbiory danych są nieustannie aktualizowane. Przykładem mogą być dane z centrów obsługi klienta, mediów społecznościowych czy giełdy. Dane te często nazywa się strumieniem danych – ciągłym, nieprzerwanym przepływem informacji. Charakteryzują się one brakiem określonych granic – nie można stwierdzić, kiedy strumień się rozpoczyna, a kiedy kończy.
Dane są przetwarzane w momencie, gdy docierają do miejsca docelowego. Niektórzy autorzy określają to mianem przetwarzania w czasie rzeczywistym lub online. Innym podejściem jest przetwarzanie wsadowe, gdzie pakiety danych są przetwarzane w ramach określonych okien czasowych, np. godzin lub dni. Często proces ten uruchamia się w nocy, konsolidując dane z całego dnia. Zdarza się jednak, że okna czasowe obejmują tydzień, a nawet miesiąc, generując przestarzałe raporty.
Najlepsze platformy do przetwarzania big data za pomocą strumieniowania, takie jak Kafka i Spark, są oparte na otwartym oprogramowaniu, co umożliwia wykorzystanie innych, różnorodnych i komplementarnych narzędzi. Dzięki temu, że są to rozwiązania open source, rozwijają się szybciej i oferują więcej możliwości. Strumienie danych są odbierane z różnych źródeł ze zmienną szybkością i bez żadnych zakłóceń.
Teraz szczegółowo przyjrzymy się dwóm najpopularniejszym narzędziom do przetwarzania danych i porównamy je ze sobą:
Apache Kafka
Apache Kafka to system przesyłania wiadomości, pozwalający na budowanie aplikacji strumieniowych z ciągłym przepływem danych. Stworzona pierwotnie przez LinkedIn, Kafka bazuje na dziennikach. Dziennik stanowi podstawową formę przechowywania, w której każda nowa informacja jest dopisywana na końcu pliku.
Kafka to jedno z najlepszych rozwiązań dla big data, ponieważ charakteryzuje się wysoką przepustowością. Dzięki Apache Kafka można nawet przekształcić przetwarzanie wsadowe w przetwarzanie w czasie rzeczywistym.
Apache Kafka jest systemem przesyłania wiadomości typu „publikuj-subskrybuj”, w którym aplikacja publikuje komunikaty, a aplikacja subskrybująca je odbiera. Czas pomiędzy publikacją a odebraniem wiadomości może wynosić milisekundy, co oznacza, że Kafka charakteryzuje się niskimi opóźnieniami.
Jak działa Kafka?
Architektura Apache Kafka składa się z producentów, konsumentów i samego klastra. Producentem jest dowolna aplikacja, która publikuje komunikaty w klastrze. Konsumentem jest dowolna aplikacja, która odbiera wiadomości z Kafki. Klaster Kafka to zestaw węzłów, które działają jako jedna instancja usługi przesyłania wiadomości.
Działanie Kafki
Klaster Kafka składa się z kilku brokerów. Broker to serwer Kafka, który odbiera komunikaty od producentów i zapisuje je na dysku. Każdy broker zarządza listą tematów, a każdy temat jest dzielony na partycje.
Po odebraniu wiadomości, broker wysyła je do zarejestrowanych konsumentów dla każdego tematu.
Ustawieniami Apache Kafka zarządza Apache Zookeeper, który przechowuje metadane klastra, takie jak lokalizacje partycji, lista nazw, lista tematów i dostępne węzły. W ten sposób Zookeeper utrzymuje synchronizację pomiędzy różnymi elementami klastra.
Zookeeper jest istotny, ponieważ Kafka jest systemem rozproszonym, co oznacza, że zapis i odczyt są wykonywane przez wielu klientów jednocześnie. W przypadku awarii, Zookeeper wybiera zastępcę i przywraca działanie.
Przykłady zastosowań
Kafka stała się popularna, szczególnie jako narzędzie do przesyłania wiadomości, ale jej wszechstronność pozwala na wykorzystanie w wielu różnych scenariuszach, takich jak poniżej.
Wiadomości
Asynchroniczna forma komunikacji, która oddziela komunikujące się strony. W tym modelu jedna strona wysyła dane jako wiadomość do Kafki, a inna aplikacja wykorzystuje je później.
Śledzenie aktywności
Umożliwia przechowywanie i przetwarzanie danych śledzących interakcje użytkownika ze stroną internetową, takie jak wyświetlenia strony, kliknięcia, wprowadzanie danych itp. Tego typu działania zazwyczaj generują ogromne ilości danych.
Metryki
Obejmuje agregację danych i statystyk z wielu źródeł w celu wygenerowania centralnego raportu.
Agregacja logów
Centralnie agreguje i przechowuje pliki dziennika pochodzące z innych systemów.
Przetwarzanie strumieniowe
Przetwarzanie potoków danych składa się z wielu etapów, w których surowe dane z tematów są pobierane, agregowane, wzbogacane lub przekształcane w inne tematy.
W celu obsługi tych funkcji, platforma udostępnia trzy interfejsy API:
- Streams API: działa jako procesor strumieniowy, który pobiera dane z jednego tematu, przetwarza je i zapisuje w innym.
- Connectors API: umożliwia łączenie tematów z istniejącymi systemami, takimi jak relacyjne bazy danych.
- Interfejsy API producenta i konsumenta: umożliwiają aplikacjom publikowanie i wykorzystywanie danych Kafki.
Zalety
Replikowane, partycjonowane i uporządkowane
Wiadomości w Kafce są replikowane na partycjach w węzłach klastra w kolejności, w jakiej docierają, co zapewnia bezpieczeństwo i szybkość dostarczania.
Transformacja danych
Dzięki Apache Kafka, transformacja przetwarzania wsadowego w przetwarzanie w czasie rzeczywistym jest możliwa za pomocą interfejsu API strumieni ETL wsadowych.
Sekwencyjny dostęp do dysku
Apache Kafka przechowuje komunikaty na dysku, a nie w pamięci, aby przyspieszyć ich przetwarzanie. Dostęp do pamięci jest szybszy w większości przypadków, zwłaszcza gdy chodzi o dostęp do danych w losowych miejscach w pamięci. Jednak Kafka wykorzystuje dostęp sekwencyjny i w tym przypadku dysk jest bardziej wydajny.
Apache Spark
Apache Spark to silnik przetwarzania dużych zbiorów danych i zestaw bibliotek do przetwarzania danych równoległych w klastrach. Spark to ewolucja Hadoop i paradygmatu programowania Map-Reduce. Może być 100 razy szybszy dzięki efektywnemu wykorzystaniu pamięci, która nie przechowuje danych na dyskach podczas przetwarzania.
Spark jest zorganizowany na trzech poziomach:
- Interfejsy API niskiego poziomu: ten poziom obejmuje podstawowe funkcje do uruchamiania zadań i inne funkcje wymagane przez pozostałe komponenty. Do ważnych funkcji tej warstwy należy również zarządzanie bezpieczeństwem, siecią, planowaniem i logicznym dostępem do systemów plików HDFS, GlusterFS, Amazon S3 i innych.
- Strukturyzowane interfejsy API: poziom Strukturyzowanego interfejsu API zajmuje się manipulacją danymi za pomocą zbiorów danych DataSet lub DataFrames, które można odczytywać w formatach takich jak Hive, Parquet, JSON i innych. Za pomocą SparkSQL (API, które pozwala pisać zapytania w SQL) można przetwarzać dane w dowolny sposób.
- Wysoki poziom: na najwyższym poziomie znajduje się ekosystem Spark z różnymi bibliotekami, w tym Spark Streaming, Spark MLlib i Spark GraphX. Są one odpowiedzialne za obsługę przetwarzania strumieniowego i powiązanych procesów, takich jak odzyskiwanie po awarii, tworzenie i weryfikację klasycznych modeli uczenia maszynowego oraz przetwarzanie wykresów i algorytmów.
Jak działa Spark?
Architektura aplikacji Spark składa się z trzech głównych części:
Program Driver: odpowiada za koordynację wykonywania przetwarzania danych.
Menedżer klastra: jest to komponent odpowiedzialny za zarządzanie różnymi maszynami w klastrze. Jest potrzebny tylko wtedy, gdy Spark działa w trybie rozproszonym.
Węzły robocze: są to maszyny, które wykonują zadania programu. Jeśli Spark jest uruchamiany lokalnie na komputerze, będzie on pełnił rolę programu sterownika i węzła roboczego. Ten sposób uruchamiania Sparka nazywa się Standalone.
Przegląd klastra
Kod Spark można pisać w wielu różnych językach. Konsola Spark, zwana Spark Shell, jest interaktywna i służy do nauki oraz eksplorowania danych.
Aplikacja Spark składa się z jednego lub więcej zadań, co umożliwia wsparcie przetwarzania danych na dużą skalę.
Jeśli chodzi o wykonywanie, Spark oferuje dwa tryby:
- Klient: Sterownik działa bezpośrednio na kliencie, bez udziału Menedżera zasobów.
- Klaster: Sterownik uruchomiony na wzorcu aplikacji za pośrednictwem Menedżera zasobów (w trybie klastra, jeśli klient się rozłączy, aplikacja będzie działać dalej).
Niezbędne jest prawidłowe wykorzystanie Sparka, aby usługi powiązane, takie jak Menedżer zasobów, mogły zidentyfikować potrzeby każdego wykonania, co zapewni najlepszą wydajność. Od programisty zależy więc, jak optymalnie uruchomić zadania Spark i ustrukturyzować połączenie. W tym celu można ustrukturyzować i skonfigurować wykonawców Spark w preferowany sposób.
Zadania Spark wykorzystują głównie pamięć, dlatego często dostosowuje się wartości konfiguracyjne Spark dla wykonawców węzła roboczego. W zależności od obciążenia, można ustalić, że pewna niestandardowa konfiguracja Spark zapewnia bardziej optymalne wykonania. W tym celu można przeprowadzić testy porównawcze pomiędzy różnymi opcjami konfiguracji i samą domyślną konfiguracją Spark.
Przykłady zastosowań
Apache Spark pomaga w przetwarzaniu ogromnych ilości danych, zarówno w czasie rzeczywistym, jak i zarchiwizowanych, ustrukturyzowanych i nieustrukturyzowanych. Oto kilka przykładów jego popularnych zastosowań:
Wzbogacanie danych
Firmy często wykorzystują kombinację danych historycznych klientów z danymi behawioralnymi w czasie rzeczywistym. Spark może pomóc w tworzeniu ciągłego potoku ETL w celu konwersji nieustrukturyzowanych danych zdarzeń na dane strukturalne.
Wykrywanie zdarzeń
Spark Streaming umożliwia szybkie wykrywanie i reagowanie na nietypowe zachowania, które mogą wskazywać na potencjalny problem lub oszustwo.
Złożona analiza danych sesji
Za pomocą Spark Streaming można grupować i analizować zdarzenia związane z sesją użytkownika, takie jak jego aktywność po zalogowaniu do aplikacji. Informacje te mogą być również stale wykorzystywane do aktualizacji modeli uczenia maszynowego.
Zalety
Przetwarzanie iteracyjne
Jeśli zadanie polega na wielokrotnym przetwarzaniu danych, odporne rozproszone zestawy danych (RDD) platformy Spark umożliwiają wykonywanie wielu operacji mapowania w pamięci bez konieczności zapisywania wyników pośrednich na dysku.
Obróbka graficzna
Model obliczeniowy Sparka z GraphX API idealnie nadaje się do obliczeń iteracyjnych typowych dla przetwarzania grafiki.
Uczenie maszynowe
Spark posiada MLlib – wbudowaną bibliotekę uczenia maszynowego, która oferuje gotowe algorytmy działające w pamięci.
Porównanie Kafki i Sparka
Chociaż zainteresowanie Kafką i Sparkiem jest podobne, istnieją między nimi istotne różnice. Spójrzmy na nie bliżej.
#1. Przetwarzanie danych
Kafka to narzędzie do przesyłania i przechowywania danych w czasie rzeczywistym, odpowiedzialne za przesyłanie danych pomiędzy aplikacjami. Nie wystarcza jednak do zbudowania kompletnego rozwiązania. Dlatego do zadań, których nie wykonuje Kafka, potrzebne są inne narzędzia, takie jak Spark. Z kolei Spark jest platformą do przetwarzania danych typu „batch first”, która pobiera dane z tematów Kafki i przetwarza je w powiązane schematy.
#2. Zarządzanie pamięcią
Spark używa odpornych rozproszonych zbiorów danych (RDD) do zarządzania pamięcią. Zamiast przetwarzać ogromne zbiory danych, dzieli je na wiele węzłów w klastrze. Kafka natomiast korzysta z dostępu sekwencyjnego, podobnego do HDFS i przechowuje dane w pamięci buforowej.
#3. Transformacja ETL
Zarówno Spark, jak i Kafka wspierają proces transformacji ETL, który kopiuje rekordy z jednej bazy danych do drugiej, zazwyczaj z bazy transakcyjnej (OLTP) do bazy analitycznej (OLAP). W przeciwieństwie do Sparka, który ma wbudowaną możliwość obsługi procesu ETL, Kafka korzysta z interfejsu Streams API.
#4. Trwałość danych
Wykorzystanie RRD przez Spark umożliwia przechowywanie danych w wielu lokalizacjach do późniejszego wykorzystania, podczas gdy w Kafce konieczne jest zdefiniowanie obiektów zestawu danych w konfiguracji, aby utrwalić dane.
#5. Trudność
Spark jest kompletnym rozwiązaniem i łatwiejszym do nauczenia dzięki obsłudze różnych języków programowania wysokiego poziomu. Kafka z kolei zależy od wielu różnych interfejsów API i modułów zewnętrznych, co może utrudnić pracę.
#6. Odzyskiwanie danych
Zarówno Spark, jak i Kafka oferują opcje odzyskiwania. Spark używa RRD, co pozwala na ciągłe zapisywanie danych. W przypadku awarii klastra można go odzyskać.
Kafka stale replikuje dane w klastrze i pomiędzy brokerami, co umożliwia przełączenie na inny broker w przypadku awarii.
Podobieństwa między Sparkiem a Kafką
Apache SparkApache KafkaOpenSourceOpenSourceTworzenie aplikacji do strumieniowania danychTworzenie aplikacji do strumieniowego przesyłania danychObsługuje przetwarzanie stanoweObsługuje przetwarzanie stanoweObsługuje SQLObsługuje SQLPodobieństwa między platformami Spark i Kafka
Podsumowanie
Kafka i Spark to narzędzia open source napisane w Scali i Javie, które umożliwiają tworzenie aplikacji do strumieniowego przesyłania danych w czasie rzeczywistym. Mają ze sobą wiele wspólnego, w tym przetwarzanie stanowe, obsługę SQL i ETL. Kafka i Spark mogą być również wykorzystywane jako narzędzia uzupełniające, pomagając w rozwiązywaniu problemów związanych ze złożonością przesyłania danych między aplikacjami.
newsblog.pl