Pilih mode output untuk Streaming Terstruktur
Artikel ini membahas pemilihan mode output untuk streaming stateful. Hanya aliran stateful yang berisi agregasi yang memerlukan konfigurasi mode output.
Gabungan hanya mendukung mode output tambahan, dan mode output tidak memengaruhi deduplikasi. Operator mapGroupsWithState
stateful arbitrer dan flatMapGroupsWithState
mengeluarkan rekaman menggunakan logika kustom mereka sendiri, sehingga mode output aliran tidak memengaruhi perilaku mereka.
Untuk streaming stateless, semua mode output berperilaku sama.
Untuk mengonfigurasi mode output dengan benar, Anda harus memahami streaming stateful, marka air, dan pemicu. Lihat artikel berikut:
- Apa itu streaming stateful?
- Menerapkan marka air untuk mengontrol ambang batas pemrosesan data
- Mengonfigurasi interval pemicu Streaming Terstruktur
Apa itu mode output?
Mode output kueri Streaming Terstruktur menentukan operator kueri mana yang dipancarkan operator kueri selama setiap pemicu. Tiga jenis rekaman yang dapat dipancarkan adalah:
- Mencatat bahwa pemrosesan di masa mendatang tidak berubah.
- Rekaman yang telah berubah sejak pemicu terakhir.
- Semua rekaman dalam tabel status.
Mengetahui jenis rekaman mana yang akan dipancarkan penting bagi operator stateful karena baris tertentu yang dihasilkan oleh operator stateful mungkin berubah dari pemicu ke pemicu. Misalnya, ketika operator agregasi streaming menerima lebih banyak baris untuk jendela tertentu, nilai agregasi jendela tersebut mungkin berubah pada setiap pemicu.
Untuk operator stateless, perbedaan antara jenis rekaman tidak memengaruhi perilaku operator. Rekaman yang dikeluarkan operator stateless selama pemicu selalu merupakan rekaman sumber yang diproses selama pemicu tersebut.
Mode output yang tersedia
Ada tiga mode output yang memberi tahu operator rekaman mana yang akan dipancarkan selama pemicu tertentu:
Output Mode | Deskripsi |
---|---|
Mode tambahan (default) | Secara default, kueri streaming berjalan dalam mode tambahkan. Dalam mode ini, operator hanya memancarkan baris yang tidak berubah dalam pemicu di masa mendatang. Operator bersifat stateful menggunakan penanda waktu untuk menentukan kapan hal ini terjadi. |
mode Pembaruan | Dalam mode pembaruan, operator memancarkan semua baris data yang berubah selama pemicu, bahkan jika catatan yang dipancarkan mungkin berubah selama pemicu berikutnya. |
Mode lengkap | Mode lengkap hanya berfungsi dengan agregasi streaming. Dalam mode lengkap, semua baris yang dihasilkan oleh operator dipancarkan di hilir. |
Pertimbangan produksi
Untuk banyak operasi streaming stateful, Anda harus memilih antara mode append dan mode pembaruan. Bagian berikut menguraikan pertimbangan yang mungkin menginformasikan keputusan Anda.
Catatan
Mode lengkap memiliki beberapa aplikasi, tetapi dapat berkinerja buruk sebagai skala data. Databricks merekomendasikan penggunaan tampilan materialisasi untuk mendapatkan jaminan semantik yang terkait dengan mode lengkap melalui pemrosesan bertahap untuk berbagai operasi stateful. Lihat Menggunakan tampilan materialisasi di Databricks SQL.
Semantik aplikasi
Semantik aplikasi menjelaskan bagaimana aplikasi hilir menggunakan data streaming.
Jika layanan hilir perlu mengambil satu tindakan untuk setiap penulisan hilir, gunakan mode tambahan dalam banyak kasus. Misalnya, jika Anda memiliki layanan pemberitahuan hilir yang mengirim pemberitahuan untuk setiap rekaman baru yang ditulis ke sink, mode tambahkan memastikan setiap rekaman hanya ditulis sekali. Mode pembaruan menulis rekaman setiap kali informasi status berubah, yang akan menghasilkan banyak pembaruan.
Jika layanan hilir memerlukan hasil baru, mode pembaruan memastikan sink Anda tetap sebagai up-to-date mungkin. Contohnya termasuk model pembelajaran mesin yang membaca fitur secara real time atau dasbor analitik yang melacak agregat real time.
Kompatibilitas operator dan sink
Streaming Terstruktur tidak mendukung semua operasi yang tersedia di Apache Spark, dan beberapa operasi streaming tidak didukung di semua mode output. Untuk informasi selengkapnya tentang batasan operator, lihat dokumen streaming OSS.
Tidak semua sink mendukung semua mode output. Kedua Delta Lake, yang mendukung semua tabel terkelola Unity Catalog, dan Kafka mendukung semua mode output. Untuk informasi selengkapnya tentang kompatibilitas sink, lihat dokumen streaming OSS.
Latensi dan biaya
Mode output memengaruhi berapa banyak waktu yang harus berlalu sebelum menulis rekaman, dan frekuensi dan jumlah data yang ditulis dapat memengaruhi biaya yang terkait dengan alur streaming.
Mode tambahan data memaksa operator stateful untuk memancarkan hasil hanya setelah hasil stateful diselesaikan, yaitu setidaknya selama jeda marka air Anda. Penundaan marka air sebesar 1 hour
dalam mode output tambahan berarti bahwa rekaman Anda memiliki setidaknya penundaan 1 jam sebelum dipancarkan ke tahap berikutnya.
Pembaruan mode menghasilkan satu kali penulisan per pemicu untuk setiap nilai agregat. Jika wadah Anda dibebankan biaya per penulisan per catatan, ini bisa menjadi biaya tinggi jika catatan diperbarui berkali-kali sebelum batas waktu penundaan berlalu.
Contoh konfigurasi
Contoh kode berikut menunjukkan konfigurasi mode output untuk pembaruan streaming ke tabel Katalog Unity:
Python
# Append output mode (default)
(df.writeStream
.toTable("target_table")
)
# Append output mode (same as default behavior)
(df.writeStream
.outputMode("append")
.toTable("target_table")
)
# Update output mode
(df.writeStream
.outputMode("update")
.toTable("target_table")
)
# Complete output mode
(df.writeStream
.outputMode("complete")
.toTable("target_table")
)
Scala
// Append output mode (default)
df.writeStream
.toTable("target_table")
// Append output mode (same as default behavior)
df.writeStream
.outputMode("append")
.toTable("target_table")
// Update output mode
df.writeStream
.outputMode("update")
.toTable("target_table")
// Complete output mode
df.writeStream
.outputMode("complete")
.toTable("target_table")
Lihat dokumen OSS untuk PySpark DataStreamWriter.outputMode atau Scala DataStreamWriter.outputMode.
Contoh mode streaming dan output stateful
Contoh berikut dimaksudkan untuk membantu Anda beralasan melalui bagaimana mode output berinteraksi dengan marka air untuk streaming stateful.
Pertimbangkan agregasi streaming yang menghitung total pendapatan yang dihasilkan setiap jam di toko dengan penundaan waktu 15 menit. Microbatch pertama memproses rekaman berikut:
- $15 pukul 14.40
- $10 pukul 14.30
- $30 pukul 15:10
Pada titik ini, marka air mesin adalah 2:55 p.m. karena mengurangi 15 menit (penundaan) dari waktu maksimum yang terlihat (3:10 p.m.). Operator agregasi streaming memiliki hal berikut dalam statusnya:
-
[2pm, 3pm]
: $25 -
[3pm, 4pm]
: $30
Tabel berikut menguraikan apa yang akan terjadi di setiap mode output:
Mode output | Hasil dan alasan |
---|---|
Lampirkan | Operator agregasi streaming tidak memancarkan apa pun di hilir. Ini karena kedua jendela ini mungkin berubah saat muncul nilai baru dengan adanya pemicu berikutnya: marka air pukul 14:55 menunjukkan bahwa catatan setelah pukul 14:55 mungkin masih tiba, dan catatan tersebut mungkin jatuh ke dalam jendela [2pm, 3pm] atau jendela [3pm, 4pm] . |
Pemutakhiran | Operator memancarkan kedua rekaman, karena kedua rekaman menerima pembaruan. |
Selesai | Operator memancarkan semua rekaman. |
Sekarang, misalkan aliran menerima satu rekaman lagi:
- $20 pukul 15:20
Tanda air diperbarui menjadi 3:05 PM karena mesin mengurangi 15 menit dari 3:20 PM. Pada titik ini, operator agregasi streaming memiliki hal berikut dalam statusnya:
-
[2pm, 3pm]
: $25 -
[3pm, 4pm]
: $50
Tabel berikut menguraikan apa yang akan terjadi di setiap mode output:
Mode output | Hasil dan alasan |
---|---|
Lampirkan | Operator agregasi streaming mengamati bahwa penanda waktu 15:05 lebih besar dari akhir jendela [2pm, 3pm] . Berdasarkan definisi dari marka air, jendela tersebut tidak dapat lagi berubah, sehingga mengeluarkan jendela [2pm, 3pm] . |
Pemutakhiran | Operator agregasi streaming memancarkan jendela [3pm, 4pm] karena nilai status telah berubah dari $30 menjadi $50. |
Selesai | Operator memancarkan semua rekaman. |
Berikut ini meringkas bagaimana operator stateful berprilaku di setiap mode penambah:
- Dalam mode tambahan, tulis rekaman sekali setelah penundaan watermark.
- Dalam mode pembaruan, menulis rekaman yang mengalami perubahan sejak pemicu sebelumnya.
- Dalam mode lengkap, tulis semua rekaman yang pernah diproduksi oleh operator stateful.