Prozkoumejte nejlepší postupy pro optimalizaci výkonu Spark-IBM Developer

count () na datovém souboru je akce Spark. Je to běžný problém, který jsem viděl, kde existuje více volání count () v aplikacích Spark, které jsou přidány během ladění a nejsou odstraněny. Je dobré hledat akce Spark a odstranit všechny, které nejsou nutné, protože nechceme používat cykly CPU a další zdroje, pokud to není nutné.

formáty souborů

při navrhování datových sad pro vaši aplikaci se ujistěte, že co nejlépe využíváte formáty souborů Dostupné se Spark. Některé věci, které je třeba zvážit:

  • Spark je optimalizován pro Apache parkety a ORC pro čtení propustnost. Spark má podporu vektorizace, která snižuje disk I/O. Sloupcové formáty fungují dobře.
  • použijte formát souboru parkety a použijte kompresi.
  • existují různé formáty souborů a vestavěné zdroje dat, které lze použít v Apache Spark.Použijte rozdělitelné formáty souborů.
  • ujistěte se, že není příliš mnoho malých souborů. Pokud máte mnoho malých souborů, může mít smysl je zhutnit pro lepší výkon.

Paralelismus

  • Zvýšit počet Jiskra oddíly pro zvýšení paralelismu v závislosti na velikosti dat. Ujistěte se, že zdroje klastru jsou optimálně využívány. Příliš málo oddílů by mohlo mít za následek nečinnost některých vykonavatelů, zatímco příliš mnoho oddílů by mohlo mít za následek režii plánování úkolů.
  • Nalaďte oddíly a úkoly. Spark zvládne úkoly 100ms+ a doporučuje alespoň 2-3 úkoly na jádro pro vykonavatele.
  • Spark rozhoduje o počtu oddílů na základě vstupu velikosti souboru. Občas má smysl explicitně specifikovat počet oddílů.
    • read API má volitelný počet oddílů.
    • jiskra.SQL.soubor.maxPartitionBytes, k dispozici v Spark v2. 0.0, pro parkety, orky a JSON.
  • náhodné oddíly mohou být naladěny nastavením spark.SQL.míchat.oddíly, které mají výchozí hodnotu 200. To je opravdu malé, pokud máte velké velikosti datové sady.

Reduce shuffle

Shuffle je nákladná operace, protože zahrnuje přesun dat přes uzly ve vašem clusteru, což zahrnuje i/o sítě a disku. Zde je několik tipů, jak snížit shuffle:

  • Nalaďte jiskru .SQL.míchat.oddíly.
  • rozdělte vstupní datovou sadu vhodně, takže každá velikost úlohy není příliš velká.
  • pomocí uživatelského rozhraní Spark studovat plán hledat příležitost snížit shuffle co nejvíce.
  • doporučení vzorce pro spark.SQL.míchat.příčky:
    • u velkých datových souborů se zaměřte na kdekoli od 100 MB do méně než 200 MB cílové velikosti úkolu pro oddíl(použijte například cílovou velikost 100 MB).
    • jiskra.SQL.míchat.oddíly = kvocient (shuffle stage input size / target size) / total cores) * total cores.

filtr / zmenšit velikost datové sady

hledejte příležitosti k odfiltrování dat co nejdříve ve vašem aplikačním potrubí. Pokud existuje operace filtru a máte zájem provádět analýzu pouze pro podmnožinu dat, použijte tento filtr brzy. Pokud můžete snížit velikost datové sady brzy, udělej to. V dotazu SQL použijte vhodné predikáty filtrů, aby je Spark mohl posunout dolů k podkladovému zdroji dat; selektivní predikáty jsou dobré. Použijte je podle potřeby. Pokud jsou použitelné, použijte filtry oddílů.

Cache vhodně

Spark podporuje ukládání dat do mezipaměti v paměti. K dispozici jsou různé možnosti:

  • použijte ukládání do mezipaměti, když je stejná operace vypočtena vícekrát v toku potrubí.
  • použijte ukládání do mezipaměti pomocí rozhraní persist API k povolení požadovaného nastavení mezipaměti (přetrvávat na disk nebo ne; serializováno nebo ne).
  • buďte si vědomi líné načítání a prime cache v případě potřeby up-front. Některé API jsou dychtivé a některé ne.
  • podívejte se na záložku úložiště Spark UI, kde najdete informace o datových sadách, které jste uložili do mezipaměti.
  • je dobrým zvykem zrušit ukládání dat v mezipaměti, když je používáte, abyste uvolnili zdroje, zejména pokud cluster používáte i další lidé.

Připojit

Připojte je, obecně, nákladnou operaci, takže dávejte pozor na spoje v aplikaci optimalizovat. BroadcastHashJoin je nejvýkonnější pro případy, kdy je jeden ze vztahů dostatečně malý, aby mohl být vysílán. Níže uvádíme několik tipů:

  • Připojte se k objednávce; začněte s nejselektivnějším spojením. Pro vztahy menší než jiskra.SQL.autoBroadcastJoinThreshold, můžete zkontrolovat, zda je vysílání HashJoin vyzvednuto.
  • použijte SQL rady v případě potřeby vynutit určitý typ spojení.
    • příklad: při spojování malé datové sady s velkou datovou sadou může být spojení vysílání nuceno vysílat malou datovou sadu.
    • potvrďte, že Spark zvedá vysílání hash join; pokud ne, lze jej vynutit pomocí nápovědy SQL.
  • Vyhněte se křížovým spojům.
  • vysílání HashJoin je nejvýkonnější, ale nemusí být použitelné, pokud jsou oba vztahy v join velké.
  • Sbírejte statistiky v tabulkách pro Spark pro výpočet optimálního plánu.

Tune cluster resources

  • Tune zdroje na clusteru v závislosti na správci zdrojů a verzi Spark.
  • Nalaďte dostupnou paměť ovladači: spark. ovladač.paměť.
  • vylaďte počet exekutorů a využití paměti a jádra na základě zdrojů v klastru: exekutor-paměť, num-exekutory a exekutor-jádra.

podívejte se na konfigurační dokumentaci pro uvolnění Spark, se kterým pracujete, a použijte příslušné parametry.

Vyhněte se nákladným operacím

  • Vyhněte se objednejte, pokud to není potřeba.
  • při psaní dotazů namísto použití select * získáte všechny sloupce, načtěte pouze sloupce relevantní pro váš dotaz.
  • nevolejte počet zbytečně.

zkosení dat

  • ujistěte se, že oddíly mají stejnou velikost, aby se zabránilo zkosení dat a problémům s nízkým využitím CPU.
    • Jako příklad: Pokud máte příchozí data ze zdroje dat JDBC paralelně, a každý z těchto oddílů není načítání podobný počet záznamů, což bude mít za následek nerovné-velikost úlohy (forma dat, zkosení). Možná je jeden oddíl jen několik KB, zatímco jiný je několik set MB. Některé úkoly bude větší než ostatní, a zatímco exekutoři na větší úkoly bude obsazeno, jiné exekutory, které se starají o menší úkol, dokončit a být v nečinnosti.
    • Pokud jsou data u zdroje není rozdělen optimálně, můžete také vyhodnotit kompromisy použití rozdělení získat vyvážený oddíl a pak pomocí ukládání do mezipaměti přetrvávat v paměti, pokud je to vhodné.
  • Rozdělení způsobí, shuffle, shuffle je náročná operace, takže by to mělo být hodnoceno na základě žádosti.
  • pomocí uživatelského rozhraní Spark vyhledejte velikosti oddílů a dobu trvání úlohy.

UDFs

Spark má řadu vestavěných uživatelsky definovaných funkcí (UDFs) k dispozici. Pokud jde o výkon, zkontrolujte, zda můžete použít jednu z vestavěných funkcí, protože jsou dobré pro výkon. Vlastní UDFs v Scala API jsou výkonnější než Python UDFs. Pokud budete muset použít Python API, použijte nově zavedené pandy UDF v Pythonu, který byl propuštěn v Spark 2.3. Podpora pandas UDF (vectorized UDFs) v Spark má významné zlepšení výkonu na rozdíl od psaní vlastního Pythonu UDF. Získejte více informací o psaní pandy UDF.

doufám, že vám to pomohlo při psaní aplikací Spark. Šťastný rozvoj! V nadcházejícím blogu vám ukážu, jak získat plán provádění vaší práce Spark.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.