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

Tato stránka obsahuje doporučení pro plánování úloh strukturovaného streamování pomocí úloh na Azure Databricks.

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.
  • Nepoužívejte úlohy v rámci strukturovaného streamování pomocí obecných výpočetních prostředků. Vždy naplánujte streamy jako úlohy pomocí výpočetní služby úloh.
  • Plánování úloh 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í výpočetních prostředků pro úlohy strukturovaného streamování.

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

Azure Databricks zavedla deklarativní kanály Sparku Lakeflow, které snižují 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ů Sparku Lakeflow 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 vždy konfigurovat úlohy streamování tak, aby se automaticky restartovala při selhání. Některé funkce, včetně evoluce schématu, vyžadují, aby úlohy strukturovaného streamování byly nakonfigurované tak, aby se 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 zopakuje?

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.

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

Databricks doporučuje konfigurovat všechny úlohy streamování pomocí průběžného triggeru. 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 Databricks 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ím awaitTermination() znovu vyvolá chybu dotazu na ovladači.

Použijte plánovací fondy pro více streamovacích dotazů

Fondy plánovačů můžete nakonfigurovat tak, aby přiřazovat výpočetní kapacitu dotazům při spouštění více streamovaných dotazů ze stejného zdrojového kódu.

Ve výchozím nastavení se všechny dotazy spouštějí v notebooku ve stejném vyváženém plánovacím fondu. Úlohy Apache Sparku generované spouštěči ze všech streamovacích dotazů v zápisníku běží jeden po druhém v pořadí "first in, first out" (FIFO), tedy "první dovnitř, první ven". To může způsobit zbytečné prodlevy v dotazech, protože nesdílejí prostředky clusteru efektivně.

Fondy scheduleru umožňují deklarovat, které dotazy strukturovaného streamování sdílejí výpočetní prostředky.

Následující příklad přiřazuje query1 do vyhrazeného fondu, zatímco query2 a query3 sdílejí fond plánovače.

# Run streaming query1 in scheduler pool1
spark.sparkContext.setLocalProperty("spark.scheduler.pool", "pool1")
df.writeStream.queryName("query1").toTable("table1")

# Run streaming query2 in scheduler pool2
spark.sparkContext.setLocalProperty("spark.scheduler.pool", "pool2")
df.writeStream.queryName("query2").toTable("table2")

# Run streaming query3 in scheduler pool2
spark.sparkContext.setLocalProperty("spark.scheduler.pool", "pool2")
df.writeStream.queryName("query3").toTable("table3")

Poznámka:

Konfigurace místní vlastnosti musí být ve stejné buňce poznámkového bloku, ve které spustíte dotaz streamování.

Další informace o fondech spravedlivých plánovačů Apache najdete v dokumentaci ke spravedlivému plánovači Apache.