Optymalizacja magazynu danych dla platformy Apache Spark
W tym artykule omówiono strategie optymalizacji magazynu danych w celu wydajnego wykonywania zadań platformy Apache Spark w usłudze Azure HDInsight.
Omówienie
Platforma Spark obsługuje wiele formatów, takich jak csv, json, xml, parquet, orc i avro. Platforma Spark może zostać rozszerzona, aby obsługiwać wiele formatów z zewnętrznymi źródłami danych — aby uzyskać więcej informacji, zobacz Pakiety platformy Apache Spark.
Najlepszym formatem wydajności jest parquet z kompresją snappy, która jest domyślna w spark 2.x. Parquet przechowuje dane w formacie kolumnowym i jest wysoce zoptymalizowany na platformie Spark.
Wybieranie abstrakcji danych
Wcześniejsze wersje platformy Spark używają rdD do abstrakcji danych, platformy Spark 1.3 i 1.6, odpowiednio wprowadzonych ramek danych i zestawów danych. Rozważ następujące względne zalety:
-
Ramki danych
- Najlepszy wybór w większości sytuacji.
- Zapewnia optymalizację zapytań za pośrednictwem katalizatora.
- Generowanie kodu na całym etapie.
- Bezpośredni dostęp do pamięci.
- Niskie obciążenie związane z odzyskiwaniem pamięci (GC).
- Nie tak przyjazne dla deweloperów, jak zestawy danych, ponieważ nie ma kontroli czasu kompilacji ani programowania obiektów domeny.
-
Zestawach danych
- Dobre w złożonych potokach ETL, w których wpływ na wydajność jest akceptowalny.
- Nie jest dobra w agregacjach, w których wpływ na wydajność może być znaczny.
- Zapewnia optymalizację zapytań za pośrednictwem katalizatora.
- Przyjazny dla deweloperów, zapewniając programowanie obiektów domeny i sprawdzanie czasu kompilacji.
- Dodaje obciążenie serializacji/deserializacji.
- Wysokie obciążenie GC.
- Przerywa generowanie kodu na całym etapie.
-
RDD
- Nie musisz używać RDD, chyba że musisz utworzyć nowy niestandardowy rdD.
- Brak optymalizacji zapytań za pośrednictwem katalizatora.
- Brak generowania kodu na całym etapie.
- Wysokie obciążenie GC.
- Musi używać starszych interfejsów API platformy Spark 1.x.
Wybierz magazyn domyślny
Podczas tworzenia nowego klastra Spark możesz wybrać Azure Blob Storage lub Azure Data Lake Storage jako domyślny magazyn klastra. Obie opcje zapewniają korzyści z długoterminowego magazynowania dla klastrów przejściowych. W związku z tym dane nie są automatycznie usuwane po usunięciu klastra. Możesz ponownie utworzyć przejściowy klaster i nadal uzyskiwać dostęp do danych.
Typ sklepu | System plików | Szybkość | Przejściowy | Przypadki użycia |
---|---|---|---|---|
Azure Blob Storage | wasb://url/ | Standardowa | Tak | Klaster przejściowy |
Azure Blob Storage (bezpieczne) | wasbs://url/ | Standardowa | Tak | Klaster przejściowy |
Azure Data Lake Storage Gen 2 | abfs://url/ | Szybciej | Tak | Klaster przejściowy |
Azure Data Lake Storage Gen 1 | adl://url/ | Szybciej | Tak | Klaster przejściowy |
Lokalny system plików HDFS | hdfs://url/ | Najszybszy | Nie | Interaktywny klaster 24/7 |
Aby uzyskać pełny opis opcji magazynowania, zobacz Porównanie opcji magazynu do użycia z klastrami usługi Azure HDInsight.
Korzystanie z pamięci podręcznej
Platforma Spark udostępnia własne natywne mechanizmy buforowania, które mogą być używane za pomocą różnych metod, takich jak .persist()
, .cache()
i CACHE TABLE
. Ta natywna pamięć podręczna jest skuteczna w przypadku małych zestawów danych i w potokach ETL, w których trzeba buforować wyniki pośrednie. Jednak buforowanie natywne platformy Spark obecnie nie działa dobrze z partycjonowaniem, ponieważ buforowana tabela nie przechowuje danych partycjonowania. Bardziej ogólną i niezawodną techniką buforowania jest buforowanie warstwy magazynu.
Buforowanie natywnej platformy Spark (niezalecane)
- Dobre dla małych zestawów danych.
- Nie działa z partycjonowaniem, co może ulec zmianie w przyszłych wersjach platformy Spark.
Buforowanie na poziomie magazynu (zalecane)
- Można zaimplementować w usłudze HDInsight przy użyciu funkcji pamięci podręcznej we/wy .
- Używa buforowania w pamięci i ssd.
Lokalny system plików HDFS (zalecane)
-
hdfs://mycluster
Ścieżka. - Używa buforowania SSD.
- Dane buforowane zostaną utracone po usunięciu klastra, co wymaga ponownego skompilowania pamięci podręcznej.
-
Optymalizowanie serializacji danych
Zadania platformy Spark są dystrybuowane, więc odpowiednia serializacja danych jest ważna dla najlepszej wydajności. Istnieją dwie opcje serializacji platformy Spark:
- Serializacja języka Java jest domyślna.
-
Kryo
serializacja jest nowszym formatem i może spowodować szybszą i bardziej kompaktową serializacji niż Java.Kryo
program wymaga zarejestrowania klas w programie i nie obsługuje jeszcze wszystkich typów serializowalnych.
Korzystanie z zasobników
Zasobniki są podobne do partycjonowania danych. Jednak każdy zasobnik może przechowywać zestaw wartości kolumn, a nie tylko jeden. Ta metoda dobrze sprawdza się w przypadku partycjonowania na dużych (w milionach lub więcej) liczb wartości, takich jak identyfikatory produktów. Zasobnik jest określany przez utworzenie skrótu klucza zasobnika wiersza. Tabele zasobnikowe oferują unikatowe optymalizacje, ponieważ przechowują metadane dotyczące sposobu ich zasobnika i sortowania.
Oto niektóre zaawansowane funkcje zasobnika:
- Optymalizacja zapytań oparta na zasobnikach metadanych.
- Zoptymalizowane agregacje.
- Zoptymalizowane sprzężenia.
Można używać partycjonowania i zasobnika w tym samym czasie.