Azure Cosmos DB Spark-connector: Doorvoerbeheer
VAN TOEPASSING OP: NoSQL
Met de Spark-connector 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.
In dit artikel wordt het gebruik van globale doorvoerbeheergroepen in de Azure Cosmos DB Spark-connector beschreven, maar de functionaliteit is ook beschikbaar in de Java SDK. In de SDK kunt u globale en lokale doorvoerbeheergroepen gebruiken om het verbruik van de aanvraageenheid (RU) te beperken in de context van één clientverbindingsexemplaren. U kunt deze benadering bijvoorbeeld toepassen op verschillende bewerkingen binnen één microservice of misschien op één programma voor het laden van gegevens. Zie voor meer informatie hoe u doorvoerbeheer gebruikt in de Java SDK.
Waarschuwing
Doorvoerbeheer wordt niet ondersteund voor de gatewaymodus. Op dit moment wordt voor serverloze Azure Cosmos DB-accounts geprobeerd een percentage te targetThroughputThreshold
definiëren dat mislukt. U kunt alleen een absolute waarde opgeven voor doeldoorvoer/RU met behulp van spark.cosmos.throughputControl.targetThroughput
.
Waarom is doorvoerbeheer belangrijk?
Met doorvoerbeheer kunt u de prestatiebehoeften isoleren van toepassingen die worden uitgevoerd op een container. De doorvoerregeling beperkt de hoeveelheid RU's die een specifieke Spark-client kan gebruiken.
Verschillende geavanceerde scenario's 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 of taken zijn niet gevoelig voor latentie en zijn toleranter om te worden beperkt dan andere.
- Redelijkheid/isolatie bieden aan verschillende gebruikers of tenants: een toepassing heeft meestal veel gebruikers. Sommige gebruikers verzenden mogelijk te veel aanvragen, die alle beschikbare doorvoer verbruiken en ertoe leiden dat anderen worden beperkt.
- Taakverdeling van doorvoer tussen verschillende Azure Cosmos DB-clients: In sommige gevallen is het belangrijk om ervoor te zorgen dat alle clients een eerlijk (gelijk) deel van de doorvoer krijgen.
Met doorvoerbeheer kunt u, indien nodig, meer gedetailleerde RU-frequentielimieten instellen.
Hoe werkt doorvoerbeheer?
Als u het doorvoerbeheer voor de Spark-connector wilt configureren, maakt u eerst een container die metagegevens voor doorvoerbeheer definieert. De partitiesleutel is groupId
en ttl
is ingeschakeld. Hier maakt u deze container met behulp van Spark SQL en roept u 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');
In het voorgaande voorbeeld wordt een container met automatische schaalaanpassing gemaakt. Als u de voorkeur geeft aan standaardinrichting, kunt u vervangen door autoScaleMaxThroughput
manualThroughput
.
Belangrijk
De partitiesleutel moet worden gedefinieerd als /groupId
en ttl
moet zijn ingeschakeld om de functie voor doorvoerbeheer te laten werken.
Binnen de Spark-configuratie van een specifieke toepassing kunt u vervolgens parameters voor de workload opgeven. In het volgende voorbeeld wordt het doorvoerbeheer ingesteld als enabled
. In het voorbeeld wordt een parameter voor de doorvoerbeheergroep name
en een targetThroughputThreshold
parameter gedefinieerd. U definieert ook de database
en container
parameters waarin de doorvoerbeheergroep 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 voorgaande voorbeeld wordt de targetThroughputThreshold
parameter gedefinieerd als 0,95. Snelheidsbeperking treedt op (en aanvragen worden opnieuw geprobeerd) wanneer clients meer dan 95 procent (+/- 5-10 procent) van de doorvoer gebruiken die aan de container is 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
}
Doorvoerbeheer voert geen RU-voorberekening van elke bewerking uit. 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 een bepaald moment beschikbaar is voor de groep.
Als de geconfigureerde RU daarom zo laag is dat één bewerking dit allemaal kan gebruiken, kan doorvoerbeheer niet voorkomen dat de RU de geconfigureerde limiet overschrijdt. Doorvoerbeheer werkt het beste wanneer de geconfigureerde limiet hoger is dan elke bewerking die een client in de specifieke besturingsgroep kan uitvoeren.
Wanneer u leest via query of wijzigingenfeed, moet u het paginaformaat configureren in spark.cosmos.read.maxItemCount
(standaard 1000) als een bescheiden bedrag. Op deze manier kan de doorvoerregeling van de client met een hogere frequentie opnieuw worden berekend en op elk gewenst moment nauwkeuriger worden weergegeven. Wanneer u 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 beginnen.
Waarschuwing
De targetThroughputThreshold
parameter is onveranderbaar. Als u de drempelwaarde voor doeldoorvoer wijzigt, wordt er een nieuwe doorvoerbeheergroep gemaakt. (Als u versie 4.10.0 of hoger gebruikt, kan deze dezelfde naam hebben.) U moet alle Spark-taken die gebruikmaken van de groep opnieuw starten als u ervoor wilt zorgen dat ze allemaal de nieuwe drempelwaarde onmiddellijk gebruiken. Anders halen ze de nieuwe drempelwaarde op na de volgende herstart.
Voor elke Spark-client die gebruikmaakt van de doorvoerbeheergroep, wordt er met een ttl
paar seconden een record gemaakt in de ThroughputControl
container. Als gevolg hiervan verdwijnen de documenten snel als een Spark-client niet meer actief wordt uitgevoerd. Hier volgt een voorbeeld:
{
"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 specifieke 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-connector past de toegewezen doorvoer voor elke client aan op basis van de belasting. Op deze manier krijgt elke client een share van de beschikbare doorvoer die evenredig is met de belasting. Alle clients verbruiken niet meer dan het totaal dat is toegewezen voor de doorvoerbeheergroep waartoe ze behoren.
Gerelateerde inhoud
- Zie Spark-voorbeelden in GitHub.
- Meer informatie over het beheren van gegevens met azure Cosmos DB Spark 3 OLTP-connector voor API voor NoSQL.
- Meer informatie over Apache Spark.