Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Artikel ini membahas pemilihan mode output untuk streaming stateful. Hanya aliran yang memiliki status dan berisi agregasi yang memerlukan konfigurasi mode keluaran.
Gabungan hanya mendukung mode output tambahan, dan mode output tidak memengaruhi deduplikasi. Operator stateful sembarang mapGroupsWithState dan flatMapGroupsWithState menghasilkan catatan menggunakan logika khusus miliknya sendiri, sehingga mode keluaran stream tidak memengaruhi perilakunya.
Untuk streaming stateless, semua mode output berperilaku sama.
Untuk mengonfigurasi mode keluaran dengan benar, Anda harus memahami streaming berbasis negara, watermark, dan pemicu. Lihat artikel berikut:
- Apa yang dimaksud dengan streaming yang bersifat stateful?
- Menerapkan marka air untuk mengontrol ambang batas pemrosesan data
- Mengatur interval pemicu Terstruktur Streaming
Apa itu mode output?
Modus keluaran untuk kueri Streaming Terstruktur menentukan catatan mana yang dipancarkan oleh operator kueri pada setiap pemicu. Tiga jenis rekaman yang dapat dipancarkan adalah:
- Mencatat bahwa pemrosesan di masa mendatang tidak berubah.
- Catatan 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 melalui berbagai pemicu.
Untuk operator stateless, perbedaan tipe rekaman tidak memengaruhi perilaku operator. Catatan yang dikeluarkan oleh operator stateless selama pemicu selalu merupakan catatan sumber yang diproses selama pemicu tersebut.
Mode output yang tersedia
Ada tiga mode keluaran yang memberi tahu operator rekaman mana yang akan dipancarkan pada saat pemicu tertentu terjadi.
| Mode Keluaran | Deskripsi |
|---|---|
| Mode tambahan (default) | Secara default, kueri streaming berjalan dalam mode tambahkan. Dalam mode ini, operator hanya menghasilkan baris yang tidak berubah pada pemicu ke depannya. 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 dikirim ke bagian 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 ketika skala data meningkat. Databricks merekomendasikan penggunaan tampilan materialisasi untuk mendapatkan jaminan semantik yang terkait dengan mode lengkap melalui pemrosesan bertahap untuk berbagai operasi stateful. Lihat Tampilan termaterialisasi.
Semantik aplikasi
Semantik aplikasi menjelaskan bagaimana aplikasi hilir menggunakan data streaming.
Jika layanan pada bagian hilir perlu mengambil satu tindakan untuk setiap penulisan di bagian hilir, gunakan mode tambah pada umumnya. 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 se-teriukini 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 dokumentasi 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 lebih lanjut mengenai kompatibilitas sink, lihat dokumen OSS streaming.
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:
Phyton
# 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 stateful untuk streaming dan output
Contoh berikut dimaksudkan untuk membantu Anda memahami bagaimana mode output berinteraksi dengan tanda air dalam 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, tanda air mesin adalah 14:55 karena mengurangi 15 menit (penundaan) dari waktu maksimum yang terlihat (15:10). 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 keluaran | 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 keluaran | 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.
- Pada mode lengkap, catat semua rekaman yang pernah dihasilkan oleh operator berstatus.