Výstup Azure Stream Analytics do služby Azure Cosmos DB

Azure Cosmos DB output in Azure Stream Analytics zapisuje výsledky zpracování streamu jako JSON dokumenty do kontejneru Azure Cosmos DB. Podporuje archivaci dat a dotazy s nízkou latencí na nestrukturovaná JSON data. Pochopení chování tohoto výstupu vám pomůže nastavit ho tak, aby odpovídal propustnosti, konzistenci a rozdělení, které váš scénář vyžaduje.

Základy služby Azure Cosmos DB jako cíle výstupu

Výstup Azure Cosmos DB ve Stream Analytics zapisuje výsledky zpracování streamu jako JSON výstup do kontejnerů vaší Azure Cosmos DB. Pokud službu Azure Cosmos DB neznáte, přečtěte si dokumentaci ke službě Azure Cosmos DB a začněte tím.

Stream Analytics se připojuje k Azure Cosmos DB pouze přes SQL API. Ostatní Azure Cosmos DB API zatím nejsou podporována. Pokud nasměrujete Stream Analytics na účty Azure Cosmos DB vytvořené s jinými rozhraními API, nemusí být data správně uložená. Když používáte Azure Cosmos DB jako výstup, nastavte svou práci na úroveň kompatibility 1.2.

Stream Analytics nevytvoří kontejnery ve vaší databázi. Místo toho je potřeba, abyste je vytvořili předem. Pak můžete řídit fakturační náklady na kontejnery Azure Cosmos DB. Výkon, konzistenci a kapacitu kontejnerů můžete také ladit přímo pomocí rozhraní API služby Azure Cosmos DB. Následující části obsahují podrobnosti o některých možnostech kontejneru pro službu Azure Cosmos DB.

Ladění konzistence, dostupnosti a latence

Aby vyhověly požadavkům vaší aplikace, dolaďte databázi a kontejnery v Azure Cosmos DB a dělejte kompromisy mezi konzistencí, dostupností, latencí a propustností.

Podle toho, jakou úroveň konzistence čtení váš scénář vyžaduje vůči latenci čtení a zápisu, zvolte úroveň konzistence na svém databázovém účtu. Pro zvýšení propustnosti zvyšte Request Units (RUs) na kontejneru. Azure Cosmos DB také ve výchozím nastavení umožňuje synchronní indexování pro každou operaci CRUD do vašeho kontejneru. Tato možnost je dalším užitečným způsobem, jak ovládat výkon čtení a zápisu v Azure Cosmos DB. Další informace najdete v článku Změna databáze a úrovní konzistence dotazů.

Upserty ze Stream Analytics

Použitím integrace Stream Analytics s Azure Cosmos DB můžete vkládat nebo aktualizovat záznamy do svého kontejneru na základě daného sloupce ID dokumentu. Tato operace se také nazývá upsert. Stream Analytics používá optimistický přístup k upsertu. Aktualizace probíhají pouze tehdy, pokud vložení selže kvůli konfliktu s ID dokumentu.

Použitím úrovně kompatibility 1.0 provádí Stream Analytics tuto aktualizaci jako operaci PATCH, takže podporuje částečné aktualizace dokumentu. Stream Analytics přidává nové vlastnosti nebo nahrazuje existující vlastnost přírůstkově. Změny hodnot vlastností pole v dokumentu JSON ale způsobí přepsání celého pole. To znamená, že pole není sloučeno.

Použitím úrovně kompatibility 1.2 se chování upsertu změní a dokument se vloží nebo nahrazí. Další část o úrovni kompatibility 1.2 dále popisuje toto chování.

Pokud má příchozí JSON dokument existující ID pole, Azure Cosmos DB toto pole automaticky použije jako sloupec Document ID. Stream Analytics zpracovává jakékoli následné zápisy takto, což vede k jedné z těchto situací:

  • Jedinečné identifikátory způsobují vložení.
  • Duplicitní ID a ID dokumentu přiřazené k ID vedou k upsertu.
  • Duplicitní ID a ID dokumentu nejsou nastaveny, což způsobí chybu po prvním dokumentu.

Pokud chcete uložit všechny dokumenty včetně dokumentů, které mají duplicitní ID, přejmenujte pole ID v dotazu (pomocí klíčového slova AS ). Umožňuje službě Azure Cosmos DB vytvořit pole ID nebo nahradit ID hodnotou jiného sloupce (pomocí klíčového slova AS nebo pomocí nastavení ID dokumentu).

Dělení dat ve službě Azure Cosmos DB

Azure Cosmos DB automaticky škáluje oddíly na základě vaší úlohy. Používejte neomezené kontejnery k rozdělení dat. Když Stream Analytics zapisuje do neomezených kontejnerů, používá tolik paralelních zapisovačů jako předchozí krok dotazu nebo schéma vstupního dělení.

Poznámka:

Azure Stream Analytics podporuje pouze neomezené kontejnery s partitioning keys na nejvyšší úrovni. Podporuje se například /region . Vnořené klíče oddílů (například /region/name) nejsou podporovány.

V závislosti na výběru klíče oddílu se může zobrazit toto upozornění:

CosmosDB Output contains multiple rows and just one row per partition key. If the output latency is higher than expected, consider choosing a partition key that contains at least several hundred records per partition key.

Vyberte vlastnost oddílového klíče, která má mnoho různých hodnot a rovnoměrně rozloží vaši pracovní zátěž mezi tyto hodnoty. Jako přirozený důsledek rozdělení limituje maximální propustnost jednoho oddílu požadavky, které zahrnují stejný klíč oddílu.

Velikost úložiště pro dokumenty, které patří do stejné hodnoty klíče oddílu, je omezená na 20 GB (limit velikosti fyzického oddílu je 50 GB). Ideální oddílový klíč je takový, který se často objevuje jako filtr ve vašich dotazech a má dostatečnou kardinálnost, aby zajistil, že vaše řešení bude škálovatelné.

Klíče oddílů používané pro dotazy Stream Analytics a Azure Cosmos DB nemusí být identické. Pro plně paralelní topologie použijte jako klíč oddílu dotazu Stream Analytics klíč vstupního oddíluPartitionId, ale tato volba nemusí být doporučovanou volbou jako klíč oddílu pro kontejner Azure Cosmos DB.

Klíč oddílu (partition key) je také hranicí pro transakce v uložených procedurách a triggerech pro službu Azure Cosmos DB. Vyberte klíč oddílu tak, aby dokumenty, které se vyskytují společně v transakcích, sdílely stejnou hodnotu klíče oddílu. Článek Dělení ve službě Azure Cosmos DB poskytuje více podrobností o výběru klíče oddílu.

U pevných kontejnerů Azure Cosmos DB Stream Analytics nenabízí možnost škálovat nahoru nebo ven po jejich plném naplnění. Mají horní limit 10 GB a propustnost 10 000 RU/s. Pokud chcete migrovat data z pevného kontejneru do neomezeného kontejneru (například do kontejneru s alespoň 1 000 RU/s a klíčem oddílu), použijte nástroj pro migraci dat nebo knihovnu zdroje změn.

Možnost zápisu do více pevných kontejnerů je zastaralá. Nepoužívej ho k rozšiřování své práce v Stream Analytics.

Vylepšená propustnost s úrovní kompatibility 1.2

Díky kompatibilitě úrovně 1.2 podporuje Stream Analytics nativní integraci pro hromadný zápis do Azure Cosmos DB. Díky této integraci Stream Analytics efektivně zapisuje do Azure Cosmos DB, přičemž maximalizuje propustnost a efektivně zpracovává požadavky na zpomalování.

Vylepšený mechanismus zápisu je k dispozici na nové úrovni kompatibility kvůli rozdílu v chování operace upsert. Při použití úrovní nižších než 1.2 spočívá chování operace upsert ve vložení nebo sloučení dokumentu. Při použití verze 1.2 se chování upsertu změní a dokument se vloží nebo nahradí.

Při použití úrovní starších než 1.2 používá Stream Analytics vlastní uloženou proceduru pro hromadné upsertování dokumentů pro každý klíč oddílu do Azure Cosmos DB. V takovém případě Stream Analytics zapisuje dávku jako transakci. I když jeden záznam narazí na přechodnou chybu (throttling), Stream Analytics musí zkusit celou dávku znovu. Toto chování způsobuje, že i scénáře s přiměřeným omezením rychlosti jsou pomalé.

Následující příklad ukazuje dva identické úlohy Stream Analytics, které se čtou ze stejného vstupu služby Azure Event Hubs. Obě úlohy Stream Analytics jsou zcela rozdělené s dotazem v režimu pass-through a zápisem do identických kontejnerů Azure Cosmos DB. Metriky vlevo pocházejí z úlohy nakonfigurované s úrovní kompatibility 1.0. Metriky vpravo pocházejí z úlohy nakonfigurované s hodnotou 1.2. Klíčem oddílu kontejneru služby Azure Cosmos DB je jedinečný identifikátor GUID, který pochází ze vstupní události.

Snímek obrazovky znázorňující porovnání metrik Stream Analytics

Rychlost příchozích událostí ve službě Event Hubs je dvakrát vyšší, než na jakou jsou kontejnery Azure Cosmos DB (20 000 RU) nakonfigurovány, takže můžete v Azure Cosmos DB očekávat omezování požadavků. Úloha ve verzi 1.2 ale konzistentně zapisuje s vyšší propustností (výstupní události za minutu) a s nižším průměrným využitím % SU. Ve vašem prostředí tento rozdíl závisí na několika dalších faktorech. Mezi tyto faktory patří volba formátu události, velikosti vstupní události nebo zprávy, klíčů oddílů a dotazu.

Snímek obrazovky znázorňující porovnání metrik služby Azure Cosmos DB

Díky použití verze 1.2 Stream Analytics inteligentněji využívá 100 procent dostupné propustnosti v Azure Cosmos DB, s minimálním počtem opětovných odesílání způsobených zpomalováním nebo omezením rychlosti. Toto chování poskytuje lepší prostředí pro jiné úlohy, jako jsou dotazy spuštěné v kontejneru najednou. Pokud chcete zjistit, jak Stream Analytics škáluje službu Azure Cosmos DB jako jímku pro 1 000 až 10 000 zpráv za sekundu, vyzkoušejte tento ukázkový projekt Azure.

Propustnost výstupu Azure Cosmos DB je identická při použití verzí 1.0 a 1.1. Důrazně doporučujeme používat úroveň kompatibility 1.2 ve službě Stream Analytics se službou Azure Cosmos DB.

Nastavení služby Azure Cosmos DB pro výstup JSON

Když nakonfigurujete Azure Cosmos DB jako výstup v Stream Analytics, následující vlastnosti definují výstup.

Snímek obrazovky znázorňující pole s informacemi pro výstupní datový proud Azure Cosmos DB

Pole Popis
Alias pro výstup Alias odkazující na tento výstup v dotazu Stream Analytics
Předplatné Předplatné Azure.
ID účtu Název nebo identifikátor URI koncového bodu účtu služby Azure Cosmos DB.
Klíč účtu Sdílený přístupový klíč pro účet služby Azure Cosmos DB.
Databáze Název databáze Azure Cosmos DB.
Název kontejneru Název kontejneru, například MyContainer. Musí existovat jeden kontejner s názvem MyContainer .
ID dokumentu Nepovinné. Název sloupce ve výstupních událostech slouží jako jedinečný klíč pro vkládání nebo aktualizaci. Pokud ji necháte prázdnou, Stream Analytics vloží všechny události bez možnosti aktualizace.

Jakmile nakonfigurujete výstup služby Azure Cosmos DB, můžete ho použít v dotazu jako cíl příkazu INTO. Když používáte výstup z Azure Cosmos DB tímto způsobem, musíte explicitně nastavit klíč oddílu.

Výstupní záznam musí obsahovat sloupec s rozlišováním velkých a malých písmen pojmenovaný podle klíče oddílu ve službě Azure Cosmos DB. Aby bylo možné dosáhnout větší paralelizace, může příkaz vyžadovat klauzuli PARTITION BY, která používá stejný sloupec.

Tady je ukázkový dotaz:

    SELECT TollBoothId, PartitionId
    INTO CosmosDBOutput
    FROM Input1 PARTITION BY PartitionId

Zpracování chyb a opakované pokusy

Pokud dojde k přechodnému selhání, nedostupnosti služby nebo omezování v době, kdy Stream Analytics odesílá události do služby Azure Cosmos DB, Stream Analytics se po neomezenou dobu pokusí operaci úspěšně dokončit. Ale nepokouší se o opakování při chybách Unauthorized (HTTP chybový kód 401), NotFound (HTTP chybový kód 404), Forbidden (HTTP chybový kód 403) nebo BadRequest (HTTP chybový kód 400).

Běžné problémy, které způsobují selhání výstupu Azure Cosmos DB

Několik podmínek může způsobit selhání výstupu Azure Cosmos DB. Výstupní data z Stream Analytics mohou porušovat jedinečné omezení indexu kontejneru, sloupec PartitionKey nemusí existovat, nebo sloupec Id nemusí existovat. Pro více informací o omezeních unikátních indexů viz Unikátní klíčová omezení v Azure Cosmos DB.