Zrozumienie trwałości w Apache Spark

czas czytania: 4 minuty

na tym blogu postaramy się zrozumieć koncepcję trwałości W Apache Spark w bardzo laickim pojęciu z przykładami opartymi na scenariuszach.
Uwaga: scenariusze są przeznaczone tylko dla łatwego zrozumienia.

Spark Architecture

uwaga: pamięć Cache może być współdzielona między wykonawcami.

co oznacza utrzymywanie / buforowanie RDD?

Spark RDD persistence to technika optymalizacji, która zapisuje wynik oceny RDD w pamięci podręcznej. Korzystając z tego zapisujemy wynik pośredni, abyśmy mogli go użyć dalej, jeśli zajdzie taka potrzeba. Zmniejsza to koszty obliczeniowe.

kiedy przechowujemy RDD, każdy węzeł przechowuje partycje, które oblicza w pamięci i ponownie wykorzystuje je w innych działaniach na tym RDD (lub RDD z niego pochodzące). Dzięki temu przyszłe działania będą znacznie szybsze (często o więcej niż 10x). Buforowanie jest kluczowym narzędziem dla iteracyjnych algorytmów i szybkiego interaktywnego wykorzystania.

możesz oznaczyć RDD, które ma być utrzymane, używając na nim metod persist() lub cache(). Po raz pierwszy zostanie obliczony w akcji, będzie przechowywany w pamięci podręcznej na węzłach. Pamięć podręczna Spark jest odporna na błędy – jeśli jakakolwiek partycja RDD zostanie utracona, zostanie ona automatycznie przeliczona za pomocą przekształceń, które ją pierwotnie utworzyły.

powiedzmy, że mam taką transformację–

RDD3 => RDD2 => RDD1 => Text FileRDD4 => RDD3RDD5 => RDD3

RDD3 jest tworzony z RDD2, a RDD2 jest tworzony z RDD1. Za każdym razem, gdy wykonujemy transformację na RDD3, RDD2 i RDD1 muszą być ponownie obliczane.

RDD4.collect()RDD5.collect()

tutaj cały łańcuch transformacji musi być obliczony dwa razy.

ale możemy utrzymywać ten RDD3 w pamięci cache węzła roboczego, tak że za każdym razem, gdy go używamy, RDD2 i RDD1 nie muszą być ponownie obliczane.

RDD3.cache()RDD4.collect()//The first action which involves RDD3 will store it in cache memoryRDD5.collect()

tutaj, aby obliczyć Rdd5 Spark odczyta RDD3 z pamięci podręcznej i wygeneruje wynik. Dlatego RDD2 i RDD1 nie będą ponownie obliczane dla RDD5

Uwaga: RDD.cache() jest takie samo jak rdd.persist ()

poziomy trwałości

lokalizacja pamięci

– MEMORY_ONLY (domyślnie) – taki sam jak cache
rdd.persist (StorageLevel.MEMORY_ONLY) lub rdd.persist()

– MEMORY_AND_DISK-przechowuje partycje na dysku, które nie mieszczą się w pamięci (jest to również nazywane rozlewaniem)
rdd.persist (StorageLevel.MEMORY_AND_DISK )

– DISK_ONLY-przechowuje wszystkie partycje na dysku
rdd.persist (StorageLevel.DISK_ONLY )

– MEMORY_ONLY (domyślnie) – jest to najprostszy i najbardziej zalecany w użyciu. Przechowuje wszystkie partycje RDD w pamięci cache.

możesz się zastanawiać jaki jest sens przechowywania na dysku?

zdecydowanie, jeśli zapiszemy RDD na dysku, wtedy nastąpi wejście / wyjście, co jest czasochłonne. Ale musimy upewnić się, że czy We/Wy zajmuje dużo czasu, czy ponowne obliczenie RDD zajmuje więcej czasu. Teraz, jeśli możemy się dowiedzieć, że we/wy zajmuje mniej czasu niż ponowne obliczenie RDD, to w takim przypadku lepiej jest zapisać RDD na dysku.

tak więc, gdy RDD1 jest wymagany następnym razem w kolejnej transformacji, Spark wykona operację we / wy i przeniesie ją do pamięci wykonawcy.

RDD1.persist (StorageLevel.DISK_ONLY)

teraz Załóżmy, że 3 RDD są buforowane w pamięci i kiedy rdd4 dotrze LRU nie wyrzuci żadnego RDD z pamięci podręcznej węzła roboczego. I mogą być problemy z OOM.

ale jeśli użyjemy MEMORY_AND_DISK persistence level z RDD4 to RDD4 zostanie zapisany na dysku, jeśli nie znajdzie wystarczająco dużo miejsca w pamięci podręcznej.

RDD4.persist (StorageLevel.MEMORY_AND_DISK)

Ponadto, jeśli ogromny RDD jest buforowany w pamięci i nie ma wystarczającej ilości pamięci podręcznej, to Pozostałe partycje, które nie są w stanie zmieścić się w pamięci podręcznej, są rozlewane na dysk, jeśli użyjemy MEMORY_AND_DISK.

ponownie wyzwaniem są operacje We / Wy.

Uwaga: dane zapisane na dysku są przechowywane w lokalizacji tmp.

format pamięci

serializacja-możemy wybrać serializację danych przechowywanych w pamięci cache.

MEMORY_ONLY_SER i MEMORY_AND_DISK_SER

utrzymywanie RDD w postaci serializowanej (binarnej) pomaga zmniejszyć rozmiar RDD, co czyni miejsce na więcej RDD w pamięci podręcznej. Te dwa formaty pamięci zajmują mało miejsca.

ale problem z tym polega na tym, że są one mniej wydajne czasowo, ponieważ musimy ponosić koszty czasu związane z deserializacją danych.

więc to wybór dewelopera, czy liczy się wydajność, czy pamięć masowa. Zdecydowanie wpływ na wydajność nie byłby duży, ale byłby minutowy.

replikacja partycji

przechowuje partycję na dwóch węzłach.

DISK_ONLY_2
MEMORY_AND_DISK_2
MEMORY_ONLY_2
MEMORY_AND_DISK_SER_2
MEMORY_ONLY_SER_2

te opcje przechowują replikowaną kopię RDD w pamięci podręcznej innego węzła roboczego.

replikowane dane na dysku zostaną wykorzystane do odtworzenia partycji tj. pomaga to ponownie obliczyć RDD, jeśli drugi węzeł roboczy upadnie.

Unpersisting the RDD

– to stop persistence and remove from memory or disk
– to change an RDD ’ s persistence level
rdd.unpersist()

tak więc możemy pracować z pamięcią cache w Apache Spark.

to wszystko z tego bloga, mam nadzieję, że ci się podobało i pomogło!! Pozostań w kontakcie, aby uzyskać więcej przyszłych blogów. Dziękuję!!

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.