Sdílet prostřednictvím


Konektor Spark služby Azure Cosmos DB: Řízení propustnosti

PLATÍ PRO: NoSQL

Konektor Spark umožňuje komunikovat se službou Azure Cosmos DB pomocí Apache Sparku. Tento článek popisuje, jak funguje funkce řízení propustnosti. Projděte si naše ukázky Sparku na GitHubu , abyste mohli začít používat řízení propustnosti.

Tento článek popisuje použití globálních skupin řízení propustnosti v konektoru Spark služby Azure Cosmos DB, ale funkce jsou k dispozici také v sadě Java SDK. V sadě SDK můžete pomocí globálních a místních skupin řízení propustnosti omezit spotřebu jednotek žádostí (RU) v kontextu jedné instance připojení klienta. Tento přístup můžete například použít pro různé operace v rámci jedné mikroslužby nebo pro jeden program načítání dat. Další informace najdete v tématu použití řízení propustnosti v sadě Java SDK.

Upozorňující

Řízení propustnosti není podporováno v režimu brány. V současné době se pro bezserverové účty Azure Cosmos DB pokoušíte definovat targetThroughputThreshold procento selhání. Můžete zadat pouze absolutní hodnotu pro cílovou propustnost nebo RU pomocí spark.cosmos.throughputControl.targetThroughput.

Proč je řízení propustnosti důležité?

Řízení propustnosti pomáhá izolovat požadavky na výkon aplikací, které běží v kontejneru. Řízení propustnosti omezuje množství RU , které může konkrétní klient Sparku využívat.

Několik pokročilých scénářů přináší výhody řízení propustnosti na straně klienta:

  • Různé operace a úlohy mají různé priority: Může být potřeba zabránit omezování normálních transakcí kvůli aktivitám příjmu dat nebo kopírování. Některé operace nebo úlohy nejsou citlivé na latenci a jsou odolnější vůči omezování než jiné.
  • Zajištění nestrannosti/izolace různým uživatelům nebo tenantům: Aplikace má obvykle mnoho uživatelů. Někteří uživatelé můžou posílat příliš mnoho požadavků, které spotřebovávají veškerou dostupnou propustnost a způsobují omezování jiných uživatelů.
  • Vyrovnávání zatížení propustnosti mezi různými klienty Azure Cosmos DB: V některých případech použití je důležité zajistit, aby všichni klienti získali spravedlivé (rovné) podíl na propustnosti.

Řízení propustnosti umožňuje podle potřeby využívat možnost podrobnějšího omezování rychlosti RU.

Jak funguje řízení propustnosti?

Pokud chcete nakonfigurovat řízení propustnosti pro konektor Spark, nejprve vytvoříte kontejner, který definuje metadata řízení propustnosti. Klíč oddílu je groupId a ttl je povolený. Tady vytvoříte tento kontejner pomocí Spark SQL a zavoláte ho ThroughputControl:

    %sql
    CREATE TABLE IF NOT EXISTS cosmosCatalog.`database-v4`.ThroughputControl 
    USING cosmos.oltp
    OPTIONS(spark.cosmos.database = 'database-v4')
    TBLPROPERTIES(partitionKeyPath = '/groupId', autoScaleMaxThroughput = '4000', indexingPolicy = 'AllProperties', defaultTtlInSeconds = '-1');

Předchozí příklad vytvoří kontejner s automatickým škálováním. Pokud dáváte přednost standardnímu zřizování, můžete ho nahradit autoScaleMaxThroughput .manualThroughput

Důležité

Klíč oddílu musí být definován jako /groupId a ttl musí být povolený, aby funkce řízení propustnosti fungovala.

V rámci konfigurace Sparku konkrétní aplikace pak můžete zadat parametry pro danou úlohu. Následující příklad nastaví řízení propustnosti jako enabled. Příklad definuje parametr skupiny name řízení propustnosti a targetThroughputThreshold parametr. Definujete také database parametry, container ve kterých je skupina řízení propustnosti zachována:

    "spark.cosmos.throughputControl.enabled" -> "true",
    "spark.cosmos.throughputControl.name" -> "SourceContainerThroughputControl",
    "spark.cosmos.throughputControl.targetThroughputThreshold" -> "0.95", 
    "spark.cosmos.throughputControl.globalControl.database" -> "database-v4", 
    "spark.cosmos.throughputControl.globalControl.container" -> "ThroughputControl"

V předchozím příkladu targetThroughputThreshold je parametr definován jako 0,95. K omezování rychlosti dochází (a žádosti se opakují), když klienti spotřebovávají více než 95 procent (+/- 5–10 procent) propustnosti přidělené kontejneru. Tato konfigurace je uložená jako dokument v kontejneru propustnosti, který vypadá jako v tomto příkladu:

    {
        "id": "ZGF0YWJhc2UtdjQvY3VzdG9tZXIvU291cmNlQ29udGFpbmVyVGhyb3VnaHB1dENvbnRyb2w.info",
        "groupId": "database-v4/customer/SourceContainerThroughputControl.config",
        "targetThroughput": "",
        "targetThroughputThreshold": "0.95",
        "isDefault": true,
        "_rid": "EHcYAPolTiABAAAAAAAAAA==",
        "_self": "dbs/EHcYAA==/colls/EHcYAPolTiA=/docs/EHcYAPolTiABAAAAAAAAAA==/",
        "_etag": "\"2101ea83-0000-1100-0000-627503dd0000\"",
        "_attachments": "attachments/",
        "_ts": 1651835869
    }

Řízení propustnosti neprovádí předpočítání RU každé operace. Místo toho sleduje využití RU po operaci na základě hlavičky odpovědi. Řízení propustnosti je založené na aproximaci a nezaručuje , že je pro skupinu v určitém okamžiku k dispozici množství propustnosti.

Z tohoto důvodu platí, že pokud je nakonfigurovaná RU tak nízká, aby ji jedna operace mohl používat všechny, řízení propustnosti se nemůže vyhnout ru překračujícím nakonfigurovaný limit. Řízení propustnosti funguje nejlépe, když je nakonfigurovaný limit vyšší než jakákoli jedna operace, kterou může spustit klient v konkrétní skupině ovládacích prvků.

Při čtení prostřednictvím dotazu nebo kanálu změn byste měli nakonfigurovat velikost spark.cosmos.read.maxItemCount stránky (ve výchozím nastavení 1000), aby byla skromná. Tímto způsobem je možné přepočítat řízení propustnosti klienta s vyšší frekvencí a odrážet přesněji v každém konkrétním okamžiku. Pokud používáte řízení propustnosti pro úlohu zápisu hromadně, počet dokumentů spuštěných v jednom požadavku se automaticky naladí na základě míry omezování, aby bylo možné co nejdříve začít řídit propustnost.

Upozorňující

Parametr targetThroughputThreshold je neměnný. Pokud změníte prahovou hodnotu cílové propustnosti, vytvoří se nová skupina řízení propustnosti. (Pokud používáte verzi 4.10.0 nebo novější, může mít stejný název.) Pokud chcete zajistit, aby všechny úlohy Sparku okamžitě spotřebovávali novou prahovou hodnotu, musíte restartovat všechny úlohy Sparku, které tuto skupinu používají. V opačném případě si po příštím restartování vyberou novou prahovou hodnotu.

Pro každého klienta Sparku, který používá skupinu řízení propustnosti, se v kontejneru ThroughputControl vytvoří záznam s ttl několika sekundami. V důsledku toho dokumenty rychle zmizí, pokud už klient Sparku aktivně neběží. Tady je příklad:

    {
        "id": "Zhjdieidjojdook3osk3okso3ksp3ospojsp92939j3299p3oj93pjp93jsps939pkp9ks39kp9339skp",
        "groupId": "database-v4/customer/SourceContainerThroughputControl.config",
        "_etag": "\"1782728-w98999w-ww9998w9-99990000\"",
        "ttl": 10,
        "initializeTime": "2022-06-26T02:24:40.054Z",
        "loadFactor": 0.97636377638898,
        "allocatedThroughput": 484.89444487847,
        "_rid": "EHcYAPolTiABAAAAAAAAAA==",
        "_self": "dbs/EHcYAA==/colls/EHcYAPolTiA=/docs/EHcYAPolTiABAAAAAAAAAA==/",
        "_etag": "\"2101ea83-0000-1100-0000-627503dd0000\"",
        "_attachments": "attachments/",
        "_ts": 1651835869
    }

V každém záznamu loadFactor klienta představuje atribut zatížení konkrétního klienta vzhledem k ostatním klientům ve skupině řízení propustnosti. Atribut allocatedThroughput ukazuje, kolik RU je aktuálně přiděleno tomuto klientovi. Konektor Spark upraví přidělenou propustnost pro každého klienta na základě zatížení. Každý klient tak získá sdílenou část dostupné propustnosti, která je úměrná zatížení. Všichni klienti společně spotřebovávají více než celkový počet přidělený skupině řízení propustnosti, do které patří.