Azure Cosmos DB Spark Verbinding maken or : doorvoerbeheer

VAN TOEPASSING OP: NoSQL

Met de Spark-Verbinding maken or kunt u communiceren met Azure Cosmos DB met behulp van Apache Spark. In dit artikel wordt beschreven hoe de functie voor doorvoerbeheer werkt. Bekijk onze Spark-voorbeelden in GitHub om aan de slag te gaan met doorvoerbeheer.

Tip

In dit artikel wordt het gebruik van globale doorvoerbeheergroepen in de Azure Cosmos DB Spark-Verbinding maken or beschreven, maar de functionaliteit is ook beschikbaar in de Java SDK. In de SDK kunt u ook zowel globale als lokale doorvoerbeheergroepen gebruiken om het RU-verbruik te beperken in de context van één clientverbindingsexemplaren. U kunt dit bijvoorbeeld toepassen op verschillende bewerkingen binnen één microservice, of misschien op één programma voor het laden van gegevens. Raadpleeg de documentatie over het gebruik van doorvoerbeheer in de Java SDK.

Waarschuwing

Houd er rekening mee dat doorvoerbeheer nog niet wordt ondersteund voor de gatewaymodus. Op dit moment leidt een poging om een percentage te definiëren targetThroughputThreshold voor serverloze Azure Cosmos DB-accounts een fout. U kunt alleen een absolute waarde opgeven voor doeldoorvoer/RU met behulp van spark.cosmos.throughputControl.targetThroughput.

Waarom is doorvoerbeheer belangrijk?

Als u doorvoerbeheer hebt, kunt u de prestatiebehoeften van toepassingen die worden uitgevoerd op een container isoleren door de hoeveelheid aanvraageenheden te beperken die door een bepaalde Spark-client kunnen worden gebruikt.

Er zijn verschillende geavanceerde scenario's die profiteren van doorvoerbeheer aan de clientzijde:

  • Verschillende bewerkingen en taken hebben verschillende prioriteiten : het kan nodig zijn om te voorkomen dat normale transacties worden beperkt vanwege gegevensopname- of kopieeractiviteiten. Sommige bewerkingen en/of taken zijn niet gevoelig voor latentie en zijn toleranter om te worden beperkt dan andere.

  • Redelijkheid/isolatie bieden aan verschillende eindgebruikers/tenants : een toepassing heeft meestal veel eindgebruikers. Sommige gebruikers verzenden mogelijk te veel aanvragen, die alle beschikbare doorvoer verbruiken, waardoor anderen worden beperkt.

  • Taakverdeling van doorvoer tussen verschillende Azure Cosmos DB-clients : in sommige gebruiksscenario's is het belangrijk om ervoor te zorgen dat alle clients een eerlijk (gelijk) deel van de doorvoer krijgen

Met doorvoerbeheer kunt u naar behoefte meer gedetailleerde RU-frequentielimieten instellen.

Hoe werkt doorvoerbeheer?

Doorvoerbeheer voor de Spark-Verbinding maken or wordt geconfigureerd door eerst een container te maken waarmee metagegevens van doorvoerbeheer worden gedefinieerd, met een partitiesleutel van groupIden ttl ingeschakeld. Hier maken we deze container met behulp van Spark SQL en roepen we deze aan 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');

Notitie

In het bovenstaande voorbeeld wordt een container met automatische schaalaanpassing gemaakt. Als u de voorkeur geeft aan standaardinrichting, kunt u in plaats daarvan vervangen door autoScaleMaxThroughputmanualThroughput .

Belangrijk

De partitiesleutel moet worden gedefinieerd als /groupId, en ttl moet worden ingeschakeld, zodat de functie voor doorvoerbeheer werkt.

In de Spark-configuratie van een bepaalde toepassing kunnen we vervolgens parameters voor onze workload opgeven. In het onderstaande voorbeeld wordt het doorvoerbeheer ingesteld, enabledevenals het definiëren van een doorvoerbeheergroep name en een targetThroughputThreshold. We definiëren ook de database en container waarin via controlegroep wordt onderhouden:

    "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"

In het bovenstaande voorbeeld wordt de targetThroughputThreshold definitie gedefinieerd als 0,95, zodat snelheidsbeperking plaatsvindt (en aanvragen opnieuw worden geprobeerd) wanneer clients meer dan 95% (+/- 5-10 procent) verbruiken van de doorvoer die aan de container wordt toegewezen. Deze configuratie wordt opgeslagen als een document in de doorvoercontainer die er als volgt uitziet:

    {
        "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
    }

Notitie

Doorvoerbeheer voert geen RU-berekening vooraf uit van elke bewerking. In plaats daarvan worden de RU-gebruiken na de bewerking bijgehouden op basis van de antwoordheader. Als zodanig is doorvoerbeheer gebaseerd op een benadering en garandeert niet dat de hoeveelheid doorvoer op elk gewenst moment beschikbaar is voor de groep. Dit betekent dat als de geconfigureerde RU zo laag is dat één bewerking dit allemaal kan gebruiken, kan doorvoerbeheer niet voorkomen dat de RU de geconfigureerde limiet overschrijdt. Daarom werkt doorvoerbeheer het beste wanneer de geconfigureerde limiet hoger is dan elke bewerking die kan worden uitgevoerd door een client in de opgegeven besturingsgroep. Met dat in gedachten moet u bij het lezen via query of wijzigingsfeed het paginaformaat in spark.cosmos.read.maxItemCount (standaard 1000) zo configureren dat dit een bescheiden bedrag is, zodat de doorvoerregeling van de client met een hogere frequentie opnieuw kan worden berekend en daarom op elk gewenst moment nauwkeuriger wordt weergegeven. Wanneer u echter doorvoerbeheer gebruikt voor een schrijftaak met behulp van bulksgewijs, wordt het aantal documenten dat in één aanvraag wordt uitgevoerd, automatisch afgestemd op basis van de bandbreedtebeperkingssnelheid, zodat het doorvoerbeheer zo vroeg mogelijk kan worden geactiveerd.

Waarschuwing

Het targetThroughputThreshold is onveranderbaar. Als u de drempelwaarde voor de doeldoorvoer wijzigt, wordt er een nieuwe doorvoerbeheergroep gemaakt (maar zolang u versie 4.10.0 of hoger gebruikt, kan deze dezelfde naam hebben). U moet alle Spark-taken die gebruikmaken van de groep opnieuw opstarten als u ervoor wilt zorgen dat ze allemaal onmiddellijk de nieuwe drempelwaarde gebruiken (anders worden de nieuwe drempelwaarde na de volgende keer opnieuw opgestart) opgehaald.

Voor elke Spark-client die gebruikmaakt van de doorvoerbeheergroep, wordt er een record gemaakt in de ThroughputControl container, met een ttl van een paar seconden, zodat de documenten vrij snel verdwijnen als een Spark-client niet meer actief wordt uitgevoerd. Dit ziet er als volgt uit:

    {
        "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
    }

In elke clientrecord vertegenwoordigt het loadFactor kenmerk de belasting van de opgegeven client ten opzichte van andere clients in de doorvoerbeheergroep. Het allocatedThroughput kenmerk laat zien hoeveel RU's momenteel aan deze client zijn toegewezen. De Spark Verbinding maken or past de toegewezen doorvoer voor elke client aan op basis van de belasting. Dit zorgt ervoor dat elke client een share krijgt van de beschikbare doorvoer die evenredig is met de belasting en dat alle clients samen niet meer verbruiken dan het totaal dat is toegewezen voor de doorvoerbeheergroep waartoe ze behoren.

Volgende stappen