Baca

Halaman ini menjelaskan jenis permintaan baca yang dapat Anda kirim ke Bigtable, membahas implikasi performa, dan menyajikan beberapa rekomendasi untuk jenis kueri tertentu. Sebelum membaca halaman ini, Anda harus memahami ringkasan Bigtable.

Ringkasan

Permintaan baca ke Bigtable akan melakukan streaming kembali konten baris yang diminta dalam urutan kunci, yang berarti baris tersebut ditampilkan dalam urutan penyimpanan. Anda dapat membaca operasi tulis yang telah menampilkan respons.

Kueri yang didukung tabel Anda akan membantu menentukan jenis operasi baca yang paling sesuai untuk kasus penggunaan Anda. Permintaan baca Bigtable terbagi menjadi dua kategori umum:

  • Membaca satu baris
  • Memindai, atau membaca beberapa baris

Operasi baca bersifat atomik di tingkat baris. Artinya, saat Anda mengirim permintaan baca untuk baris, Bigtable akan menampilkan seluruh baris atau, jika permintaan gagal, tidak ada baris yang ditampilkan. Baris sebagian tidak pernah ditampilkan kecuali jika Anda secara khusus memintanya.

Sebaiknya gunakan library klien Cloud Bigtable kami untuk membaca data dari tabel, bukan memanggil API secara langsung. Contoh kode yang menunjukkan cara mengirim permintaan baca tersedia dalam beberapa bahasa. Semua permintaan baca membuat panggilan API ReadRows.

Membaca data dengan komputasi serverless Data Boost

Bigtable Data Boost memungkinkan Anda menjalankan tugas dan kueri baca batch tanpa memengaruhi traffic aplikasi harian. Data Boost adalah layanan komputasi serverless yang dapat Anda gunakan untuk membaca data Bigtable saat aplikasi inti menggunakan node cluster untuk komputasi.

Data Boost ideal untuk pemindaian dan tidak direkomendasikan untuk pembacaan baris tunggal. Anda tidak dapat menggunakan Data Boost untuk pemindaian balik. Untuk mengetahui informasi selengkapnya dan kriteria kelayakan, lihat Ringkasan Data Boost.

Operasi baca baris tunggal

Anda dapat meminta satu baris berdasarkan kunci baris. Pembacaan baris tunggal, yang juga dikenal sebagai pembacaan titik, tidak kompatibel dengan Data Boost. Contoh kode tersedia untuk variasi berikut:

Pemindaian

Pemindaian adalah cara paling umum untuk membaca data Bigtable. Anda dapat membaca rentang baris yang berdekatan atau beberapa rentang baris dari Bigtable, dengan menentukan awalan kunci baris atau menentukan kunci baris awal dan akhir. Contoh kode tersedia untuk variasi berikut:

Pemindaian terbalik

Pemindaian terbalik memungkinkan Anda membaca rentang baris secara terbalik dengan menentukan awalan kunci baris atau rentang baris. Awalan kunci baris digunakan sebagai titik awal pemindaian untuk membaca mundur. Jika Anda menentukan rentang baris, kunci baris akhir akan digunakan sebagai titik awal pemindaian.

Pemindaian dalam urutan terbalik dapat berguna untuk skenario berikut:

Pemindaian balik kurang efisien daripada pemindaian maju. Secara umum, desain kunci baris Anda sehingga sebagian besar pemindaian dilakukan ke depan. Gunakan pemindaian balik untuk pemindaian singkat, seperti 50 baris atau kurang, untuk mempertahankan waktu respons latensi rendah.

Untuk memindai secara terbalik, Anda menetapkan nilai untuk kolom ReadRowsRequest reversed ke benar. Secara default, nilainya adalah false.

Pemindaian balik tersedia saat Anda menggunakan library klien berikut:

  • Library klien Bigtable untuk C++ versi 2.18.0 atau yang lebih baru
  • Library klien Bigtable untuk Go versi 1.21.0 atau yang lebih baru
  • Library klien Bigtable untuk Java versi 2.24.1 atau yang lebih baru
  • Klien Bigtable HBase untuk Java versi 2.10.0 atau yang lebih baru

Untuk contoh kode yang menunjukkan cara menggunakan pemindaian terbalik, lihat Pemindaian terbalik.

Contoh kasus penggunaan

Contoh berikut menunjukkan cara pemindaian balik dapat digunakan untuk menemukan waktu terakhir pelanggan mengubah sandi dan fluktuasi harga untuk produk pada hari tertentu.

Reset sandi

Pertimbangkan asumsi bahwa setiap kunci baris Anda berisi ID pelanggan dan tanggal, dalam format 123ABC#2022-05-02, dan salah satu kolomnya adalah password_reset, yang menyimpan jam saat sandi direset. Bigtable secara otomatis menyimpan data secara leksikografis, seperti berikut. Perhatikan bahwa kolom tidak ada untuk baris (hari) jika sandi tidak direset.

`123ABC#2022-02-12,password_reset:03`
`123ABC#2022-04-02,password_reset:11`
`123ABC#2022-04-14`
`123ABC#2022-05-02`
`223ABC#2022-05-22`

Jika ingin menemukan waktu terakhir pelanggan 123ABC mereset sandinya, Anda dapat memindai secara terbalik rentang 123ABC# hingga 123ABC#<DATE>, menggunakan tanggal hari ini atau tanggal di masa mendatang, untuk semua baris yang berisi kolom password_reset dengan batas baris 1.

Perubahan harga

Dalam contoh ini, kunci baris Anda berisi nilai untuk produk, model, dan stempel waktu, dan salah satu kolom berisi harga untuk produk dan model pada waktu tertentu.

`productA#model2#1675604471,price:82.63`
`productA#model2#1676219411,price:82.97`
`productA#model2#1677681011,price:83.15`
`productA#model2#1680786011,price:83.99`
`productA#model2#1682452238,price:83.12`

Jika ingin menemukan fluktuasi harga seputar harga pada 14 Februari 2023, meskipun kunci baris untuk tanggal tertentu tersebut tidak ada dalam tabel, Anda dapat melakukan pemindaian maju mulai dari kunci baris productA#model2#1676376000 untuk jumlah baris N, lalu melakukan pemindaian mundur untuk jumlah baris yang sama dari baris awal yang sama. Kedua pemindaian tersebut memberi Anda harga sebelum dan sesudah waktu yang ditentukan.

Pembacaan yang difilter

Jika hanya memerlukan baris yang berisi nilai tertentu, atau baris sebagian, Anda dapat menggunakan filter dengan permintaan baca. Filter memungkinkan Anda sangat selektif dalam data yang Anda inginkan.

Filter juga memungkinkan Anda memastikan bahwa pembacaan cocok dengan kebijakan pembersihan sampah yang digunakan tabel Anda. Hal ini sangat berguna jika Anda sering menulis sel baru dengan stempel waktu ke kolom yang ada. Karena pembersihan sampah dapat memerlukan waktu hingga seminggu untuk menghapus data yang sudah tidak berlaku, penggunaan filter rentang stempel waktu untuk membaca data dapat memastikan Anda tidak membaca lebih banyak data daripada yang diperlukan.

Ringkasan filter memberikan penjelasan mendetail tentang jenis filter yang dapat Anda gunakan. Menggunakan filter menampilkan contoh dalam beberapa bahasa.

Membaca data dari tampilan yang diotorisasi

Untuk membaca data dari tampilan yang diotorisasi, Anda harus menggunakan salah satu dari hal berikut:

  • gcloud CLI
  • Klien Bigtable untuk Java

Library klien Bigtable lainnya belum mendukung akses tampilan.

Setiap metode yang memanggil metode ReadRows atau SampleRowKeys dari Bigtable Data API didukung. Anda memberikan ID tampilan yang diotorisasi selain ID tabel saat membuat klien.

Membaca data dari tampilan terwujud berkelanjutan

Anda dapat membaca data dari tampilan yang diwujudkan secara berkelanjutan menggunakan SQL atau panggilan Data API ReadRows. Tampilan terwujud berkelanjutan bersifat hanya baca. Data dalam tampilan terwujud dietik berdasarkan kueri yang menentukannya.

SQL

Untuk membaca data dari tampilan yang diwujudkan secara berkelanjutan menggunakan SQL, Anda dapat menggunakan editor kueri Bigtable Studio atau salah satu library klien yang mendukung kueri SQL.

SQL secara otomatis menampilkan hasil kueri sebagai kolom yang diketik, sehingga Anda tidak perlu menangani encoding dalam kueri.

Data API

Jika berencana membaca dari tampilan terwujud berkelanjutan dengan panggilan ReadRows dari salah satu library klien untuk Bigtable, Anda harus meninjau kueri SQL yang digunakan untuk menentukan tampilan. Perhatikan apakah tampilan memiliki kolom _key yang ditentukan, yang direkomendasikan untuk tampilan yang dimaksudkan untuk dibaca menggunakan ReadRows, dan apakah memiliki kolom _timestamp.

Anda juga harus mengetahui jenis setiap kolom dan mendekode data kolom dalam kode aplikasi.

Nilai gabungan dalam tampilan terwujud berkelanjutan disimpan menggunakan encoding yang dijelaskan dalam tabel berikut, berdasarkan jenis output kolom dari definisi tampilan.

Jenis Encoding
BOOL Nilai 1 byte, 1 = benar, 0 = salah
BYTES Tidak ada encoding
INT64 (atau INT, SMALLINT, INTEGER, BIGINT, TINYINT, BYTEINT) Big-endian 64-bit
FLOAT64 IEEE 754 64-bit, tidak termasuk NaN dan +/-inf
STRING UTF-8
TIME/TIMESTAMP Bilangan bulat 64-bit yang mewakili jumlah mikrodetik sejak epoch Unix (konsisten dengan GoogleSQL)
Untuk informasi selengkapnya, lihat Encoding dalam referensi Data API.

Selain mengetahui jenis untuk setiap kolom dalam tampilan, Anda perlu mengetahui grup kolom dan penentu kolom. Grup kolom default disebut default, dan penentu kolom adalah alias yang ditentukan dalam kueri penentuan. Misalnya, pertimbangkan tampilan terwujud berkelanjutan yang ditentukan dengan kueri ini:

SELECT
  _key,
  SUM(clicks) AS sum_clicks
FROM
  mytable
GROUP BY
  sum_clicks

Saat membuat kueri tampilan dengan ReadRows, Anda memberikan keluarga kolom default dan penentu kolom sum_clicks.

Operasi baca dan performa

Operasi baca yang menggunakan filter lebih lambat daripada operasi baca tanpa filter, dan meningkatkan penggunaan CPU. Di sisi lain, filter ini dapat secara signifikan mengurangi jumlah bandwidth jaringan yang Anda gunakan, dengan membatasi jumlah data yang ditampilkan. Secara umum, filter harus digunakan untuk mengontrol efisiensi throughput, bukan latensi.

Jika Anda ingin mengoptimalkan performa baca, pertimbangkan strategi berikut:

  1. Batasi set baris sebanyak mungkin. Membatasi jumlah baris yang harus dipindai node Anda adalah langkah pertama untuk meningkatkan waktu hingga byte pertama dan latensi kueri secara keseluruhan. Jika Anda tidak membatasi set baris, Bigtable hampir pasti harus memindai seluruh tabel Anda. Itulah sebabnya sebaiknya Anda mendesain skema dengan cara yang memungkinkan kueri yang paling umum berfungsi dengan cara ini.

  2. Untuk penyesuaian performa tambahan setelah Anda membatasi set baris, coba tambahkan filter dasar. Membatasi kumpulan kolom atau jumlah versi yang ditampilkan umumnya tidak meningkatkan latensi dan terkadang dapat membantu Bigtable mencari data yang tidak relevan di setiap baris secara lebih efisien.

  3. Jika Anda ingin lebih menyesuaikan performa baca setelah dua strategi pertama, pertimbangkan untuk menggunakan filter yang lebih rumit. Anda mungkin mencobanya karena beberapa alasan:

    • Anda masih mendapatkan banyak data yang tidak diinginkan.
    • Anda ingin menyederhanakan kode aplikasi dengan mendorong kueri ke dalam Bigtable.

    Namun, perlu diketahui bahwa filter yang memerlukan kondisi, interleave, atau pencocokan ekspresi reguler pada nilai besar cenderung lebih merugikan daripada menguntungkan jika memungkinkan sebagian besar data yang dipindai. Kerugian ini berupa peningkatan penggunaan CPU di cluster Anda tanpa penghematan besar di sisi klien.

Selain strategi ini, hindari membaca sejumlah besar row key atau rentang baris yang tidak berdekatan dalam satu permintaan baca. Saat Anda meminta ratusan kunci baris atau rentang baris dalam satu permintaan, Bigtable akan memindai tabel dan membaca baris yang diminta secara berurutan. Kurangnya paralelisme ini memengaruhi latensi keseluruhan, dan pembacaan apa pun yang mencapai node panas dapat meningkatkan latensi ekor. Makin banyak rentang baris yang diminta, makin lama waktu yang diperlukan untuk menyelesaikan operasi baca. Jika latensi ini tidak dapat diterima, Anda harus mengirim beberapa permintaan serentak yang masing-masing mengambil lebih sedikit rentang baris.

Secara umum, membaca lebih banyak rentang baris dalam satu permintaan akan mengoptimalkan throughput, tetapi tidak mengoptimalkan latensi. Membaca lebih sedikit rentang baris dalam beberapa permintaan serentak akan mengoptimalkan latensi, tetapi tidak mengoptimalkan throughput. Menemukan keseimbangan yang tepat antara latensi dan throughput akan bergantung pada persyaratan aplikasi Anda, dan dapat dicapai dengan menyesuaikan jumlah permintaan baca serentak dan jumlah rentang baris dalam satu permintaan.

Baris besar

Bigtable menerapkan batas berikut yang berlaku untuk baris besar:

  • 256 MB adalah ukuran maksimum baris. Jika perlu membaca baris yang telah tumbuh lebih besar dari batas, Anda dapat membuat penomoran halaman permintaan dan menggunakan filter cells per row limit dan filter cells per row offset. Perhatikan bahwa jika operasi tulis datang untuk baris di antara permintaan baca yang di-paging, operasi baca mungkin tidak atomik.

  • 512 KB adalah ukuran maksimum panggilan API ReadRows. Jika Anda melebihi batas, Bigtable akan menampilkan error INVALID_ARGUMENT.

Langkah berikutnya