Memecahkan masalah error BigQuery Storage API
Dokumen ini menjelaskan cara memecahkan masalah saat Anda membaca atau melakukan streaming data di
BigQuery menggunakan BigQuery Storage Read API, BigQuery Storage Write API (gRPC),
atau penyisipan streaming dengan BigQuery Storage Write API (REST) (metode tabledata.insertAll).
Menganalisis telemetri streaming dengan tampilan INFORMATION_SCHEMA
Anda dapat membuat kueri tampilan INFORMATION_SCHEMA untuk memantau kondisi penyerapan streaming, mengidentifikasi hambatan throughput, dan memeriksa kode error selama interval satu menit:
- Storage Write API (gRPC): kueri
tampilan
INFORMATION_SCHEMA.WRITE_API_TIMELINEuntuk memeriksa permintaan penyerapan streaming gRPC, total byte dan baris yang ditambahkan, serta jumlah error menuruterror_code. - Storage Write API (REST): kueri
INFORMATION_SCHEMA.STREAMING_TIMELINEtampilan untuk memeriksa permintaan streaming RESTtabledata.insertAlllama dan error kuota atau batas kecepatan.
Contoh berikut membuat kueri INFORMATION_SCHEMA.WRITE_API_TIMELINE_BY_PROJECT
untuk mengambil jumlah error dan byte yang diserap untuk
Storage Write API (gRPC) selama 24 jam terakhir:
SELECT start_timestamp, error_code, SUM(total_requests) AS request_count, SUM(total_input_bytes) AS input_bytes FROM `region-REGION`.INFORMATION_SCHEMA.WRITE_API_TIMELINE_BY_PROJECT WHERE start_timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY) AND error_code IS NOT NULL GROUP BY start_timestamp, error_code ORDER BY start_timestamp DESC;
Ganti REGION dengan nama region set data, seperti us atau
europe-west1.
Memecahkan masalah error Storage Read API
Berikut adalah error umum yang terjadi saat Anda menggunakan Storage Read API:
- Error:
Stream removed - Penyelesaian: Coba lagi permintaan API Storage Read. Kemungkinan ini adalah error sementara yang dapat Anda atasi dengan mencoba lagi permintaan. Jika masalah berlanjut, hubungi Cloud Customer Care.
- Error:
Stream expired Penyebab: Error ini terjadi saat sesi Storage Read API mencapai waktu tunggu 6 jam.
Penyelesaian:
- Meningkatkan paralelisme tugas.
- Jika penggunaan CPU pada node pekerja relatif konsisten dan tidak melebihi 85%, pertimbangkan untuk menjalankan tugas pada jenis mesin yang lebih besar.
- Bagi tugas menjadi beberapa tugas atau kueri yang lebih kecil.
Untuk mengetahui informasi selengkapnya tentang pengelolaan sesi dan membaca data, lihat Ringkasan Storage Read API.
Memecahkan masalah streaming insert
Bagian berikut membahas cara memecahkan masalah yang terjadi saat Anda melakukan streaming data ke BigQuery menggunakan Storage Write API (REST). Untuk mengetahui informasi selengkapnya tentang cara mengatasi error kuota untuk streaming insert, lihat Error kuota streaming insert.
Kode respons HTTP gagal
Jika Anda menerima kode respons HTTP yang gagal, seperti error jaringan, tidak ada
cara untuk mengetahui apakah streaming insert berhasil atau tidak. Jika Anda mencoba mengirim ulang
permintaan, Anda mungkin akan mendapatkan baris duplikat di tabel Anda. Untuk membantu melindungi tabel Anda dari duplikasi, tetapkan properti insertId saat Anda mengirim permintaan. BigQuery menggunakan properti insertId untuk penghapusan duplikat.
Jika Anda menerima pesan error izin, error nama tabel yang tidak valid, atau error kuota terlampaui, tidak ada baris yang disisipkan dan seluruh permintaan akan gagal.
Kode respons HTTP berhasil
Meskipun Anda menerima
kode respons HTTP yang berhasil, Anda
harus memeriksa properti insertErrors respons untuk menentukan apakah
penyisipan baris berhasil, karena BigQuery mungkin hanya berhasil
sebagian dalam menyisipkan baris. Anda mungkin mengalami salah satu
skenario berikut:
- Semua baris berhasil disisipkan: Jika properti
insertErrorsadalah daftar kosong, semua baris berhasil disisipkan. - Beberapa baris berhasil disisipkan: Kecuali jika ada ketidakcocokan skema di salah satu baris, baris yang ditunjukkan dalam properti
insertErrorstidak akan disisipkan, dan semua baris lainnya berhasil disisipkan. Propertierrorsberisi informasi mendetail tentang penyebab kegagalan setiap baris yang gagal. Propertiindexmenunjukkan indeks baris berbasis 0 pada permintaan tempat error diterapkan. - Tidak ada baris yang berhasil disisipkan: Jika BigQuery menemukan
ketidakcocokan skema di setiap baris dalam permintaan, tidak ada satu pun baris yang
disisipkan dan entri
insertErrorsditampilkan untuk setiap baris, bahkan untuk baris yang tidak memiliki ketidakcocokan skema. Baris yang tidak memiliki ketidakcocokan skema akan mengalami error dengan propertireasonyang disetel kestopped, dan Anda dapat mengirimkannya kembali sebagaimana adanya. Baris yang gagal menyertakan informasi mendetail tentang ketidakcocokan skema. Untuk mempelajari jenis buffer protokol yang didukung untuk setiap jenis data BigQuery, lihat Jenis data buffer protokol dan Arrow yang didukung.
Error metadata untuk streaming insert
Karena streaming API BigQuery dirancang untuk tingkat penyisipan yang tinggi, modifikasi pada metadata tabel yang mendasarinya pada akhirnya akan konsisten saat berinteraksi dengan sistem streaming. Biasanya, perubahan metadata diterapkan dalam hitungan menit, tetapi selama periode ini, respons API mungkin mencerminkan status tabel yang tidak konsisten.
Beberapa skenario mencakup hal berikut:
- Perubahan skema: Mengubah skema tabel yang baru-baru ini menerima streaming insert dapat menyebabkan respons dengan ketidakcocokan skema menjadi error karena sistem streaming mungkin tidak segera mendeteksi perubahan skema.
- Pembuatan atau penghapusan tabel: Streaming ke tabel yang tidak ada akan menampilkan variasi respons
notFound. Tabel yang dibuat sebagai respons mungkin tidak segera dikenali oleh streaming insert berikutnya. Demikian pula, menghapus atau membuat ulang tabel dapat menghasilkan jangka waktu saat streaming insert dikirim ke tabel lama. Streaming insert mungkin tidak ada di tabel baru. - Pemotongan tabel: Memotong data tabel (dengan menggunakan tugas kueri yang menggunakan
nilai
writeDispositionWRITE_TRUNCATE) juga dapat menyebabkan penyisipan berikutnya selama periode konsistensi dihapus.
Data tidak ada atau tidak tersedia
Streaming insert berada untuk sementara di penyimpanan yang dioptimalkan untuk penulisan, yang memiliki karakteristik ketersediaan
berbeda dengan penyimpanan terkelola. Operasi tertentu di BigQuery tidak berinteraksi dengan penyimpanan yang dioptimalkan untuk penulisan, seperti tugas penyalinan tabel dan metode API seperti tabledata.list. Data streaming terbaru tidak ada di tabel atau output tujuan.
Error kuota streaming insert
Bagian ini memberikan tips untuk memecahkan masalah error kuota terkait streaming data ke BigQuery.
Di region tertentu, streaming insert memiliki kuota yang lebih tinggi jika Anda tidak mengisi kolom insertId untuk setiap baris. Untuk mengetahui informasi selengkapnya tentang kuota streaming insert, lihat Streaming insert.
Error terkait kuota untuk streaming BigQuery bergantung pada ada atau tidaknya insertId.
Pesan error
Jika kolom insertId kosong, error kuota berikut mungkin terjadi:
| Batas kuota | Pesan error |
|---|---|
| Byte per detik per project | Entity Anda dengan gaia_id: GAIA_ID, project: PROJECT_ID dalam region: REGION melampaui kuota untuk byte penyisipan per detik. |
Jika kolom insertId terisi, error kuota berikut mungkin terjadi:
| Batas kuota | Pesan error |
|---|---|
| Baris per detik per project | Project Anda: PROJECT_ID di REGION melampaui kuota untuk baris streaming insert per detik. |
| Baris per detik per tabel | Tabel Anda: TABLE_ID melampaui kuota untuk baris streaming insert per detik. |
| Byte per detik per tabel | Tabel Anda: TABLE_ID melampaui kuota untuk byte streaming insert per detik. |
Tujuan kolom insertId adalah untuk menghapus duplikat baris yang disisipkan. Jika beberapa penyisipan dengan insertId yang sama tiba dalam periode beberapa menit, BigQuery akan menulis satu versi data. Namun, penghapusan
duplikat otomatis ini tidak dijamin. Untuk throughput streaming maksimum,
sebaiknya Anda tidak menyertakan insertId, dan gunakan
penghapusan duplikat manual.
Untuk mengetahui informasi selengkapnya, lihat Memastikan konsistensi data.
Saat Anda mengalami error ini, diagnosis masalahnya, lalu ikuti langkah-langkah yang direkomendasikan untuk mengatasinya.
Diagnosis
Gunakan tampilan STREAMING_TIMELINE_BY_*
untuk menganalisis traffic streaming. Tampilan ini menggabungkan statistik
streaming selama interval satu menit, yang dikelompokkan berdasarkan error_code. Error kuota muncul dalam hasil dengan error_code yang sama dengan RATE_LIMIT_EXCEEDED atau QUOTA_EXCEEDED.
Bergantung pada batas kuota spesifik yang telah tercapai, lihat total_rows atau total_input_bytes. Jika error tersebut adalah kuota tingkat tabel, filter menurut table_id.
Misalnya, kueri berikut menampilkan total byte yang diserap per menit, dan jumlah total error kuota:
SELECT start_timestamp, error_code, SUM(total_input_bytes) as sum_input_bytes, SUM(IF(error_code IN ('QUOTA_EXCEEDED', 'RATE_LIMIT_EXCEEDED'), total_requests, 0)) AS quota_error FROM `region-REGION_NAME`.INFORMATION_SCHEMA.STREAMING_TIMELINE_BY_PROJECT WHERE start_timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP, INTERVAL 1 DAY) GROUP BY start_timestamp, error_code ORDER BY 1 DESC
Resolusi
Untuk mengatasi error kuota ini, lakukan tindakan berikut:
Jika Anda menggunakan kolom
insertIduntuk penghapusan duplikat, dan project Anda berada di region yang mendukung kuota streaming yang lebih tinggi, sebaiknya hapus kolominsertId. Solusi ini mungkin memerlukan beberapa langkah tambahan untuk menghapus duplikat data secara manual. Untuk informasi selengkapnya, lihat Menghapus duplikat secara manual.Jika Anda tidak menggunakan
insertId, atau jika tidak mungkin untuk menghapusnya, pantau traffic streaming Anda selama periode 24 jam dan analisis error kuota:Jika Anda melihat sebagian besar error
RATE_LIMIT_EXCEEDED, bukan errorQUOTA_EXCEEDED, dan total traffic di bawah 80% kuota, error tersebut mungkin menunjukkan lonjakan sementara. Anda dapat mengatasi error ini dengan mencoba kembali operasi menggunakan backoff eksponensial di antara percobaan ulang.Jika Anda menggunakan tugas Dataflow untuk menyisipkan data, pertimbangkan untuk menggunakan tugas pemuatan, bukan streaming insert. Untuk informasi selengkapnya, lihat Menetapkan metode penyisipan. Jika Anda menggunakan Dataflow dengan konektor I/O kustom, sebaiknya gunakan konektor I/O bawaan. Untuk mengetahui informasi selengkapnya, lihat Pola I/O kustom.
Jika Anda melihat error
QUOTA_EXCEEDEDatau keseluruhan traffic secara konsisten melebihi 80% kuota, kirimkan permintaan untuk penambahan kuota. Untuk mengetahui informasi selengkapnya, lihat Meminta penyesuaian kuota.Anda juga dapat mempertimbangkan untuk mengganti penyisipan streaming dengan Storage Write API yang lebih baru, yang memiliki throughput lebih tinggi, harga yang lebih rendah, dan banyak fitur berguna.