Azure Stream Analytics kimenet az Azure Cosmos DB-hez

Azure Cosmos DB output az Azure Stream Analytics-ben a stream processing eredményeket JSON dokumentumként írja egy Azure Cosmos DB konténerbe. Támogatja az adatarchiválást és alacsony késleltetésű lekérdezéseket strukturálatlan JSON adatokon. Annak megértése, hogyan viselkedik ez a kimenet, segít úgy konfigurálni, hogy biztosítsa az adott forgatókönyv által megkövetelt áteresztőképességet, konzisztenciát és particionálást.

Az Azure Cosmos DB kimeneti célként való használatának alapjai

Az Azure Cosmos DB kimenete a Stream Analytics-ben JSON kimenetként írja le a stream feldolgozási eredményeit az Azure Cosmos DB konténereibe. Ha nem ismeri az Azure Cosmos DB-t, első lépésként tekintse meg az Azure Cosmos DB dokumentációját .

A Stream Analytics csak az SQL API-n keresztül csatlakozik az Azure Cosmos DB-hez. Más Azure Cosmos DB API-k még nem támogatottak. Ha a Stream Analyticset más API-kkal létrehozott Azure Cosmos DB-fiókokra mutatja, előfordulhat, hogy az adatok nem lesznek megfelelően tárolva. Amikor Azure Cosmos DB-t használsz kimenetként, állítsd be a feladatodat 1.2-es kompatibilitási szintre.

A Stream Analytics nem hoz létre tárolókat az adatbázisban. Ehelyett előbb létre kell hoznia őket. Ezután szabályozhatja az Azure Cosmos DB-tárolók számlázási költségeit. A tárolók teljesítményét, konzisztenciáját és kapacitását közvetlenül is hangolhatja az Azure Cosmos DB API-k használatával. Az alábbi szakaszok részletesen ismertetik az Azure Cosmos DB tárolóbeállításait.

Konzisztencia, rendelkezésre állás és késés finomhangolása

Az alkalmazás követelményeinek megfelelése érdekében finomhangolja az adatbázist és a konténereket az Azure Cosmos DB-ben, és kompromisszumot köt konzisztencia, elérhetőség, késleltetés és áteresztés között.

Attól függően, milyen olvasási konzisztenciát igényel a forgatókönyved olvasási és írási késleltetés ellen, válassz egy konzisztens szintet az adatbázis fiókodban. Az áteresztőképesség javítása érdekében skálázd fel a konténeren a Request Units (RU) számát. Az Azure Cosmos DB alapértelmezés szerint lehetővé teszi az egyes CRUD-műveletek szinkron indexelését a tárolóhoz. Ez az opció egy másik hasznos módja az olvasási és írási teljesítmény szabályozásának az Azure Cosmos DB-ben. További információkért tekintse át az adatbázis és a lekérdezés konzisztenciaszintjeinek módosítása című cikket.

Upserts a Stream Analyticsből

Az Azure Cosmos DB-vel való Stream Analytics integrációval a konténerbe beilleszthető vagy frissíthető rekordokat egy adott Document ID oszlop alapján. Ezt a műveletet upsert-nek is nevezik. A Stream Analytics optimista upsert megközelítést használ. A frissítések csak akkor történnek meg, ha egy beszúrás dokumentumazonosító-ütközéssel meghiúsul.

A kompatibilitási szint 1.0 használatával a Stream Analytics PATCH műveletként végzi el ezt a frissítést, így támogatja a dokumentum részleges frissítéseit. A Stream Analytics új tulajdonságokat ad hozzá, vagy növekményesen lecserél egy meglévő tulajdonságot. A JSON-dokumentumban a tömbtulajdonságok értékeinek módosítása azonban a teljes tömb felülírását eredményezi. Vagyis a tömb nincs egyesítve.

A kompatibilitási szint 1.2-es használatával az upsert viselkedése változik, hogy beillesztse vagy helyettesítse a dokumentumot. Ezt a viselkedést az 1.2-es kompatibilitási szintről szóló későbbi szakasz ismerteti.

Ha a bejövő JSON dokumentumnak van egy meglévő azonosító mezője, az Azure Cosmos DB automatikusan ezt a mezőt használja Dokumentumazonosító oszlopként. A Stream Analytics minden későbbi írást így kezel, ami az egyik ilyen helyzethez vezet:

  • Az egyedi azonosítók a beillesztéshez vezetnek.
  • Duplikált azonosítók és a dokumentumazonosító az ID-re van állítva, ami upserthez vezet.
  • A duplikált azonosítók és a dokumentumazonosító nem vezet hibához az első dokumentum után.

Ha menteni szeretné az összes dokumentumot, beleértve azokat is, amelyek duplikált azonosítóval rendelkeznek, nevezze át a lekérdezés azonosító mezőjét (az AS kulcsszó használatával). Hagyja, hogy az Azure Cosmos DB létrehozza az AZONOSÍTÓ mezőt, vagy cserélje le az azonosítót egy másik oszlop értékére (az AS kulcsszó vagy a Dokumentumazonosító beállítás használatával).

Adatparticionálás az Azure Cosmos DB-ben

Az Azure Cosmos DB automatikusan skálázza a partíciókat a számítási feladat alapján. Használj korlátlan konténereket az adatok partíciójához. Amikor a Stream Analytics korlátlan tárolókba ír, annyi párhuzamos írót használ, mint az előző lekérdezési lépés vagy bemeneti particionálási séma.

Feljegyzés

Az Azure Stream Analytics csak a legfelső szintű partíciókulcsokkal rendelkező korlátlan tárolókat támogatja. Például /region támogatott. A beágyazott partíciós kulcsok (például, /region/name) nem támogatottak.

A partíciókulcs kiválasztásától függően a következő figyelmeztetés jelenhet meg:

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.

Válassz egy olyan partíciós kulcstulajdonságot, amelynek sok különböző értéke van, és a munkaterhelést egyenletesen oszlatja el ezekre az értékekre. A partíció természetes artefaktumaként egyetlen partíció maximális áteresztőképessége korlátozza azokat a kéréseket, amelyek ugyanazt a partíciós kulcsot érintik.

Az azonos partíciókulcs-értékhez tartozó dokumentumok tárolási mérete 20 GB-ra korlátozódik (a fizikai partícióméret korlátja 50 GB). Az ideális partíciós kulcs olyan, amely gyakran megjelenik szűrőként a lekérdezéseidben, és elég kardinalitással rendelkezik ahhoz, hogy a megoldásod skálázható legyen.

A Stream Analytics-lekérdezésekhez használt partíciókulcsoknak és az Azure Cosmos DB-nek nem kell azonosnak lenniük. Teljesen párhuzamos topológiák esetén használjuk az Input Partition kulcsotPartitionId, , mint a Stream Analytics lekérdezés partíciókulcsát, de ez a választás nem feltétlenül a Azure Cosmos DB konténer partíciókulcsához ajánlott.

A partíciókulcs az Azure Cosmos DB tárolt eljárásaiban és eseményindítóiban lévő tranzakciók határa is. Válaszd ki a partíciókulcsot, hogy a tranzakciókban együtt megjelenő dokumentumok ugyanazt a partíciókulcs értéket osztják meg. A particionálás az Azure Cosmos DB-ben című cikk további részleteket tartalmaz a partíciókulcs kiválasztásáról.

A fix Azure Cosmos DB konténerek esetén a Stream Analytics nem kínál lehetőséget a skáládozásra vagy kibővítésre, miután azok megteltek. Ezek felső korlátja 10 GB és 10 000 RU/s átviteli sebesség. Ha egy rögzített tárolóból korlátlan tárolóba szeretné migrálni az adatokat (például egy legalább 1000 RU/s-val és egy partíciókulcsmal rendelkezőt), használja az adatmigrálási eszközt vagy a változáscsatorna-kódtárat.

A több rögzített tárolóba való írás lehetősége elavult. Ne használd a Stream Analytics feladatod kiskálására.

Továbbfejlesztett átviteli sebesség az 1.2-es kompatibilitási szinttel

A kompatibilitási szint 1.2-es használatával a Stream Analytics támogatja a natív integrációt az Azure Cosmos DB-be történő tömeges íráshoz. Ezzel az integrációval a Stream Analytics hatékonyan ír az Azure Cosmos DB-be, miközben maximalizálja az áteresztőképességet és hatékonyan kezeli a korlátozó kéréseket.

A továbbfejlesztett írási mechanizmus új kompatibilitási szinten érhető el, mivel a upsert viselkedése eltér. Ha a 1.2 előtti szinteket használjuk, az upsert viselkedése az, hogy beillesztjük vagy egyesítjük a dokumentumot. Az 1.2 használatával az upsert működése úgy változik, hogy beszúrja vagy lecseréli a dokumentumot.

Az 1.2 előtti szintek használatakor a Stream Analytics egyéni tárolt eljárást használ a dokumentumok partíciókulcsonkénti tömeges upsertjéhez az Azure Cosmos DB-ben. Ott a Stream Analytics egy köteget tranzakcióként írja. Még akkor is, ha egyetlen rekord átmeneti hibába ütközik (szabályozás miatt), a Stream Analyticsnek újra kell próbálnia a teljes köteget. Ez a viselkedés lelassítja a helyzeteket még az ésszerű throttling-rel is.

Az alábbi példa két azonos Stream Analytics-feladatot mutat be, amely ugyanabból az Azure Event Hubs-bemenetből olvas be. Mindkét Stream Analytics-feladat teljes mértékben particionált egy átmenő lekérdezéssel, és azonos Azure Cosmos DB-tárolókba írható. A bal oldali metrikák az 1.0 kompatibilitási szinttel konfigurált feladatból származnak. A jobb oldali mutatók a 1.2-es verzióval konfigurált munkából származnak. Az Azure Cosmos DB-tároló partíciókulcsa egy egyedi GUID, amely a bemeneti eseményből származik.

Képernyőkép a Stream Analytics-metrikák összehasonlításáról.

Az Event Hubsba bejövő események sebessége kétszer akkora, mint amennyit az Azure Cosmos DB-tárolók (20 000 RU) fogadására konfigurálva vannak, ezért az Azure Cosmos DB-ben fojtásra lehet számítani. Az 1.2-vel rendelkező feladat azonban folyamatosan magasabb átviteli rátával (percenkénti kimeneti események) és alacsonyabb átlagos SU%-kihasználtsággal működik. A te környezetedben ez a különbség még néhány tényezőtől függ. Ezek a tényezők közé tartozik az eseményformátum kiválasztása, a bemeneti esemény/üzenet mérete, a partíciókulcsok és a lekérdezés.

Képernyőkép az Azure Cosmos DB-metrikák összehasonlításáról.

Az 1.2 használatával a Stream Analytics intelligensebben használja az Azure Cosmos DB elérhető áteresztőképességének 100 százalékát, kevés újraküldéssel a korlátozás vagy a sebességkorlátozás miatt. Ez a viselkedés jobb élményt nyújt más számítási feladatok, például a tárolón egyszerre futó lekérdezések számára. Ha látni szeretné, hogy a Stream Analytics hogyan méretezhető fel fogadóként az Azure Cosmos DB-vel másodpercenként 1000-10 000 üzenethez, próbálja ki ezt az Azure-mintaprojektet.

Az Azure Cosmos DB kimenetének áteresztőképessége azonos, ha az 1.0 és 1.1 verziókat használjuk. Határozottan javasoljuk , hogy az 1.2-es kompatibilitási szintet használja a Stream Analyticsben az Azure Cosmos DB-vel.

Azure Cosmos DB-beállítások JSON-kimenethez

Amikor az Azure Cosmos DB-t kimenetként konfigurálod a Stream Analytics-ben, a következő tulajdonságok határozzák meg a kimenetet.

Képernyőkép egy Azure Cosmos DB kimeneti stream információs mezőiről.

Mező Leírás
Kimeneti alias Egy alias, amely erre a kimenetre hivatkozik a Stream Analytics-lekérdezésben.
Előfizetés Az Azure-előfizetés.
Számlaazonosító Az Azure Cosmos DB-fiók neve vagy végpont URI-ja.
Fiókkulcs Az Azure Cosmos DB-fiók megosztott hozzáférési kulcsa.
Adatbázis Az Azure Cosmos DB-adatbázis neve.
Konténer név A tároló neve, például MyContainer. Egy névvel ellátott MyContainer tárolónak léteznie kell.
Dokumentumazonosító Opcionális. Az oszlopnév a kimeneti eseményekben, amely egyedi kulcsként szolgál a beillesztési vagy frissítési műveletekhez. Ha üresen hagyod, a Stream Analytics minden eseményt beilleszt frissítés nélkül.

Miután konfigurálta az Azure Cosmos DB-kimenetet, használhatja azt a lekérdezésben egy INTO utasítás céljaként. Amikor Azure Cosmos DB kimenetet használsz így, kifejezetten be kell állítanod a partíciós kulcsot.

A kimeneti rekordnak tartalmaznia kell egy kis- és nagybetűket megkülönböztető oszlopot, amelyet az Azure Cosmos DB partíciókulcsa után neveztek el. A nagyobb párhuzamosság érdekében az utasításhoz szükség lehet egy PARTÍCIÓ BY záradékra , amely ugyanazt az oszlopot használja.

Íme egy minta lekérdezés:

    SELECT TollBoothId, PartitionId
    INTO CosmosDBOutput
    FROM Input1 PARTITION BY PartitionId

Hibakezelés és újrapróbálkozások

Ha átmeneti hiba, szolgáltatáskimaradás vagy korlátozás történik, miközben a Stream Analytics eseményeket küld az Azure Cosmos DB-be, a Stream Analytics korlátlan ideig újrapróbálkozik a művelet sikeres befejezése érdekében. De nem próbálkozik újra a Jogosulatlan (HTTP-hibakód: 401), Nem található (HTTP-hibakód: 404), Tiltott (HTTP-hibakód: 403) vagy Hibás kérés (HTTP-hibakód: 400) hibákra.

Gyakori problémák, amelyek miatt az Azure Cosmos DB kimenete meghibásodik

Számos feltétel okozhatja az Azure Cosmos DB kimenetének meghibásodását. A Stream Analytics kimeneti adatai megsérthetik a konténer egyedi indexkorlátozását, az PartitionKey oszlop nem létezhet, vagy az Id oszlop nem is létezik. Az egyedi indexkorlátozásokról további információért lásd: Egyedi kulcskorlátok az Azure Cosmos DB-ben.