techniki optymalizacji i wydajności Apache Spark

przez Chandan Gaur|Big Data Engineering / 05,paź,2020

Co To jest Apache Spark?

Apache, w 2012 r., opisał Odporny rozproszony zbiór danych (RDD w Apache Spark) foundation z rozproszonymi zbiorami danych tylko do odczytu w rozproszonych klastrach i nazwał go Apache Spark. Później wprowadzają API Dataset, a następnie Dataframe API do wsadowego i strukturalnego strumieniowania danych. W tym artykule wymieniono najlepsze techniki optymalizacji Apache Spark.

Apache Spark jest szybką platformą obliczeniową klastrową opracowaną do wykonywania większej liczby obliczeń i przetwarzania strumieniowego. Spark może obsługiwać wiele różnych obciążeń w porównaniu z tradycyjnymi systemami, które wymagają obsługi wielu systemów. Analiza danych rurociągi są ułatwiane przez Spark w połączeniu różnych typów przetwarzania, które jest niezbędne do produkcji. Apache Spark jest stworzony do współpracy z zewnętrznym menedżerem klastrów, takim jak YARN lub jego samodzielnym menedżerem.

funkcje Apache Spark

niektóre funkcje Apache Spark obejmują:-

  • zunifikowana platforma do pisania aplikacji big data.
  • iskra może działać niezależnie. W ten sposób daje elastyczność.
  • Oszczędny.

XenonStack zapewnia usługi analityczne i rozwiązania do szybkiego i wydajnego pozyskiwania, przetwarzania i analizy strumieni danych w czasie rzeczywistym dla Internetu Rzeczy, monitorowania, konserwacji zapobiegawczej i predykcyjnej.

z artykułu usługi streamingu i analizy w czasie rzeczywistym

zrozumienie, jak działa Optymalizacja Apache Spark?

aby zrozumieć, jak działa optymalizacja Apache Spark, musisz najpierw zrozumieć jego architekturę, a w następnej sekcji opracujemy to samo.

Architektura Apache Spark

Architektura czasu pracy Spark składa się z trzech części-

sterownik Spark (proces główny)

Sterownik Spark konwertuje programy na zadania i planuje zadania dla wykonawców. Harmonogram zadań jest częścią Sterownika i pomaga dystrybuować zadania do wykonawców.

Spark Cluster Manager

menedżer klastrów jest rdzeniem w Spark, który umożliwia uruchamianie executorów, a czasami sterowniki mogą być również uruchamiane przez niego. Spark Scheduler programuje działania i zadania w aplikacji Spark w sposób FIFO na samym cluster managerze. Powinieneś również przeczytać o Apache Airflow.

Executors (procesy Slave)

Executors to pojedyncze jednostki, na których działa pojedyncze zadanie zadania. Executors będą zawsze działać do cyklu życia aplikacji spark po ich uruchomieniu. Nieudane programy wykonawcze nie zatrzymują wykonywania zadania spark.

RDD (Resilient Distributed Datasets)

RDD to rozproszony zbiór niezmiennych zbiorów danych na rozproszonych węzłach klastra. RDD jest podzielony na jedną lub wiele partycji. RDD jest rdzeniem spark jako ich dystrybucja między różnymi węzłami klastra, który wykorzystuje lokalizację danych. Aby osiągnąć równoległość wewnątrz aplikacji, partycje są jednostkami dla niej. Ponowne partycjonowanie lub scalanie przekształceń może pomóc w utrzymaniu liczby partycji. Dostęp do danych jest zoptymalizowany przy użyciu tasowania RDD. Ponieważ Spark jest blisko danych, wysyła dane przez różne węzły i tworzy wymagane partycje w razie potrzeby.

dag (Directed acyclic Graph)

Spark ma tendencję do generowania wykresu operatora, gdy wprowadzamy nasz kod do konsoli Spark. Po uruchomieniu akcji Spark RDD, Spark przesyła ten wykres do Dagschedulera. Następnie dzieli te wykresy operatorów na etapy zadania wewnątrz Dagschedulera. Każdy krok może zawierać zadania oparte na kilku partycjach przychodzących danych. Dagscheduler rurociągi te poszczególne wykresy operatora razem. Na przykład, harmonogram Wykresów operatora mapy dla pojedynczego etapu i te etapy przechodzą do. Harmonogram zadań w Menedżerze klastrów do ich wykonania. Jest to zadanie pracy lub wykonawców do wykonania tych zadań na niewolniku.

Wydajne przetwarzanie rozproszone przy użyciu partycji

zwiększenie liczby wykonawców w klastrach zwiększa również równoległość w przetwarzaniu zadania Spark. Ale do tego trzeba mieć odpowiednie informacje o tym, jak te dane będą dystrybuowane wśród tych wykonawców poprzez partycjonowanie. RDD jest pomocny w tym przypadku z znikomym ruchem dla tasowania danych przez tych wykonawców. Można dostosować partycjonowanie dla pary RDD (RDD z parami klucz-wartość). Spark zapewnia, że zestaw kluczy będzie zawsze wyświetlany razem w tym samym węźle, ponieważ w tym przypadku nie ma wyraźnej kontroli.

Apache Spark security wspomaga uwierzytelnianie poprzez wspólną tajemnicę. Uwierzytelnianie Spark to parametr konfiguracyjny, za pomocą którego można skonfigurować uwierzytelnianie. Jest to parametr, który sprawdza, czy protokoły komunikacji spark wykonują uwierzytelnianie przy użyciu wspólnej tajemnicy, czy nie.

z artykułu, Apache Spark Security

błędy, których należy unikać podczas pisania aplikacji Spark

reduceByKey lub groupByKey

zarówno groupByKey, jak i reduceByKey dają tę samą odpowiedź, ale koncepcja generowania wyników jest inna. reduceByKey najlepiej nadaje się do dużych zbiorów danych, ponieważ w Spark łączy wyjście z kluczem współdzielonym dla każdej partycji przed tasowaniem danych. Z drugiej strony, groupByKey tasuje wszystkie pary klucz-wartość. GroupByKey powoduje niepotrzebne tasowanie i przesyłanie danych przez sieć.

Zachowaj wymagany rozmiar bloków losowych

domyślnie blok losowy Spark nie może przekroczyć 2 GB. Lepszym zastosowaniem jest zwiększenie partycji i zmniejszenie jej pojemności do ~128MB na partycję, co zmniejszy rozmiar bloku losowego. Możemy użyć repartition lub coalesce w regularnych aplikacjach. Duże partycje sprawiają, że proces jest powolny ze względu na limit 2GB, a kilka partycji nie pozwala na skalowanie zadania i osiągnięcie równoległości.

formaty plików i ograniczniki

wybór odpowiednich formatów plików dla każdej specyfikacji związanej z danymi to ból głowy. Należy mądrze wybrać format danych dla typów przyjmowania, typu pośredniego i końcowego typu wyjściowego. Możemy również klasyfikować formaty plików z danymi dla każdego typu na kilka sposobów, na przykład możemy użyć formatu pliku AVRO do przechowywania danych multimedialnych, ponieważ Avro jest najlepiej zoptymalizowany dla danych binarnych niż parkiet. Parkiet może być używany do przechowywania informacji metadanych, ponieważ jest wysoce skompresowany.

małe pliki danych

nadawanie jest techniką ładowania małych plików danych lub zestawów danych do bloków pamięci, dzięki czemu można je łączyć z bardziej masywnymi zbiorami danych z mniejszym obciążeniem tasowania danych. Na przykład, możemy przechowywać małe pliki danych w n liczba bloków i duże pliki danych mogą być dołączone do tych bloków danych w przyszłości, jak duże pliki danych mogą być dystrybuowane między tymi blokami w sposób równoległy.

brak monitorowania etapów Zadań

dag jest strukturą danych używaną w Spark, która opisuje różne etapy zadań w formacie grafu. Większość programistów pisze i wykonuje kod, ale monitorowanie zadań jest niezbędne. Monitorowanie to najlepiej osiągnąć poprzez zarządzanie DAG i redukcję etapów. Praca z 20 krokami jest przedłużona w porównaniu do pracy z 3-4 etapami.

ByKey, repartition lub wszelkie inne operacje, które powodują tasowanie

W większości przypadków musimy unikać tasowania tak bardzo, jak to tylko możliwe, ponieważ dane tasują wiele, a czasami uzyskanie skalowalności z tych tasowań staje się bardzo skomplikowane. GroupByKey może być cennym zasobem, ale jego potrzeba musi być najpierw opisana.

uczenie się przez wzmacnianie

uczenie się przez wzmacnianie to nie tylko koncepcja uzyskania lepszego środowiska uczenia maszynowego, ale także lepszego procesu decyzyjnego. Należy zastosować głębokie uczenie wzmacniające w spark, jeśli model przejścia i model nagrody są poprawnie zbudowane na zestawach danych, a także agenci są wystarczająco zdolni do oszacowania wyników.

czynniki i techniki optymalizacji Apache Spark

jedną z najlepszych cech optymalizacji Apache Spark jest pomoc w obliczeniach danych w pamięci. Wąskim gardłem dla tych obliczeń optymalizacji spark może być procesor, pamięć lub dowolny zasób w klastrze. W takich przypadkach może pojawić się potrzeba serializacji danych, zmniejszenia pamięci. Czynniki te dla optymalizacji iskier, jeśli są właściwie stosowane, mogą–

  • eliminacja długotrwałego procesu pracy
  • mechanizm wykonywania korekcji
  • poprawia wydajność dzięki zarządzaniu zasobami

13 proste techniki optymalizacji Apache Spark

są globalnymi zmiennymi dla wykonawców, które można dodać tylko poprzez operację asocjacyjną i komutacyjną. Może więc być wydajny równolegle. Akumulatory mogą być używane do implementacji liczników (tak samo jak w Map Reduce) lub innego zadania, takiego jak śledzenie wywołań API.

domyślnie Spark obsługuje akumulatory numeryczne, ale programiści mają tę zaletę, że dodają wsparcie dla nowych typów. Spark zapewnia, że aktualizacja każdego zadania zostanie zastosowana tylko raz do zmiennych akumulatora. Podczas transformacji użytkownicy powinni mieć świadomość aktualizacji każdego zadania, ponieważ można je zastosować więcej niż jeden raz, jeśli etapy zadania zostaną ponownie wykonane.

wydajność Bucketingu Hive

wyniki Bucketingu ze stałą liczbą plików, gdy określamy liczbę bucketów z łyżką. Hive wziął pole, obliczył hash i przypisał rekord do tego konkretnego wiadra. Bucketing jest bardziej stabilny, gdy pole ma wysoką cardinality, Duże przetwarzanie danych, a rekordy są równomiernie rozmieszczone wśród wszystkich bucketów, podczas gdy partycjonowanie działa, gdy cardinality pola partycjonowania jest niska.

Bucketing zmniejsza koszty sortowania plików. Na przykład, jeśli łączymy dwie tabele, w których znajduje się taka sama liczba wiader, spark łączy dane bezpośrednio jako klucze już posortowane. Liczbę plików bucket można obliczyć jako kilka partycji w kilka bucketów.

predykat Pushdown Optymalizacja

predykat pushdown jest techniką przetwarzania tylko wymaganych danych. Predykaty można zastosować do SparkSQL, definiując filtry w warunkach, w których występują. Używając polecenia explain do zapytania możemy sprawdzić etapy przetwarzania zapytania. Jeśli plan zapytań zawiera filtr PushedFilter, to zapytanie jest zoptymalizowane do wybierania tylko wymaganych danych, ponieważ każdy predykat zwraca True lub False.

jeśli w planie zapytań nie ma filtra PushedFilter, lepiej jest podać warunek where. Predykaty ograniczają liczbę plików i partycji, które SparkSQL odczytuje podczas odpytywania, zmniejszając tym samym rozpoczęcie analizy We/Wy dysku w pamięci. Zapytania o dane w wiadrach z wypychanymi predykatami generują wyniki szybciej przy mniejszej liczbie przetasowań.

Zero data Serialization/Deserialization using Apache Arrow

Apache Arrow jest używany jako format czasu pracy w pamięci dla silników zapytań analitycznych. Arrow zapewnia serializację danych / deserializację zero tasuje poprzez współdzieloną pamięć. Arrow flight wysyła duże zbiory danych przez sieć. Arrow ma format pliku arrow, który umożliwia losowy dostęp do danych na dyskach. Arrow posiada standardową warstwę dostępu do danych dla wszystkich aplikacji spark.

zmniejsza obciążenie dla operacji SerDe dla tasowania danych, ponieważ ma wspólne miejsce, w którym znajdują się wszystkie dane i w określonym formacie strzałki.

Tuning Garbage Collection korzystanie z kolekcji G1GC

podczas tuningu garbage collector zalecamy użycie G1 GC do uruchamiania aplikacji Spark. G1 garbage collector całkowicie radzi sobie z rosnącymi hałdami, które są powszechnie widoczne z Spark. G1 wymaga mniejszej liczby opcji, aby zapewnić zarówno wyższą przepustowość, jak i mniejsze opóźnienia. Aby kontrolować nieprzewidywalne cechy i zachowania różnych aplikacji, należy opanować strojenie GC zgodnie z wygenerowanymi logami.

Przed tym należy zastosować inne techniki optymalizacji, takie jak Streaming i rozwiązania analityczne w czasie rzeczywistym, w logice i kodzie programu. W większości przypadków G1GC pomaga zoptymalizować czas przerwy między procesami, które są dość często stosowane w aplikacjach Spark, a tym samym skraca czas realizacji zadania dzięki bardziej niezawodnemu systemowi.

zarządzanie i dostrajanie pamięci

Jak wiemy, do obliczeń takich jak tasowanie, sortowanie i tak dalej, używana jest pamięć wykonawcza, podczas gdy do celów buforowania używana jest pamięć pamięci masowej, która również propaguje dane wewnętrzne. Mogą się zdarzyć przypadki, w których zadania nie używają żadnego bufora, dlatego podczas wykonywania mogą wystąpić przypadki braku miejsca. Zadania buforowane zawsze zajmują mniej miejsca w pamięci masowej, gdzie dane nie mogą być eksmitowane przez żadne wymagania wykonawcze. Ponadto można wykonać aplikację strumieniową w czasie rzeczywistym z Apache Spark.

możemy ustawić iskrę.pamięć.ułamek do określenia, ile miejsca na stercie JVM jest używane do pamięci Spark execution. Zwykle 60% jest wartością domyślną. Pamięć executora musi być przechowywana jak najmniej, ponieważ może to prowadzić do opóźnienia usuwania śmieci JVM. Ten fakt dotyczy również małych wykonawców, ponieważ wiele zadań może działać na jednej instancji JVM.

Lokalizacja danych

W Apache Spark zadania przetwarzania są optymalizowane poprzez umieszczenie kodu wykonawczego blisko przetwarzanych danych, zwanego lokalizacją danych. Czasami zadanie przetwarzania musi poczekać przed pobraniem danych, ponieważ dane nie są dostępne. Jednak, gdy czas iskry.miejscowości.wait wygasa, Spark próbuje mniej lokalnego poziomu, tj. lokalnego do węzła, aby rack do dowolnego.

przesyłanie danych między dyskami jest bardzo kosztowne, więc większość operacji musi być wykonana w miejscu, w którym znajdują się dane. Pomaga ładować tylko małe, ale wymagało ilości danych wraz z rozwojem opartym na testach dla Apache Spark.

Korzystanie z połączeń Kolokowanych

połączenia Kolokowane podejmują decyzje o redystrybucji i nadawaniu. Możemy zdefiniować małe zbiory danych, które mają być umieszczone w wielu blokach pamięci, aby uzyskać lepsze wykorzystanie transmisji. Podczas stosowania złączeń na dwóch zestawach danych, spark najpierw sortuje dane obu zestawów danych według klucza i łączy je.

ale możemy również zastosować sort partition key przed dołączeniem do nich lub podczas tworzenia tych ramek danych w architekturze Strzałki Apache. Zoptymalizuje to czas wykonywania zapytania, ponieważ nie byłoby niepotrzebnych wywołań funkcji do sortowania.

buforowanie w Spark

buforowanie w Apache Spark z GPU jest najlepszą techniką optymalizacji Apache Spark, gdy potrzebujemy ponownie pewnych danych. Ale zawsze nie jest dopuszczalne buforowanie danych.

musimy użyć cache () RDD i DataFrames w następujących przypadkach–

  • gdy istnieje pętla iteracyjna, taka jak w algorytmach uczenia maszynowego.
  • gdy RDD jest dostępne wiele razy w jednym zadaniu lub zadaniu.
  • gdy koszt ponownego wygenerowania partycji RDD jest wyższy.

Cache () i persist (StorageLevel.MEMORY_ONLY) mogą być używane zamiast siebie. Każda partycja RDD, która zostanie usunięta z pamięci, musi być ponownie zbudowana ze źródła, które nadal jest bardzo drogie. Jednym z najlepszych rozwiązań jest użycie persist (Storage level.MEMORY_AND_DISK_ONLY), które rozlewałyby partycje RDD na dysk lokalny Workera. Ta sprawa wymaga tylko uzyskania danych z dysku lokalnego pracownika, który jest stosunkowo szybki.

Rozmiar executora

Kiedy uruchamiamy executory z dużą pamięcią, często powoduje to nadmierne opóźnienia w usuwaniu śmieci. Musimy utrzymać liczbę rdzeni na wykonawcę poniżej pięciu zadań na wykonawcę. Zbyt małe executory nie okazały się przydatne pod względem uruchamiania wielu zadań na jednym JVM.

na przykład zmienne nadawane muszą być replikowane dla każdego wykonawcy dokładnie raz, co spowoduje więcej kopii danych.

funkcja Spark Windowing

funkcja window definiuje ramkę, przez którą możemy obliczyć wiersze wejściowe tabeli. Na poziomie poszczególnych rzędów. Każdy wiersz może mieć jasne ramy. Okno pozwala na zdefiniowanie okna dla danych w ramce danych. Możemy porównać wiele wierszy w tej samej ramce danych.

możemy ustawić czas okna na określony przedział, który rozwiąże problem zależności danych z poprzednimi danymi. Tasowanie w wiązce Apache jest mniej na wcześniej przetwarzanych danych, ponieważ zachowujemy te dane dla interwału okna.

Technika znaków wodnych

znak wodny jest użyteczną techniką w optymalizacji Apache Spark, która ogranicza system przez projekt i pomaga zapobiec jego wybuchowi podczas biegu. Znak wodny przyjmuje dwa argumenty–

  • kolumna dla czasu zdarzenia i
  • czas progowy określający, jak długo musimy przetwarzać opóźnione dane

zapytanie w architekturze Apache Arrow zostanie automatycznie zaktualizowane, jeśli dane mieszczą się w określonym progu; w przeciwnym razie nie zostanie uruchomione przetwarzanie dla tych opóźnionych danych. Należy pamiętać, że możemy użyć trybu pełnego obok siebie ze znakiem wodnym, ponieważ tryb pełny najpierw utrzymuje wszystkie dane do wynikowej tabeli.

serializacja danych

Apache Spark optimization działa na danych, które musimy przetworzyć w niektórych przypadkach użycia, takich jak analityka lub po prostu przepływ danych. Ten ruch danych lub analiz może być dobrze wykonany, jeśli dane są w jakimś lepiej serializowanym formacie. Apache Spark obsługuje serializację danych, aby skutecznie zarządzać formatami danych potrzebnymi u źródła lub miejsca docelowego. Domyślnie Apache Spark używa serializacji Java, ale obsługuje również serializację Kryo.

domyślnie Spark używa Java ObjectOutputStream do serializacji danych. Implementacja może odbywać się poprzez Javę.io.Klasy serializowalne. Koduje obiekty w strumień bajtów. Zapewnia lekkość i elastyczność. Ale staje się powolny, ponieważ prowadzi do ogromnych serializowanych formatów dla każdej klasy, w której jest używany. Spark obsługuje Kryo Serialization library (v4) do serializacji obiektów prawie 10 razy szybciej niż serializacja Java, ponieważ jest bardziej kompaktowa niż Java.

Optymalizacja Apache Spark: Kompleksowe podejście

Apache Spark, rozproszony silnik obliczeniowy o otwartym kodzie źródłowym, jest obecnie najpopularniejszym frameworkiem do przetwarzania wsadowego w pamięci, który obsługuje również strumieniowanie w czasie rzeczywistym. Dzięki zaawansowanemu optymalizatorowi zapytań i mechanizmowi wykonywania, techniki optymalizacji Apache Spark mogą bardzo wydajnie przetwarzać i analizować duże zbiory danych. Jednak użycie technik optymalizacji połączenia Apache Spark bez starannego strojenia może obniżyć wydajność. Jeśli chcesz wykorzystać moc aplikacji Apache Spark, sprawdź nasze zarządzane usługi Apache Spark.

kategorie :

Big Data Development,Big Data Solutions,Streaming Data Analytics,

Share:

You might also like

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.