Bagikan melalui


Konektor Azure Cosmos DB Spark: Kontrol throughput

BERLAKU UNTUK: NoSQL

Konektor Spark memungkinkan Anda berkomunikasi dengan Azure Cosmos DB dengan menggunakan Apache Spark. Artikel ini menjelaskan cara kerja fitur kontrol throughput. Lihat sampel Spark kami di GitHub untuk mulai menggunakan kontrol throughput.

Artikel ini mencakup penggunaan grup kontrol throughput global di konektor Azure Cosmos DB Spark, tetapi fungsionalitasnya juga tersedia di Java SDK. Di SDK, Anda dapat menggunakan grup kontrol throughput global dan lokal untuk membatasi konsumsi unit permintaan (RU) dalam konteks satu instans koneksi klien. Misalnya, Anda dapat menerapkan pendekatan ini ke operasi yang berbeda dalam satu layanan mikro, atau mungkin ke satu program pemuatan data. Untuk informasi selengkapnya, lihat cara menggunakan kontrol throughput di Java SDK.

Peringatan

Kontrol throughput tidak didukung untuk mode gateway. Saat ini, untuk akun Azure Cosmos DB tanpa server, mencoba menggunakan targetThroughputThreshold untuk menentukan persentase menghasilkan kegagalan. Anda hanya dapat memberikan nilai absolut untuk throughput/RU target dengan menggunakan spark.cosmos.throughputControl.targetThroughput.

Mengapa kontrol throughput penting?

Kontrol throughput membantu mengisolasi kebutuhan performa aplikasi yang berjalan terhadap kontainer. Kontrol throughput membatasi jumlah RU yang dapat dikonsumsi klien Spark tertentu.

Beberapa skenario tingkat lanjut mendapat manfaat dari kontrol throughput sisi klien:

  • Operasi dan tugas yang berbeda memiliki prioritas yang berbeda: Mungkin ada kebutuhan untuk mencegah transaksi normal dibatasi karena penyerapan data atau aktivitas salin. Beberapa operasi atau tugas tidak sensitif terhadap latensi dan lebih toleran terhadap pembatasan daripada yang lain.
  • Memberikan kewajaran/isolasi kepada pengguna atau penyewa yang berbeda: Aplikasi biasanya memiliki banyak pengguna. Beberapa pengguna mungkin mengirim terlalu banyak permintaan, yang mengonsumsi semua throughput yang tersedia dan menyebabkan yang lain dibatasi.
  • Penyeimbangan beban throughput antara klien Azure Cosmos DB yang berbeda: Dalam beberapa kasus penggunaan, penting untuk memastikan semua klien mendapatkan bagian throughput yang adil (sama).

Kontrol throughput memungkinkan kemampuan untuk pembatasan laju RU tingkat yang lebih terperinci, sesuai kebutuhan.

Bagaimana cara kerja kontrol throughput?

Untuk mengonfigurasi kontrol throughput untuk konektor Spark, Anda terlebih dahulu membuat kontainer yang menentukan metadata kontrol throughput. Kunci partisi adalah groupId dan ttl diaktifkan. Di sini, Anda membuat kontainer ini dengan menggunakan Spark SQL dan menyebutnya 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');

Contoh sebelumnya membuat kontainer dengan skala otomatis. Jika Anda lebih suka provisi standar, Anda dapat mengganti autoScaleMaxThroughput dengan manualThroughput.

Penting

Kunci partisi harus didefinisikan sebagai /groupId dan ttl harus diaktifkan agar fitur kontrol throughput berfungsi.

Dalam konfigurasi Spark dari aplikasi tertentu, Anda kemudian dapat menentukan parameter untuk beban kerja. Contoh berikut menetapkan kontrol throughput sebagai enabled. Contoh mendefinisikan parameter grup name kontrol throughput dan targetThroughputThreshold parameter. Anda juga menentukan database parameter dan container tempat grup kontrol throughput dipertahankan:

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

Dalam contoh sebelumnya, targetThroughputThreshold parameter didefinisikan sebagai 0,95. Pembatasan laju terjadi (dan permintaan dicoba kembali) ketika klien mengonsumsi lebih dari 95 persen (+/- 5-10 persen) dari throughput yang dialokasikan ke kontainer. Konfigurasi ini disimpan sebagai dokumen dalam kontainer throughput, yang terlihat seperti contoh ini:

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

Kontrol throughput tidak melakukan prakalkulasi RU dari setiap operasi. Sebaliknya, ia melacak penggunaan RU setelah operasi berdasarkan header respons. Dengan demikian, kontrol throughput didasarkan pada perkiraan dan tidak menjamin bahwa jumlah throughput tersedia untuk grup pada waktu tertentu.

Untuk alasan ini, jika RU yang dikonfigurasi sangat rendah sehingga satu operasi dapat menggunakan semuanya, kontrol throughput tidak dapat menghindari RU melebihi batas yang dikonfigurasi. Kontrol throughput berfungsi paling baik ketika batas yang dikonfigurasi lebih tinggi dari operasi tunggal apa pun yang dapat dijalankan klien dalam grup kontrol tertentu.

Saat Anda membaca melalui kueri atau mengubah umpan, Anda harus mengonfigurasi ukuran halaman dalam spark.cosmos.read.maxItemCount (default 1000) menjadi jumlah sederhana. Dengan cara ini, kontrol throughput klien dapat dihitung ulang dengan frekuensi yang lebih tinggi dan tercermin lebih akurat pada waktu tertentu. Saat Anda menggunakan kontrol throughput untuk pekerjaan tulis menggunakan secara massal, jumlah dokumen yang dijalankan dalam satu permintaan secara otomatis disetel berdasarkan laju pembatasan untuk memungkinkan kontrol throughput dimulai sedini mungkin.

Peringatan

Parameter targetThroughputThreshold tidak dapat diubah. Jika Anda mengubah nilai ambang batas throughput target, grup kontrol throughput baru akan dibuat. (Jika Anda menggunakan versi 4.10.0 atau yang lebih baru, itu dapat memiliki nama yang sama.) Anda perlu memulai ulang semua pekerjaan Spark yang menggunakan grup jika Anda ingin memastikan bahwa semuanya segera menggunakan ambang batas baru. Jika tidak, mereka mengambil ambang batas baru setelah restart berikutnya.

Untuk setiap klien Spark yang menggunakan grup kontrol throughput, rekaman dibuat dalam ThroughputControl kontainer, dengan ttl beberapa detik. Akibatnya, dokumen lenyap dengan cepat jika klien Spark tidak berjalan secara aktif lagi. Berikut contohnya:

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

Dalam setiap catatan klien, loadFactor atribut mewakili beban pada klien tertentu, relatif terhadap klien lain dalam grup kontrol throughput. Atribut allocatedThroughput menunjukkan berapa banyak RU yang saat ini dialokasikan untuk klien ini. Konektor Spark menyesuaikan throughput yang dialokasikan untuk setiap klien berdasarkan bebannya. Dengan cara ini, setiap klien mendapatkan bagian dari throughput yang tersedia yang sebanding dengan bebannya. Semua klien bersama-sama tidak menggunakan lebih dari total yang dialokasikan untuk grup kontrol throughput tempat mereka berada.