Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 při Join nebo Shuffle, pravděpodobnou příčinou je nerovnoměrná distribuce dat. Nerovnoměrná distribuce dat je asymetrie v datech vaší úlohy. Například úloha mapování může trvat 20 sekund. Ale spuštění úlohy, ve které jsou data připojená nebo prohazovaná, trvá hodiny. Pokud chcete opravit nerovnoměrnou distribuci dat, měli byste celý klíč zasolit nebo použít izolovanou sůl pouze pro určitou 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ředem agregovat 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. Je ale jinak výpočetně nákladný, protože musí před sloučením nejprve seřadit levou a pravou stranu dat.
Spojení Broadcast
je nejvhodnější pro menší datové sady nebo je-li jedna strana spojení mnohem menší než druhá. Tento typ spojení rozesílá jednu stranu na všechny provádějící jednotky, a proto obecně vyžaduje více paměti pro vysílání.
Typ spojení v konfiguraci můžete změnit nastavením spark.sql.autoBroadcastJoinThreshold
nebo můžete nastavit nápovědu pro 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 kontejnerové tabulky, máte třetí typ spojení, spojení Merge
. Správně předem rozdělená a předem seřazená datová sada přeskočí náročnou fázi řazení v rámci SortMerge
spojení.
Pořadí spojení je důležité, zejména v složitějších dotazech. Začněte s nejvýběrovějšími spojeními. Pokud je to možné, přesuňte také spojení, která zvyšují počet řádků za agregacemi.
Pokud chcete spravovat paralelismus pro kartézské spojení, můžete přidat vnořené struktury, okna a možná přeskočit jeden nebo více kroků v úloze Sparku.
Optimalizace spouštění úloh
- Mezipaměť podle potřeby, například pokud data použijete dvakrát, pak je uložíte do mezipaměti.
- Rozšířit proměnné do všech výpočetních uzlů. Proměnné jsou serializovány pouze jednou, což vede k rychlejšímu vyhledávání.
- Použijte fond vláken na ovladači, což vede k rychlejšímu provozu pro mnoho úloh.
Pravidelně monitorujte spuštěné úlohy kvůli problémům s výkonem. Pokud potřebujete lepší přehled o určitých problémech, zvažte jeden z následujících nástrojů pro profilaci výkonu:
- Nástroj Intel PAL monitoruje využití procesoru, úložiště a šířky pásma sítě.
- Oracle Java 8 Mission Control profiluje kód Spark a vykonávací kód.
Klíčem k výkonu dotazů Sparku 2.x je modul Tungsten, 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ázáno. Pokud například použijete nesměnitelný typ (string
) ve výrazu agregace, SortAggregate
zobrazí se místo HashAggregate
. Pokud chcete například dosáhnout lepšího výkonu, zkuste následující kód a znovu povolte generování kódu:
MAX(AMOUNT) -> MAX(cast(AMOUNT as DOUBLE))
Další kroky
- Optimalizace úložiště dat pro Apache Spark
- Optimalizace využití paměti pro Apache Spark
- Optimalizujte konfiguraci clusteru pro Apache Spark