Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
I den här artikeln beskrivs strategier för att optimera datalagring för effektiv Körning av Apache Spark-jobb i Azure HDInsight.
Översikt
Spark stöder många format, till exempel csv, json, xml, parquet, orc och avro. Spark kan utökas för att stödja många fler format med externa datakällor – mer information finns i Apache Spark-paket.
Det bästa formatet för prestanda är parquet med snabb komprimering, vilket är standard i Spark 2.x. Parquet lagrar data i kolumnformat och är mycket optimerad i Spark.
Välj dataabstraktion
Tidigare Spark-versioner använder RDD:er för att abstrahera data, Spark 1.3 och 1.6 introducerade DataFrames respektive DataSets. Tänk på följande relativa fördelar:
-
DataFrames
- Bästa valet i de flesta situationer.
- Ger frågeoptimering via Catalyst.
- Kodgenerering i hela fasen.
- Direkt minnesåtkomst.
- Låg skräpsamling (GC) överbelastning.
- Inte lika utvecklarvänligt som DataSets, eftersom det inte finns några kompileringstidskontroller eller domänobjektprogrammering.
-
Datasets
- Bra i komplexa ETL-pipelines där prestandapåverkan är acceptabel.
- Inte bra i sammansättningar där prestandapåverkan kan vara betydande.
- Ger frågeoptimering via Catalyst.
- Utvecklarvänlig genom att tillhandahålla domänobjektprogrammering och kompileringstidskontroller.
- Lägger till serialisering/deserialiseringskostnader.
- Höga GC-omkostnader.
- Bryter kodgenereringen i hela fasen.
-
RDDs
- Du behöver inte använda RDD:er, såvida du inte behöver skapa en ny anpassad RDD.
- Ingen frågeoptimering via Catalyst.
- Ingen kodgenerering i hela fasen.
- Höga GC-omkostnader.
- Måste använda Äldre API:er för Spark 1.x.
Välj standardlagring
När du skapar ett nytt Spark-kluster kan du välja Azure Blob Storage eller Azure Data Lake Storage som ditt klusters standardlagring. Båda alternativen ger dig fördelen med långsiktig lagring för tillfälliga kluster. Dina data tas därför inte bort automatiskt när du tar bort klustret. Du kan återskapa ett tillfälligt kluster och fortfarande komma åt dina data.
Butikstyp | Filsystem | Hastighet | Kortvarig | Användningsfall |
---|---|---|---|---|
Azure Blob Storage-lagringstjänst | wasb://url/ | Standard | Ja | Tillfälligt kluster |
Azure Blob Storage (säkert) | wasbs://url/ | Standard | Ja | Tillfälligt kluster |
Azure Data Lake Storage Gen 2 | abfs://url/ | Snabbare | Ja | Tillfälligt kluster |
Azure Data Lake Storage Gen 1 | adl://url/ | Snabbare | Ja | Tillfälligt kluster |
Lokal HDFS | hdfs://url/ | snabbaste | Nej | Interaktivt 24/7-kluster |
En fullständig beskrivning av lagringsalternativ finns i Jämför lagringsalternativ för användning med Azure HDInsight-kluster.
Använda cacheminnet
Spark har egna interna cachelagringsmekanismer som kan användas med olika metoder som .persist()
, .cache()
och CACHE TABLE
. Den här interna cachelagringen är effektiv med små datauppsättningar och i ETL-pipelines där du behöver cachelagra mellanliggande resultat. Den inbyggda Spark-cachelagringen fungerar dock för närvarande inte bra med partitionering, eftersom en cachelagrad tabell inte behåller partitioneringsdata. En mer allmän och tillförlitlig cachelagringsteknik är lagringsskiktscache.
Intern Spark-cachelagring (rekommenderas inte)
- Bra för små datamängder.
- Fungerar inte med partitionering, vilket kan ändras i framtida Spark-versioner.
Cachelagring på lagringsnivå (rekommenderas)
- Kan implementeras på HDInsight med hjälp av IO Cache-funktionen .
- Använder minnesintern cachelagring och SSD-cachelagring.
Lokal HDFS (rekommenderat)
-
hdfs://mycluster
sökväg. - Använder SSD-cachelagring.
- Cachelagrade data går förlorade när du tar bort klustret, vilket kräver att cacheminnet återskapas.
-
Optimera dataserialiseringen
Spark-jobb distribueras, så lämplig data serialisering är viktigt för bästa prestanda. Det finns två serialiseringsalternativ för Spark:
- Java-serialisering är standard.
-
Kryo
serialisering är ett nyare format och kan resultera i snabbare och mer kompakt serialisering än Java.Kryo
kräver att du registrerar klasserna i ditt program, och det har ännu inte stöd för alla Serializable-typer.
Använd segmentering
Bucketing liknar datapartitionering. Men varje bucket kan innehålla en uppsättning kolumnvärden i stället för bara en. Den här metoden fungerar bra för partitionering på stora (i miljoner eller fler) antal värden, till exempel produktidentifierare. En bucket bestäms genom att du hashar bucketnyckeln för raden. Bucketade tabeller erbjuder unika optimeringar eftersom de lagrar metadata om hur de bucketades och sorterades.
Några avancerade funktioner för gruppering är:
- Frågeoptimering baserat på bucketing meta-information.
- Optimerade sammansättningar.
- Optimerade kopplingar.
Du kan använda partitionering och bucketing samtidigt.