Według Learning Spark
Pamiętaj, że podział danych na partycje jest dość kosztowną operacją. Spark ma również zoptymalizowaną wersję
repartition()
wywołania,coalesce()
która pozwala uniknąć przenoszenia danych, ale tylko wtedy, gdy zmniejsza się liczbę partycji RDD.
Jedną różnicą, którą dostaję, jest to, że wraz repartition()
z liczbą partycji można zwiększać / zmniejszać, ale z coalesce()
liczbą partycji można tylko zmniejszać.
Jeśli partycje są rozproszone na wielu komputerach i coalesce()
są uruchomione, w jaki sposób można uniknąć przenoszenia danych?
źródło
minimize data movement
zamiastavoiding data movement
.repartition
należy użyć zamiastcoalesce
?repartition
co trzeba , to wywołaćcoalesce
zshuffle
parametrem ustawionym na true. Jeśli to pomoże, to daj mi znać.shuffle = true
flagąOdpowiedź Justina jest niesamowita i ta odpowiedź jest głębsza.
repartition
Algorytm robi pełną shuffle i tworzy nowe partycje z danymi, które jest rozprowadzane równomiernie. Utwórzmy ramkę danych o liczbach od 1 do 12.numbersDf
zawiera 4 partycje na moim komputerze.Oto jak dane są dzielone na partycje:
Zróbmy dokładnie losowanie z tą
repartition
metodą i uzyskaj te dane w dwóch węzłach.Oto sposób
numbersDfR
partycjonowania danych na moim komputerze:repartition
Metoda sprawia, że nowe partycje i równomiernie rozprowadza dane w nowych partycji (rozkład danych jest więcej, nawet w przypadku większych zbiorów danych).Różnica między
coalesce
irepartition
coalesce
wykorzystuje istniejące partycje, aby zminimalizować ilość danych, które są przetasowane.repartition
tworzy nowe partycje i wykonuje pełne losowanie.coalesce
skutkuje partycjami o różnych ilościach danych (czasami partycjami, które mają wiele różnych rozmiarów) irepartition
skutkuje mniej więcej jednakowymi rozmiarami partycji.Jest
coalesce
alborepartition
szybciej?coalesce
może działać szybciej niżrepartition
, ale partycje o nierównej wielkości są zazwyczaj wolniejsze w pracy niż partycje o równej wielkości. Zwykle będziesz musiał ponownie podzielić zestawy danych po przefiltrowaniu dużego zestawu danych. Odkryłem, żerepartition
ogólnie jest szybszy, ponieważ Spark jest zbudowany do pracy z partycjami równej wielkości.Uwaga: Z ciekawością zauważyłem, że podział może zwiększyć rozmiar danych na dysku . Pamiętaj, aby uruchamiać testy, gdy używasz partycji / łączenia na dużych zestawach danych.
Przeczytaj ten post na blogu, jeśli chcesz uzyskać więcej informacji.
Kiedy w praktyce użyjesz łączenia i podziału
źródło
rdd.glom().map(len).collect()
ale daje dużo błędów OOM.repartition
algorytm nie rozdziela danych w równym stopniu dla bardzo małych zestawów danych. Kiedyśrepartition
organizowałem 5 milionów rekordów na 13 partycjach, a każdy plik miał od 89,3 MB do 89,6 MB - to całkiem równe!Należy tutaj dodać, że podstawową zasadą Spark RDD jest niezmienność. Podział lub łączenie utworzy nowy RDD. Podstawowy RDD będzie nadal istniał z pierwotną liczbą partycji. Jeśli przypadek użycia wymaga utrzymania RDD w pamięci podręcznej, to samo należy zrobić dla nowo utworzonego RDD.
źródło
repartition
- zaleca się korzystanie z niego podczas zwiększania liczby partycji, ponieważ wiąże się to z tasowaniem wszystkich danych.coalesce
- zaleca się korzystanie z niego przy jednoczesnym zmniejszeniu liczby partycji. Na przykład, jeśli masz 3 partycje i chcesz je zmniejszyć do 2,coalesce
przeniesie dane trzeciej partycji do partycji 1 i 2. Partycja 1 i 2 pozostaną w tym samym kontenerze. Z drugiej stronyrepartition
będzie tasować dane we wszystkich partycjach, dlatego użycie sieci między programami wykonawczymi będzie wysokie i wpłynie to na wydajność.coalesce
działa lepiej niżrepartition
przy zmniejszeniu liczby partycji.źródło
Z kodu i dokumentacji kodu wynika, że
coalesce(n)
jest on taki sam jakcoalesce(n, shuffle = false)
irepartition(n)
jest taki sam jakcoalesce(n, shuffle = true)
Tak więc, zarówno
coalesce
irepartition
mogą być wykorzystane do zwiększenia liczby partycjiInną ważną uwagą do podkreślenia jest to, że jeśli drastycznie zmniejszysz liczbę partycji, powinieneś rozważyć użycie wersji losowej
coalesce
(tak samo jakrepartition
w tym przypadku). Umożliwi to wykonywanie obliczeń równolegle na partycjach nadrzędnych (wiele zadań).Proszę również odnieść się do powiązanej odpowiedzi tutaj
źródło
Wszystkie odpowiedzi dodają świetnej wiedzy do tego często zadawanego pytania.
Zgodnie z tradycją osi czasu tego pytania, oto moje 2 centy.
Przekonałem się, że podział jest szybszy niż łączenie , w bardzo szczególnym przypadku.
W mojej aplikacji, gdy szacowana liczba plików jest niższa niż określony próg, podział na partycje działa szybciej.
Oto co mam na myśli
W powyższym fragmencie, jeśli moje pliki miały mniej niż 20, łączenie trwało wieczność, a podział był znacznie szybszy, więc powyższy kod.
Oczywiście ta liczba (20) będzie zależeć od liczby pracowników i ilości danych.
Mam nadzieję, że to pomaga.
źródło
Podział : Przetasuj dane w NOWĄ liczbę partycji.
Na przykład. Początkowa ramka danych jest podzielona na 200 partycji.
df.repartition(500)
: Dane zostaną przetasowane z 200 partycji do nowych 500 partycji.Koalescencja : Przetasuj dane do istniejącej liczby partycji.
df.coalesce(5)
: Dane zostaną przetasowane z pozostałych 195 partycji do 5 istniejących partycji.źródło
Chciałbym dodać do odpowiedzi Justina i Mocy, że -
repartition
zignoruje istniejące partycje i utworzy nowe. Możesz więc użyć go do naprawy przesunięcia danych. Możesz wymienić klucze partycji, aby zdefiniować dystrybucję. Skośność danych jest jednym z największych problemów w przestrzeni problemów „dużych zbiorów danych”.coalesce
będzie działać z istniejącymi partycjami i przetasować ich podzbiór. Nie może naprawić przesunięcia danych tak bardzo jakrepartition
robi. Dlatego nawet jeśli jest tańszy, może nie być tym, czego potrzebujesz.źródło
Do wszystkich wspaniałych odpowiedzi, które chciałbym dodać,
repartition
jest to jedna z najlepszych opcji skorzystania z równoległości danych. Chociażcoalesce
daje tanią opcję zmniejszenia partycji i jest bardzo przydatny podczas zapisywania danych na HDFS lub innym zlewie, aby skorzystać z dużych zapisów.Uznałem to za przydatne przy zapisywaniu danych w formacie parkietu, aby uzyskać pełną przewagę.
źródło
Dla kogoś, kto miał problemy z wygenerowaniem pojedynczego pliku csv z PySpark (AWS EMR) jako wyjściem i zapisaniem go na s3, pomógł podział partycji. Powodem jest to, że łączenie nie może wykonać pełnego przetasowania, ale podział może. Zasadniczo można zwiększać lub zmniejszać liczbę partycji za pomocą podziału, ale można tylko zmniejszyć liczbę partycji (ale nie 1) za pomocą koalescencji. Oto kod dla każdego, kto próbuje napisać csv z AWS EMR do s3:
źródło
W prosty sposób COALESCE: - służy tylko do zmniejszenia liczby partycji, bez przetasowania danych po prostu kompresuje partycje
ZMIANA: - służy zarówno do zwiększania, jak i zmniejszania liczby partycji, ale tasowanie ma miejsce
Przykład:-
Oba działają dobrze
Ale idziemy ogólnie o te dwie rzeczy, gdy potrzebujemy zobaczyć dane wyjściowe w jednym klastrze, idziemy z tym.
źródło
Ale także powinieneś się upewnić, że dane, które nadchodzą, powinny być wysoce skonfigurowane, jeśli masz do czynienia z dużymi danymi. Ponieważ wszystkie dane zostaną załadowane do tych węzłów, może to prowadzić do wyjątku pamięci. Chociaż naprawa jest kosztowna, wolę z niej korzystać. Ponieważ tasuje i równo rozprowadza dane.
Mądrze jest wybierać między łączeniem i dzieleniem.
źródło
repartition
Algorytm robi pełną Shuffle danych i tworzy równe wielkości partycji danych.coalesce
łączy istniejące partycje, aby uniknąć pełnego losowania.Program Coalesce działa dobrze w przypadku pobierania RDD z dużą liczbą partycji i łączenia partycji w pojedynczym węźle roboczym w celu uzyskania ostatecznej RDD z mniejszą liczbą partycji.
Repartition
przetasuje dane w RDD, aby uzyskać ostateczną liczbę żądanych partycji. Partycjonowanie DataFrames wydaje się szczegółem implementacji niskiego poziomu, którym powinien zarządzać framework, ale nim nie jest. Filtrując duże ramki danych na mniejsze, prawie zawsze powinieneś podzielić dane na partycje. Prawdopodobnie będziesz często filtrował duże ramki danych na mniejsze, więc przyzwyczaj się do partycjonowania.Przeczytaj ten post na blogu, jeśli chcesz uzyskać więcej informacji.
źródło