Share via


Optimalisatie van gegevensopslag voor Apache Spark

In dit artikel worden strategieën besproken voor het optimaliseren van gegevensopslag voor een efficiënte uitvoering van Apache Spark-taken in Azure HDInsight.

Overzicht

Spark biedt ondersteuning voor veel indelingen, zoals csv, json, xml, parquet, orc en avro. Spark kan worden uitgebreid om ondersteuning te bieden voor veel meer indelingen met externe gegevensbronnen. Raadpleeg Apache Spark-pakketten voor meer informatie.

De beste indeling voor prestaties is parquet met snappy-compressie. Dit is de standaardinstelling in Spark 2.x. Met parquet worden gegevens opgeslagen in de kolomindeling. Parquet is bovendien zeer geoptimaliseerd in Spark.

Gegevensabstractie kiezen

Eerdere Spark-versies gebruiken RDD’s voor gegevensabstractie. In Spark 1.3 en 1.6 zijn respectievelijk DataFrames en DataSets geïntroduceerd. Bekijk de volgende relatieve voordelen:

  • DataFrames
    • Beste keuze in de meeste situaties.
    • Biedt queryoptimalisatie via Catalyst.
    • Codegeneratie in de volledige fase.
    • Directe geheugentoegang.
    • Lage GC-overhead (garbagecollection).
    • Niet zo ontwikkelaarsvriendelijk als DataSets, omdat er geen controle van compilatietijd of programmering van domeinobjecten beschikbaar is.
  • DataSets
    • Goed voor complexe ETL-pijplijnen, waarbij de impact op de prestaties acceptabel is.
    • Niet goed voor aggregaties waarbij de impact op de prestaties aanzienlijk kan zijn.
    • Biedt queryoptimalisatie via Catalyst.
    • Ontwikkelaarsvriendelijk vanwege de beschikbare programmering van domeinobjecten en controle van compilatietijd.
    • Voegt overhead voor serialisatie/deserialisatie toe.
    • Hoge GC-overhead.
    • Verbreekt codegeneratie in de volledige fase.
  • RDD’s
    • U hoeft geen RDD's te gebruiken, tenzij u een nieuwe aangepaste RDD wilt maken.
    • Geen queryoptimalisatie via Catalyst.
    • Geen codegeneratie in de volledige fase.
    • Hoge GC-overhead.
    • Moeten gebruikmaken van verouderde API’s voor Spark 1.x.

Standaardopslag selecteren

Wanneer u een nieuw Spark-cluster maakt, kunt u Azure Blob Storage of Azure Data Lake Storage selecteren als de standaardopslag van uw cluster. Beide opties bieden u het voordeel van langetermijnopslag voor tijdelijke clusters. Uw gegevens worden dus niet automatisch verwijderd wanneer u uw cluster verwijdert. U kunt een tijdelijk cluster opnieuw maken en toch toegang krijgen tot uw gegevens.

Winkeltype Bestandssysteem Snelheid Tijdelijk Gebruiksscenario's
Azure Blob Storage wasb://url/ Standard Yes Tijdelijk cluster
Azure Blob Storage (veilig) wasbs://url/ Standard Yes Tijdelijk cluster
Azure Data Lake Storage Gen 2 abfs://url/ Sneller Yes Tijdelijk cluster
Azure Data Lake Storage Gen 1 adl://url/ Sneller Yes Tijdelijk cluster
Lokale HDFS hdfs://url/ Snelste No Interactief 24/7-cluster

Zie Opslagopties vergelijken voor gebruik met Azure HDInsight-clusters voor een volledige beschrijving van opslagopties.

De cache gebruiken

Spark biedt systeemeigen mechanismen voor caching die kunnen worden gebruikt via verschillende methoden, zoals .persist(), .cache() en CACHE TABLE. Deze systeemeigen caching is effectief met kleine gegevenssets en in ETL-pijplijnen waar u tussenliggende resultaten in de cache moet opslaan. Systeemeigen Spark-caching werkt momenteel echter niet goed met partitionering, omdat gepartitioneerde gegevens niet behouden blijven in een in cache geplaatste tabel. Een algemenere en betrouwbaardere cachingtechniek is opslaglaagcaching.

  • Systeemeigen Spark-caching (niet aanbevolen)

    • Geschikt voor kleine gegevenssets.
    • Werkt niet met partitionering, wat in toekomstige Spark-releases kan veranderen.
  • Opslaan op opslagniveau in cache (aanbevolen)

    • Kan worden geïmplementeerd in HDInsight met behulp van de functie IO-cache .
    • Maakt gebruik van in-memory en SSD caching.
  • Lokale HDFS (aanbevolen)

    • hdfs://mycluster Pad.
    • Maakt gebruik van SSD-caching.
    • Gegevens in de cache gaan verloren wanneer u het cluster verwijdert, waardoor de cache opnieuw moet worden opgebouwd.

Gegevensserialisatie optimaliseren

Spark-taken worden gedistribueerd, daarom is de juiste gegevensserialisatie belangrijk voor de beste prestaties. Er zijn twee opties voor serialisatie voor Spark:

  • Java-serialisatie is de standaardinstelling.
  • Kryo serialisatie is een nieuwere indeling en kan leiden tot snellere en compactere serialisatie dan Java. Kryo vereist dat u de klassen in uw programma registreert en dat nog niet alle serialiseerbare typen worden ondersteund.

Bucketing gebruiken

Bucketing is vergelijkbaar met gegevenspartitionering. Maar elke bucket kan een set kolomwaarden bevatten in plaats van slechts één. Deze methode werkt goed voor partitionering op grote (miljoenen of meer) waarden, zoals product-id's. Een bucket wordt bepaald door de bucketsleutel van de rij te hashen. Tabellen die in buckets zijn geplaatst, bieden unieke optimalisaties, omdat ze metagegevens bevatten over de bucketing of sortering.

Enkele geavanceerde functies voor bucketing zijn:

  • Queryoptimalisatie op basis van bucketing van metagegevens.
  • Geoptimaliseerde aggregaties.
  • Geoptimaliseerde joins.

U kunt partitionering en bucketing gelijktijdig gebruiken.

Volgende stappen