Dokumen ini menjelaskan cara menulis data dari Dataflow ke BigQuery.
Ringkasan
Untuk sebagian besar kasus penggunaan, pertimbangkan untuk menggunakan I/O Terkelola untuk menulis ke BigQuery. I/O terkelola menyediakan fitur seperti upgrade otomatis dan API konfigurasi yang konsisten. Saat menulis ke BigQuery, Managed I/O otomatis memilih metode penulisan terbaik untuk tugas batch atau streaming.
Jika Anda memerlukan penyesuaian performa yang lebih canggih, pertimbangkan untuk menggunakan konektor BigQueryIO. Untuk mengetahui informasi selengkapnya, lihat
Menggunakan konektor BigQueryIO dalam dokumen ini.
Performa
Tabel berikut menunjukkan metrik performa untuk berbagai workload. Workload ini dijalankan pada satu worker e2-standard2, menggunakan Apache Beam SDK 2.49.0 untuk Java. Mereka tidak menggunakan Runner v2.
| 100 juta data | 1 kB | 1 kolom | Throughput (byte) | Throughput (elemen) |
|---|---|---|
| Storage Write | 55 MBps | 54.000 elemen per detik |
| Pemuatan Avro | 78 MBps | 77.000 elemen per detik |
| Json Load | 54 MBps | 53.000 elemen per detik |
Metrik ini didasarkan pada pipeline batch sederhana. Tujuannya adalah untuk membandingkan performa antara konektor I/O, dan tidak selalu mewakili pipeline di dunia nyata. Performa pipeline Dataflow bersifat kompleks, dan merupakan fungsi dari jenis VM, data yang sedang diproses, performa sumber dan sink eksternal, serta kode pengguna. Metrik didasarkan pada menjalankan Java SDK, dan tidak mewakili karakteristik performa SDK bahasa lain. Untuk mengetahui informasi selengkapnya, lihat Performa IO Beam.
Menggunakan konektor BigQueryIO
Konektor I/O BigQuery mendukung metode berikut untuk menulis ke BigQuery:
STORAGE_WRITE_API. Dalam mode ini, konektor melakukan penulisan langsung ke penyimpanan BigQuery, menggunakan BigQuery Storage Write API (gRPC). Storage Write API (gRPC) menggabungkan penyerapan streaming dan pemuatan batch ke dalam satu API berperforma tinggi. Mode ini menjamin semantik tepat satu kali.STORAGE_API_AT_LEAST_ONCE. Mode ini juga menggunakan Storage Write API (gRPC), tetapi menyediakan semantik setidaknya sekali. Mode ini menghasilkan latensi yang lebih rendah untuk sebagian besar pipeline. Namun, penulisan duplikat mungkin terjadi.FILE_LOADS. Dalam mode ini, konektor menulis data input ke file staging di Cloud Storage. Kemudian, layanan ini akan menjalankan tugas pemuatan BigQuery untuk memuat data ke BigQuery. Mode ini adalah default untukPCollectionsterbatas, yang paling sering ditemukan di pipeline batch.STREAMING_INSERTS. Dalam mode ini, konektor menggunakan API streaming lama. Mode ini menggunakan penghapusan duplikat dengan upaya terbaik, yang dapat menghasilkan beberapa duplikat. Mode ini adalah default untukPCollectionsyang tidak terbatas, tetapi tidak direkomendasikan untuk project baru.
Saat memilih metode penulisan, pertimbangkan poin-poin berikut:
- Untuk tugas streaming, pertimbangkan untuk menggunakan
STORAGE_WRITE_APIatauSTORAGE_API_AT_LEAST_ONCE, karena mode ini menulis langsung ke penyimpanan BigQuery, tanpa menggunakan file staging perantara. - Jika Anda menjalankan pipeline menggunakan
mode streaming setidaknya sekali, tetapkan
mode tulis ke
STORAGE_API_AT_LEAST_ONCE. Setelan ini lebih efisien dan sesuai dengan semantik mode streaming setidaknya sekali. Metode penulisanFILE_LOADStidak kompatibel dengan mode streaming minimal satu kali. - Pemuatan file dan Storage Write API (gRPC) memiliki kuota dan batas yang berbeda.
- Tugas pemuatan menggunakan kumpulan slot BigQuery bersama atau slot yang dicadangkan. Untuk menggunakan slot yang direservasi, jalankan tugas pemuatan dalam project dengan penetapan pemesanan jenis
PIPELINE. Tugas pemuatan tidak dikenai biaya jika Anda menggunakan kumpulan slot BigQuery bersama. Namun, BigQuery tidak menjamin ketersediaan kapasitas dari gabungan slot bersama. Untuk mengetahui informasi selengkapnya, lihat Pengantar pemesanan.
Keparalelan
Untuk
FILE_LOADSdanSTORAGE_WRITE_APIdalam pipeline streaming, konektor melakukan sharding data ke sejumlah file atau aliran data. Secara umum, sebaiknya panggilwithAutoShardinguntuk mengaktifkan sharding otomatis.Untuk
FILE_LOADSdi pipeline batch, konektor menulis data ke file yang dipartisi, yang kemudian dimuat ke BigQuery secara paralel.Untuk
STORAGE_WRITE_APIdi pipeline batch, setiap worker membuat satu atau beberapa aliran data untuk ditulis ke BigQuery, yang ditentukan oleh jumlah total shard.Untuk
STORAGE_API_AT_LEAST_ONCE, ada satu aliran tulis default. Beberapa worker menambahkan ke aliran data ini.
Praktik terbaik
Storage Write API (gRPC) memiliki batas kuota. Konektor menangani batas ini untuk sebagian besar pipeline. Namun, beberapa skenario dapat menghabiskan aliran data Storage Write API (gRPC) yang tersedia. Misalnya, masalah ini mungkin terjadi dalam pipeline yang menggunakan sharding otomatis dan penskalaan otomatis dengan sejumlah besar tujuan, terutama dalam tugas yang berjalan lama dengan workload yang sangat bervariasi. Jika masalah ini terjadi, pertimbangkan untuk menggunakan
STORAGE_WRITE_API_AT_LEAST_ONCE, yang dapat menghindari masalah tersebut.Gunakan metrikGoogle Cloud untuk memantau penggunaan kuota Storage Write API (gRPC) Anda.
Saat menggunakan pemuatan file, Avro biasanya mengungguli JSON. Untuk menggunakan Avro, panggil
withAvroFormatFunction.Secara default, tugas pemuatan berjalan di project yang sama dengan tugas Dataflow. Untuk menentukan project lain, panggil
withLoadJobProjectId.Saat menggunakan Java SDK, pertimbangkan untuk membuat class yang mewakili skema tabel BigQuery. Kemudian, panggil
useBeamSchemadi pipeline Anda untuk otomatis mengonversi antara jenisRowApache Beam danTableRowBigQuery. Untuk contoh class skema, lihatExampleModel.java.Jika Anda memuat tabel dengan skema kompleks yang berisi ribuan kolom, pertimbangkan untuk memanggil
withMaxBytesPerPartitionguna menetapkan ukuran maksimum yang lebih kecil untuk setiap tugas pemuatan.Secara default,
BigQueryIOmenggunakan setelan Storage Write API (gRPC) yang sesuai untuk sebagian besar pipeline. Namun, jika melihat masalah performa, Anda dapat menetapkan opsi pipeline untuk menyesuaikan setelan ini. Untuk mengetahui informasi selengkapnya, lihat Menyesuaikan Storage Write API (gRPC) dalam dokumentasi Apache Beam.
Pipeline streaming
Rekomendasi berikut berlaku untuk pipeline streaming.
Untuk pipeline streaming, sebaiknya gunakan Storage Write API (gRPC) (
STORAGE_WRITE_APIatauSTORAGE_API_AT_LEAST_ONCE).Pipeline streaming dapat menggunakan pemuatan file, tetapi pendekatan ini memiliki kelemahan:
- Pipeline ini memerlukan windowing untuk menulis file. Anda tidak dapat menggunakan jendela global.
- BigQuery memuat file berdasarkan upaya terbaik saat menggunakan gabungan slot bersama. Mungkin ada penundaan yang signifikan antara saat data ditulis dan saat data tersedia di BigQuery.
- Jika tugas pemuatan gagal — misalnya, karena data yang buruk atau ketidakcocokan skema — seluruh pipeline akan gagal.
Sebaiknya gunakan
STORAGE_WRITE_API_AT_LEAST_ONCEjika memungkinkan. Hal ini dapat menyebabkan data duplikat ditulis ke BigQuery, tetapi lebih murah dan lebih skalabel daripadaSTORAGE_WRITE_API.Secara umum, hindari penggunaan
STREAMING_INSERTS. Streaming insert lebih mahal daripada Storage Write API (gRPC), tidak berperforma sebaik itu, dan menggunakan deduplikasi upaya terbaik, yang dapat menghasilkan beberapa duplikat.Sharding data dapat meningkatkan performa dalam pipeline streaming. Untuk sebagian besar pipeline, sharding otomatis adalah titik awal yang baik. Namun, Anda dapat menyesuaikan sharding sebagai berikut:
- Untuk
STORAGE_WRITE_API, panggilwithNumStorageWriteApiStreamsuntuk menetapkan jumlah aliran data tulis. - Untuk
FILE_LOADS, panggilwithNumFileShardsuntuk menetapkan jumlah shard file.
- Untuk
Jika Anda menggunakan streaming insert, sebaiknya tetapkan
retryTransientErrorssebagai kebijakan percobaan ulang.
Pipeline batch
Rekomendasi berikut berlaku untuk pipeline batch.
Untuk sebagian besar pipeline batch besar, sebaiknya coba
FILE_LOADSterlebih dahulu. Pipeline batch dapat menggunakanSTORAGE_WRITE_API, tetapi kemungkinan akan melebihi batas kuota dalam skala besar (lebih dari 1.000 vCPU) atau jika pipeline serentak sedang berjalan. Apache Beam tidak membatasi jumlah maksimum aliran tulis untuk tugasSTORAGE_WRITE_APIbatch, sehingga tugas tersebut pada akhirnya mencapai batas BigQuery Storage API.Saat menggunakan
FILE_LOADS, Anda mungkin menghabiskan gabungan slot BigQuery bersama atau gabungan slot yang dipesan. Jika Anda mengalami kegagalan semacam ini, coba pendekatan berikut:- Kurangi jumlah maksimum worker atau ukuran worker untuk tugas tersebut.
- Membeli lebih banyak slot yang dipesan.
- Sebaiknya gunakan
STORAGE_WRITE_API.
Pipeline kecil hingga menengah (<1.000 vCPU) mungkin akan mendapatkan manfaat dari penggunaan
STORAGE_WRITE_API. Untuk tugas yang lebih kecil ini, pertimbangkan untuk menggunakanSTORAGE_WRITE_APIjika Anda menginginkan antrean pesan yang tidak terkirim atau saat gabungan slot bersamaFILE_LOADStidak cukup.Jika Anda dapat menoleransi data duplikat, pertimbangkan untuk menggunakan
STORAGE_WRITE_API_AT_LEAST_ONCE. Mode ini dapat menyebabkan data duplikat ditulis ke BigQuery, tetapi mungkin lebih murah daripada opsiSTORAGE_WRITE_API.Mode tulis yang berbeda mungkin berperforma berbeda berdasarkan karakteristik pipeline Anda. Lakukan eksperimen untuk menemukan mode tulis terbaik untuk workload Anda.
Menangani error tingkat baris
Bagian ini menjelaskan cara menangani error yang mungkin terjadi di tingkat baris, misalnya karena data input yang tidak terbentuk dengan baik atau ketidakcocokan skema.
Untuk Storage Write API (gRPC), baris apa pun yang tidak dapat ditulis akan ditempatkan ke dalam PCollection terpisah. Untuk mendapatkan koleksi ini, panggil
getFailedStorageApiInserts pada objek
WriteResult. Untuk contoh pendekatan ini, lihat
Melakukan streaming data ke BigQuery.
Sebaiknya kirim error ke antrean atau tabel yang tidak aktif, untuk diproses nanti. Untuk mengetahui informasi selengkapnya tentang pola ini, lihat pola pesan yang tidak terkirim BigQueryIO.
Untuk FILE_LOADS, jika terjadi error saat memuat data, tugas pemuatan akan gagal
dan pipeline akan menampilkan pengecualian runtime. Anda dapat melihat error di log Dataflow atau melihat histori tugas BigQuery.
Konektor I/O tidak menampilkan informasi tentang setiap baris yang gagal.
Untuk mengetahui informasi selengkapnya tentang pemecahan masalah error, lihat Error konektor BigQuery.
Contoh
Contoh berikut menunjukkan cara menggunakan Dataflow untuk menulis ke BigQuery. Contoh ini menggunakan konektor BigQueryIO.
Menulis ke tabel yang ada
Contoh berikut membuat pipeline batch yang menulis
PCollection<MyData> ke BigQuery, dengan MyData sebagai jenis data
kustom.
Metode BigQueryIO.write() menampilkan jenis BigQueryIO.Write<T>, yang digunakan untuk mengonfigurasi operasi tulis. Untuk mengetahui informasi selengkapnya, lihat
Menulis ke tabel
dalam dokumentasi Apache Beam. Contoh kode ini menulis ke tabel yang ada (CREATE_NEVER) dan menambahkan baris baru ke tabel (WRITE_APPEND).
Java
Untuk melakukan autentikasi ke Dataflow, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.
Menulis ke tabel baru atau yang sudah ada
Contoh berikut membuat tabel baru jika tabel tujuan tidak ada, dengan menetapkan disposisi pembuatan ke CREATE_IF_NEEDED. Saat menggunakan opsi ini, Anda harus menyediakan skema tabel. Konektor menggunakan skema ini jika membuat tabel baru.
Java
Untuk melakukan autentikasi ke Dataflow, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.
Melakukan streaming data ke BigQuery
Contoh berikut menunjukkan cara melakukan streaming data menggunakan semantik tepat satu kali, dengan menetapkan mode tulis ke STORAGE_WRITE_API
Tidak semua pipeline streaming memerlukan semantik tepat satu kali. Misalnya, Anda
mungkin dapat
menghapus duplikat secara manual
dari tabel tujuan. Jika kemungkinan data duplikat dapat diterima untuk skenario Anda, pertimbangkan untuk menggunakan semantik setidaknya sekali dengan menetapkan metode tulis ke STORAGE_API_AT_LEAST_ONCE. Metode ini
umumnya lebih efisien dan menghasilkan latensi yang lebih rendah untuk sebagian besar pipeline.
Java
Untuk melakukan autentikasi ke Dataflow, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.
Langkah berikutnya
- Pelajari lebih lanjut I/O Terkelola.
- Pelajari praktik terbaik Pub/Sub ke BigQuery.
- Memahami karakteristik performa pipeline Pub/Sub ke BigQuery