Udostępnij za pośrednictwem


Łącznik platformy Spark usługi Azure Cosmos DB: Kontrola przepływności

DOTYCZY: NoSQL

Łącznik Spark umożliwia komunikowanie się z usługą Azure Cosmos DB przy użyciu platformy Apache Spark. W tym artykule opisano sposób działania funkcji sterowania przepływnością. Zapoznaj się z naszymi przykładami platformy Spark w usłudze GitHub , aby rozpocząć korzystanie z kontroli przepływności.

W tym artykule opisano użycie globalnych grup kontroli przepływności w łączniku platformy Spark usługi Azure Cosmos DB, ale funkcjonalność jest również dostępna w zestawie SDK języka Java. W zestawie SDK można użyć globalnych i lokalnych grup kontroli przepływności, aby ograniczyć użycie jednostek żądania (RU) w kontekście pojedynczego wystąpienia połączenia klienta. Można na przykład zastosować to podejście do różnych operacji w ramach jednej mikrousługi, a może do jednego programu ładowania danych. Aby uzyskać więcej informacji, zobacz, jak używać kontrolki przepływności w zestawie SDK języka Java.

Ostrzeżenie

Kontrola przepływności nie jest obsługiwana w trybie bramy. Obecnie w przypadku bezserwerowych kont usługi Azure Cosmos DB próba użycia targetThroughputThreshold w celu zdefiniowania wartości procentowej powoduje niepowodzenie. Wartość bezwzględną dla docelowej przepływności/jednostek RU można podać tylko za pomocą polecenia spark.cosmos.throughputControl.targetThroughput.

Dlaczego kontrola przepływności jest ważna?

Kontrola przepływności pomaga wyizolować wymagania dotyczące wydajności aplikacji uruchamianych względem kontenera. Kontrola przepływności ogranicza ilość jednostek RU używanych przez określonego klienta platformy Spark.

Kilka zaawansowanych scenariuszy korzysta z kontroli przepływności po stronie klienta:

  • Różne operacje i zadania mają różne priorytety: może być konieczne zapobieganie ograniczaniu normalnych transakcji z powodu pozyskiwania danych lub działań kopiowania. Niektóre operacje lub zadania nie są wrażliwe na opóźnienia i są bardziej odporne na ograniczanie przepustowości niż inne.
  • Zapewnianie sprawiedliwości/izolacji dla różnych użytkowników lub dzierżaw: aplikacja zwykle ma wielu użytkowników. Niektórzy użytkownicy mogą wysyłać zbyt wiele żądań, które zużywają całą dostępną przepływność i powodują, że inne mogą zostać ograniczone.
  • Równoważenie obciążenia przepływności między różnymi klientami usługi Azure Cosmos DB: w niektórych przypadkach użycia ważne jest upewnienie się, że wszyscy klienci uzyskują sprawiedliwy (równy) udział przepływności.

Kontrola przepływności umożliwia bardziej szczegółowe ograniczanie szybkości jednostek ŻĄDANIA zgodnie z potrzebami.

Jak działa kontrola przepływności?

Aby skonfigurować kontrolę przepływności dla łącznika spark, należy najpierw utworzyć kontener definiujący metadane kontroli przepływności. Klucz partycji jest groupId włączony ttl . W tym miejscu utworzysz ten kontener przy użyciu usługi Spark SQL i wywołasz go 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');

Powyższy przykład tworzy kontener z autoskalowaniem. Jeśli wolisz standardową aprowizację, możesz zastąpić ciąg autoScaleMaxThroughput ciągiem manualThroughput.

Ważne

Klucz partycji musi być zdefiniowany jako /groupId i ttl musi być włączony, aby funkcja kontroli przepływności działała.

W ramach konfiguracji platformy Spark określonej aplikacji można następnie określić parametry obciążenia. W poniższym przykładzie ustawiono kontrolkę przepływności jako enabled. W przykładzie zdefiniowano parametr grupy name sterowania przepływności i targetThroughputThreshold parametr. Definiujesz również database parametry i container , w których jest utrzymywana grupa kontroli przepływności:

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

W poprzednim przykładzie targetThroughputThreshold parametr jest zdefiniowany jako 0,95. Ograniczanie szybkości występuje (a żądania są ponawiane), gdy klienci zużywają ponad 95% (+/- 5–10 procent) przepływności przydzielonej do kontenera. Ta konfiguracja jest przechowywana jako dokument w kontenerze przepływności, który wygląda następująco:

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

Kontrolka przepływności nie wykonuje wstępnie obliczeń jednostek RU dla każdej operacji. Zamiast tego śledzi użycie jednostek ŻĄDANIA po operacji na podstawie nagłówka odpowiedzi. W związku z tym kontrola przepływności jest oparta na przybliżeniu i nie gwarantuje , że ilość przepływności jest dostępna dla grupy w dowolnym momencie.

Z tego powodu, jeśli skonfigurowana jednostka RU jest tak niska, że jedna operacja może jej używać, kontrola przepływności nie może uniknąć przekroczenia skonfigurowanego limitu jednostek RU. Kontrola przepływności działa najlepiej, gdy skonfigurowany limit jest wyższy niż każda pojedyncza operacja, którą może wykonać klient w określonej grupie sterowania.

Podczas odczytywania za pośrednictwem zapytania lub zestawienia zmian należy skonfigurować rozmiar strony ( spark.cosmos.read.maxItemCount domyślnie 1000), aby był skromny. W ten sposób kontrolę przepływności klienta można ponownie obliczyć z większą częstotliwością i odzwierciedlić dokładniej w dowolnym momencie. Jeśli używasz kontroli przepływności dla zadania zapisu zbiorczego, liczba dokumentów wykonywanych w jednym żądaniu jest automatycznie dostrojona na podstawie szybkości ograniczania, aby umożliwić rozpoczęcie kontroli przepływności tak szybko, jak to możliwe.

Ostrzeżenie

Parametr targetThroughputThreshold jest niezmienny. Jeśli zmienisz docelową wartość progu przepływności, zostanie utworzona nowa grupa kontroli przepływności. (Jeśli używasz wersji 4.10.0 lub nowszej, może mieć taką samą nazwę). Aby upewnić się, że wszystkie zadania platformy Spark używają nowej wartości progowej, musisz ponownie uruchomić wszystkie zadania platformy Spark korzystające z grupy. W przeciwnym razie pobierają nowy próg po następnym ponownym uruchomieniu.

Dla każdego klienta platformy Spark, który używa grupy kontroli przepływności, rekord jest tworzony w kontenerze ThroughputControl z co najmniej ttl kilka sekund. W związku z tym dokumenty znikają szybko, jeśli klient platformy Spark nie jest już aktywnie uruchomiony. Oto przykład:

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

W każdym rekordzie loadFactor klienta atrybut reprezentuje obciążenie określonego klienta względem innych klientów w grupie kontroli przepływności. Atrybut allocatedThroughput pokazuje, ile jednostek RU jest obecnie przydzielonych do tego klienta. Łącznik Spark dostosowuje przydzieloną przepływność dla każdego klienta na podstawie obciążenia. W ten sposób każdy klient uzyskuje udział dostępnej przepływności proporcjonalnej do obciążenia. Wszyscy klienci razem nie zużywają więcej niż łączna kwota przydzielona dla grupy kontroli przepływności, do której należą.