Důležité informace o provozu pro strukturované streamování

Spouštějte úlohy strukturovaného streamování v produkčním prostředí jako naplánované úlohy Lakeflow na Azure Databricks. Podívejte se na Úlohy Lakeflow.

Databricks doporučuje, abyste vždy nakonfigurovali následující:

  • Odeberte nepotřebný kód z poznámkových bloků, který by vrátil výsledky, například display a count.
  • Nespouštějte úlohy strukturovaného streamování pomocí univerzálních výpočetních prostředků. Vždy naplánujte streamy jako úlohy Lakeflow pomocí výpočetních prostředků úloh.
  • Plánování úloh Lakeflow pomocí Continuous režimu Toto se týká funkce plánování úloh Azure Databricks, nikoli intervalu spuštění strukturovaného streamování .
  • Nepovolujte automatické škálování pro výpočetní prostředky pro úlohy strukturovaného streamování.

Některé úlohy můžou využívat tyto výhody:

Databricks zavedla deklarativní kanály Sparku pro Lakeflow, aby se snížila složitost správy produkční infrastruktury pro úlohy strukturovaného streamování. Databricks doporučuje používat deklarativní kanály Sparku Lakeflow pro nové kanály strukturovaného streamování. Viz Lakeflow Spark deklarativní kanály.

Poznámka:

Automatické škálování má omezení při zmenšování velikosti clusteru pro práce se strukturovaným streamováním. Databricks doporučuje používat deklarativní kanály Sparku Lakeflow s vylepšeným automatickým škálováním pro úlohy streamování. Viz Optimalizace využití clusteru deklarativních kanálů Lakeflow Spark pomocí automatického škálování.

:::Poznámka: Výpočetní prostředky bez serveru

Na serverless výpočtech se podporují jenom Trigger.AvailableNow() a Trigger.Once(). Databricks doporučuje Trigger.AvailableNow().

Pro průběžné streamování na bezserverové výpočetní technice použijte režim spuštěný událostmi vs. průběžný režim pipeline v průběžném režimu.

Viz omezení streamování.

:::

Návrh úloh streamování tak, aby očekával selhání

Databricks doporučuje, abyste vždy nakonfigurovali úlohy streamování tak, aby se automaticky restartovala při selhání. Některé funkce, včetně evoluce schématu, vyžadují, aby se úlohy Structured Streaming automaticky opakovaly. Viz Konfigurace úloh strukturovaného streamování pro restartování dotazů streamování při selhání.

Některé operace jako foreachBatch poskytují záruky alespoň jednou namísto přesně jednou. U těchto operací se ujistěte, že váš zpracovatelský řetězec je idempotentní. Viz Použití příkazu foreachBatch k zápisu do libovolných datových jímek.

Poznámka:

Když se dotaz restartuje, zpracuje se mikrodávka naplánovaná během předchozího spuštění. Pokud vaše úloha selhala kvůli chybě nedostatku paměti nebo jste ručně zrušili úlohu kvůli nadměrné mikrodávce, možná budete muset vertikálně navýšit kapacitu výpočetních prostředků, aby bylo možné úspěšně zpracovat mikrodávku.

Pokud změníte konfigurace mezi spuštěními, tyto konfigurace se vztahují na první plánovanou dávku. Viz Obnovení po změnách v dotazu strukturovaného streamingu.

Když se úloha opakuje

Jako součást úlohy v Azure Databricks můžete naplánovat více úkolů. Když konfigurujete úlohu pomocí průběžného triggeru, nemůžete nastavit závislosti mezi úkoly.

Pomocí jednoho z následujících přístupů můžete naplánovat více datových proudů v jedné úloze:

  • Více úkolů: Definujte úlohu s více úlohami, které spouštějí úlohy streamování pomocí průběžného triggeru.
  • Více dotazů: Definujte více streamovaných dotazů ve zdrojovém kódu pro jeden úkol.

Tyto strategie můžete také kombinovat. Následující tabulka porovnává tyto přístupy.

Strategie Více úkolů Více dotazů
Jak se výpočetní funkce sdílí? Databricks doporučuje nasazení výpočetních prostředků adekvátní velikosti pro každý streamovací úkol. Volitelně můžete sdílet výpočetní prostředky napříč úkoly. Všechny dotazy sdílejí stejný výpočetní výkon. Dotazy můžete volitelně přiřadit fondům plánovače.
Jak se zpracovávají opakované pokusy? Všechny úkoly musí selhat, než dojde k opakování úkolu. Úloha se opakuje, pokud některý dotaz selže.

Další podrobnosti o práci s více úlohami nebo dotazy najdete v tématu Spouštění více dotazů strukturovaného streamování ve stejném clusteru.

Konfigurace úloh strukturovaného streamování pro restartování dotazů streamování při selhání

Databricks doporučuje nakonfigurovat všechny streamovací úlohy pomocí průběžného spouštěče. Viz Průběžné spouštění úloh.

Průběžná aktivační událost má ve výchozím nastavení následující chování:

  • Zabraňuje souběžnému spuštění úlohy více než jednou.
  • Spustí nové spuštění v případě, že předchozí spuštění selže.
  • Pro opakování používá exponenciální ústup.

Databricks doporučuje při plánování pracovních postupů vždy používat výpočetní prostředky úloh místo výpočetních prostředků pro všechny účely. Při selhání úlohy a opakování nasadíte nové výpočetní prostředky.

Poznámka:

Databricks doporučuje, abyste je nepoužíli streamingQuery.awaitTermination() nebo spark.streams.awaitAnyTermination(). Viz Kdy použít awaitTermination().

Kdy použít awaitTermination()

streamingQuery.awaitTermination() a spark.streams.awaitAnyTermination() zablokujte aktuální vlákno, dokud se dotaz streamování neukončil. To, jestli se mají tyto funkce používat, závisí na vašem spouštěcím prostředí.

Pro úlohy Lakeflow nepoužívejte streamingQuery.awaitTermination() nebo spark.streams.awaitAnyTermination(). Tyto funkce nejsou nezbytné, protože služba pro úlohy automaticky zabraňuje dokončení procesu, když je streamovací dotaz aktivní. Obě funkce blokují buňky poznámkového bloku od dokončení a brání službě úloh ve sledování toku streamovacích dotazů, což narušuje metriky backlogu a oznámení úloh.

Použijte awaitTermination() v následujících případech:

Případ použití Chování
Interaktivní poznámkové bloky na výpočetních prostředcích pro všechny účely awaitTermination() udržuje buňku spuštěnou, umožňuje sledovat stav dotazu a zajistit, že se v výstupu poznámkového bloku zobrazí selhání.
Místní a vývojová prostředí Při místním spuštění programu Spark se proces po dokončení hlavního vlákna ukončí. Zavolejte awaitTermination(), aby program zůstal aktivní, dokud se dotaz ke streamování nedokončí nebo se nezdaří.
Šíření selhání do ovladače Bez awaitTermination() toho se selhání streamovacího dotazu v nekontextu úlohy nemusí rozšířit do volajícího vlákna. Dotaz může bezobslužně selhat, což znesnadňuje zjišťování a diagnostiku selhání. Volání awaitTermination() v ovladači opět vyvolá výjimku při dotazu.