Apache Spark DStream (Discretized Streams)
Bądź na bieżąco z najnowszymi trendami technologicznymi
Dołącz do DataFlair na Telegramie!!
Cel
Ten tutorial dotyczący Sparka, przeprowadzi Cię przez Apache Spark DStream. Po pierwsze, zobaczymy co to jest Spark Streaming, a następnie, co to jest DStream w Apache Spark. Operacje na strumieniach dyskretnych tj. transformacje bezstanowe i stanowe, operacje wyjściowe, wejściowe DStream i odbiorniki są również omawiane na tym blogu Apache Spark.
Apache Spark DStream (Discretized Streams)
Wprowadzenie do DStream w Apache Spark
W tej sekcji, dowiemy się o DStream. Jaka jest jego rola i odpowiedzialność w Spark Streaming? Obejmuje on wszystkie metody, które są wbudowane, aby poradzić sobie z żywym strumieniem danych.
Jako rozszerzenie API Apache Spark, Spark Streaming jest odporny na błędy, system o wysokiej przepustowości. Przetwarza on strumień danych na żywo. Spark Streaming pobiera dane wejściowe z różnych wiarygodnych źródeł, takich jak Flume, HDFS i Kafka itp., a następnie wysyła przetworzone dane do systemów plików, baz danych lub pulpitów nawigacyjnych. Strumień danych wejściowych jest dzielony na partie danych, a następnie generuje ostateczny strumień wyniku w partiach.
Spark DStream (Discretized Stream) jest podstawową abstrakcją Spark Streaming. DStream jest ciągłym strumieniem danych. Otrzymuje dane wejściowe z różnych źródeł, takich jak Kafka, Flume, Kinesis lub gniazda TCP. Może to być również strumień danych wygenerowany poprzez transformację strumienia wejściowego. W swojej istocie, DStream jest ciągłym strumieniem RDD (abstrakcja Sparka). Każdy RDD w DStream zawiera dane z określonego interwału.
Każda operacja na DStream odnosi się do wszystkich bazowych RDD. DStream obejmuje wszystkie szczegóły. Zapewnia deweloperowi wysokopoziomowe API dla wygody. W rezultacie Spark DStream ułatwia pracę z danymi strumieniowymi.
Spark Streaming oferuje właściwości fault-tolerance dla DStreams, tak jak dla RDD. tak długo, jak dostępna jest kopia danych wejściowych, może on rekompilować dowolny stan na jej podstawie, używając linii RDD. Domyślnie Spark replikuje dane na dwóch węzłach. W rezultacie Spark Streaming może znieść awarie pojedynczego pracownika.
Apache Spark DStream Operacje
Podobnie jak RDD, Spark DStream również obsługuje dwa typy Operacji: Transformacje i Operacje wyjściowe-
i. Transformation
W DStream występują dwa typy transformacji:
- Stateless Transformations
- Stateful Transformations
a. Stateless Transformations
Przetwarzanie każdej partii nie ma zależności od danych z poprzednich partii. Przekształcenia bezstanowe są prostymi przekształceniami RDD. Stosuje się je do każdej partii oznaczającej każdy RDD w DStream. Obejmuje to typowe transformacje RDD jak map(), filter(), reduceByKey() itp.
Chociaż funkcje te wydają się mieć zastosowanie do całego strumienia, każdy DStream jest kolekcją wielu RDD (partii). W rezultacie każda transformacja bezstanowa odnosi się do każdego RDD.
Transformacje bezstanowe są zdolne do łączenia danych z wielu DStreamów w każdym kroku czasowym. Na przykład, klucz/wartość DStreams posiadają te same transformacje związane z łączeniem jak RDD- cogroup(), join(), leftOuterJoin() itp.
Możemy użyć tych operacji na DStreams aby wykonać bazowe operacje RDD na każdej partii.
Jeśli transformacje bezstanowe są niewystarczające, DStreams posiada zaawansowany operator zwany transform(). transform() pozwala operować na RDD wewnątrz nich. Transform() pozwala dowolnej dowolnej funkcji RDD-to-RDD działać na DStream. Ta funkcja jest wywoływana na każdej partii danych w strumieniu, aby wyprodukować nowy strumień.
b. Stateful Transformations
Używa danych lub wyników pośrednich z poprzednich partii i oblicza wynik bieżącej partii. Transformacje stanowe są operacjami na DStreams, które śledzą dane w czasie. Tak więc wykorzystuje pewne dane z poprzednich partii do wygenerowania wyników dla nowej partii.
Dwa główne typy to operacje okienkowe, które działają w przesuwanym oknie czasowym oraz updateStateByKey(), która jest używana do śledzenia stanu przez zdarzenia dla każdego klucza (np. do zbudowania obiektu reprezentującego każdą sesję użytkownika).
Przejdź za ten link, aby przeczytać DStream Transformations szczegółowo z przykładami.
ii. Operacje wyjściowe
Gdy otrzymamy dane po transformacji, na tych danych wykonywane są operacje wyjściowe w Spark Streaming. Po debugowaniu naszego programu, używając operacji wyjścia możemy zapisać tylko nasze dane wyjściowe. Niektóre z operacji wyjścia to print(), save() etc.. Operacja save pobiera katalog do którego ma być zapisany plik oraz opcjonalny sufiks. Operacja print() pobiera pierwsze 10 elementów z każdej partii DStream i drukuje wynik.
Wejściowe DStreamy i Odbiorniki
Wejściowy DStream jest DStream reprezentującym strumień danych wejściowych ze źródła strumieniowego. Odbiornik (Scala doc, Java doc) obiekt związany z każdym wejściowym obiektem DStream. Odbiera on dane ze źródła i przechowuje je w pamięci Sparka w celu przetworzenia.
Spark Streaming zapewnia dwie kategorie wbudowanych źródeł strumieniowych:
- Źródła podstawowe – Są to źródła, które są bezpośrednio dostępne w API StreamingContext. Przykłady: systemy plików, i połączenia gniazdowe.
- Źródła zaawansowane – Te źródła są dostępne przez dodatkowe klasy narzędziowe takie jak Kafka, Flume, Kinesis. Tak więc, wymaga łączenia z dodatkowymi zależnościami.
Na przykład:
- Kafka: artefakt wymagany dla Kafki to spark-streaming-kafka-0-8_2.11.
- Flume: artefakt wymagany dla Flume jest dspark-streaming-flume_2.11.
- Kinesis: artefakt wymagany dla Kinesis to spark-streaming-kinesis-asl_2.11.
Tworzy wiele wejść DStream, aby odbierać wiele strumieni danych równolegle. Tworzy wiele odbiorników, które odbierają wiele strumieni danych. Spark worker/executor jest długo działającym zadaniem. Zajmuje więc jeden z rdzeni, który jest powiązany z aplikacją Spark Streaming. Tak więc konieczne jest, aby aplikacja Spark Streaming miała wystarczającą liczbę rdzeni do przetwarzania otrzymanych danych.
Wnioski
Podsumowując, podobnie jak RDD w Spark, Spark Streaming zapewnia abstrakcję wysokiego poziomu znaną jako DStream. DStream reprezentuje ciągły strumień danych. Wewnętrznie, DStream jest portretowany jako sekwencja RDD. Tak więc, podobnie jak RDD, możemy uzyskać DStream z wejściowego DStream jak Kafka, Flume itp. Również, transformacja może być zastosowana na istniejącym DStream, aby uzyskać nowy DStream.