2015-06-12 5 views
25

Używam aplikacji strumieniowej Spark z 2 pracownikami. Aplikacja ma operacje łączenia i łączenia.Jak zoptymalizować wyciek losowy w aplikacji Apache Spark

Wszystkie partie zakończyły się pomyślnie, ale zauważyliśmy, że metryki losowego rozlewania nie są zgodne z rozmiarem danych wejściowych ani wielkością danych wyjściowych (pojemność pamięci jest większa niż 20 razy).

Proszę znaleźć szczegóły sceniczne iskra w poniższy obrazek: enter image description here

Po zbadaniu tej sprawie, uznał, że

Shuffle rozlanie się dzieje, gdy nie ma wystarczającej ilości pamięci dla danych shuffle.

Shuffle spill (memory) - rozmiar rozszeregować postaci danych w pamięci w czasie przechodzenia

shuffle spill (disk) - rozmiar odcinkach postaci danych na dysku po przechodzeniu

Ponieważ rozszeregować danych zajmuje więcej miejsca niż serializowane dane. Tak więc, Shuffle spill (memory) jest czymś więcej.

Zauważono, że ten rozmiar rozlanej pamięci jest niesamowicie duży z dużymi danymi wejściowymi.

Moje pytania są następujące:

robi to wycieki znacznie wpływa na wydajność?

Jak zoptymalizować to rozlewając zarówno pamięć, jak i dysk?

Czy istnieją właściwości Spark, które mogą zmniejszyć/kontrolować to ogromne wycieki?

+0

@mitchus Częściowo Tak, właśnie zwiększyłem liczbę zadań i przydzielono więcej pamięci frakcji do przetasowania. Zoptymalizowałem też mój kod, aby skompaktować rozmiar struktury danych ... –

Odpowiedz

34

Uczenie się dostrajania Spark wymaga sporo badań i nauki. Istnieje kilka dobrych zasobów, w tym this video. Spark 1.4 ma lepszą diagnostykę i wizualizację w interfejsie, która może ci pomóc.

Podsumowując, rozlewasz się, gdy rozmiar partycji RDD na końcu etapu przekracza ilość pamięci dostępnej dla bufora losowego.

Można:

  1. Ręcznie repartition() swoją przed etapem tak, że masz mniejsze partycje od wejścia.
  2. Zwiększenie bufor losowego przez zwiększenie pamięci w procesach executorów (spark.executor.memory)
  3. Zwiększenie bufor losowego zwiększając część pamięci executora przydzielonej do niego (spark.shuffle.memoryFraction) z domyślnego 0,2. Musisz oddać spark.storage.memoryFraction.
  4. Zwiększ bufor losowego na wątek poprzez zmniejszenie współczynnika wątków roboczych (SPARK_WORKER_CORES) do Egzekutor pamięć

Jeśli jest słuchanie ekspert, chciałbym wiedzieć więcej o tym, jak ustawienia memoryFraction interakcji i ich racjonalne zasięg.

+0

Repartycja może tasować niepotrzebne dane, wykorzystywać wewnętrznie spójnik, aby zminimalizować tasowanie. –

+4

@VenuAPositive Myślę, że sugerował partycjonowanie na więcej partycji nie mniej. Gdyby miał zmniejszyć liczbę partycji, zjednoczenie miałoby sens. –

+0

spark.shuffle.memoryFraction nie jest już używana od iskry 1.5, chyba że włączysz tryb starszego typu. Zobacz: https://spark.apache.org/docs/latest/configuration.html –