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:

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:

  1. Meningkatkan paralelisme tugas.
  2. Jika penggunaan CPU pada node pekerja relatif konsisten dan tidak melebihi 85%, pertimbangkan untuk menjalankan tugas pada jenis mesin yang lebih besar.
  3. 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 insertErrors adalah daftar kosong, semua baris berhasil disisipkan.
  • Beberapa baris berhasil disisipkan: Kecuali jika ada ketidakcocokan skema di salah satu baris, baris yang ditunjukkan dalam properti insertErrors tidak akan disisipkan, dan semua baris lainnya berhasil disisipkan. Properti errors berisi informasi mendetail tentang penyebab kegagalan setiap baris yang gagal. Properti index menunjukkan 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 insertErrors ditampilkan untuk setiap baris, bahkan untuk baris yang tidak memiliki ketidakcocokan skema. Baris yang tidak memiliki ketidakcocokan skema akan mengalami error dengan properti reason yang disetel ke stopped, 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 writeDisposition WRITE_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 insertId untuk penghapusan duplikat, dan project Anda berada di region yang mendukung kuota streaming yang lebih tinggi, sebaiknya hapus kolom insertId. 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 error QUOTA_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_EXCEEDED atau 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.