Sdílet prostřednictvím


Optimalizace zpracování dat pro Apache Spark

Tento článek popisuje, jak optimalizovat konfiguraci clusteru Apache Spark pro zajištění nejlepšího výkonu ve službě Azure HDInsight.

Přehled

Pokud máte pomalé úlohy ve spojení nebo náhodném přehrávání, příčinou je pravděpodobně nerovnoměrná distribuce dat. Nerovnoměrná distribuce dat je asymetrie v datech vaší úlohy. Například úloha mapování může trvat 20 sekund. Spuštění úlohy, ve které jsou data spojená nebo prohazovaná, ale trvá hodiny. Pokud chcete vyřešit nerovnoměrnou distribuci dat, měli byste celý klíč zasolit nebo použít izolovanou sůl jenom pro některé podmnožinu klíčů. Pokud používáte izolovanou sůl, měli byste dále filtrovat a izolovat podmnožinu slaných klíčů ve spojeních s mapami. Další možností je nejprve zavést sloupec kbelíku a předběžnou agregaci v kontejnerech.

Dalším faktorem, který způsobuje pomalé spojení, může být typ spojení. Spark ve výchozím nastavení používá SortMerge typ spojení. Tento typ spojení je nejvhodnější pro velké datové sady. Ale jinak je výpočetně náročná, protože před sloučením dat musí nejprve seřadit levou a pravou stranu dat.

Spojení Broadcast je nejvhodnější pro menší datové sady nebo tam, kde je jedna strana spojení mnohem menší než druhá strana. Tento typ spojení vysílá jednu stranu všem exekutorům, a proto obecně vyžaduje více paměti pro všesměrová vysílání.

Typ spojení v konfiguraci můžete změnit nastavením spark.sql.autoBroadcastJoinThresholdnebo můžete nastavit nápovědu ke spojení pomocí rozhraní API datového rámce (dataframe.join(broadcast(df2))).

// Option 1
spark.conf.set("spark.sql.autoBroadcastJoinThreshold", 1*1024*1024*1024)

// Option 2
val df1 = spark.table("FactTableA")
val df2 = spark.table("dimMP")
df1.join(broadcast(df2), Seq("PK")).
    createOrReplaceTempView("V_JOIN")

sql("SELECT col1, col2 FROM V_JOIN")

Pokud používáte tabulky s rozdělením do intervalů, máte třetí typ spojení– Merge spojení. Správně předem rozdělená a předem seřazená datová sada přeskočí náročnou SortMerge fázi řazení ze spojení.

Pořadí spojení záleží, zejména u složitějších dotazů. Začněte s nejselektivnějšími spojeními. Pokud je to možné, přesouvejte spojení, která zvyšují počet řádků po agregaci.

Pokud chcete spravovat paralelismus pro kartézská spojení, můžete přidat vnořené struktury, práci s okny a možná přeskočit jeden nebo více kroků v úloze Sparku.

Optimalizace spouštění úloh

  • Ukládání do mezipaměti podle potřeby, například pokud data používáte dvakrát, pak je do mezipaměti.
  • Proměnné vysílání do všech exekutorů Proměnné jsou serializovány pouze jednou, což vede k rychlejšímu vyhledávání.
  • Použijte fond vláken v ovladači, což vede k rychlejšímu provozu pro mnoho úloh.

Pravidelně monitorujte spuštěné úlohy z hlediska problémů s výkonem. Pokud potřebujete další přehled o některých problémech, zvažte jeden z následujících nástrojů pro profilaci výkonu:

Klíčem k výkonu dotazů Sparku 2.x je modul Wolfram, který závisí na generování kódu celé fáze. V některých případech může být generování kódu celé fáze zakázané. Pokud například ve výrazu SortAggregate agregace použijete neměnný typ (string), zobrazí se místo HashAggregate. Pokud chcete například zlepšit výkon, vyzkoušejte následující postup a pak znovu povolte generování kódu:

MAX(AMOUNT) -> MAX(cast(AMOUNT as DOUBLE))

Další kroky