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 mengalirkan kembali konten baris yang diminta dalam urutan kunci, yang berarti baris tersebut ditampilkan dalam urutan penyimpanannya. Anda dapat membaca penulisan apa pun yang telah menampilkan respons.
Kueri yang didukung tabel Anda akan membantu menentukan jenis pembacaan yang paling sesuai untuk kasus penggunaan Anda. Permintaan baca Bigtable dibagi menjadi dua kategori umum:
- Membaca satu baris
- Pemindaian, 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 parsial 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
Dengan Bigtable Data Boost, Anda dapat 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 Anda, sementara aplikasi inti Anda menggunakan node cluster Anda untuk komputasi.
Data Boost ideal untuk pemindaian dan tidak direkomendasikan untuk pembacaan baris tunggal. Anda tidak dapat menggunakan Peningkatan Data untuk pemindaian terbalik. Untuk mengetahui informasi selengkapnya dan kriteria kelayakan, lihat Ringkasan Peningkatan Data.
Operasi baca baris tunggal
Anda dapat meminta satu baris berdasarkan kunci baris. Pembacaan baris tunggal, 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:
- Membaca rentang baris
- Membaca beberapa rentang baris
- Membaca beberapa baris menggunakan awalan kunci
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 ke belakang. Jika Anda menentukan rentang baris, kunci baris akhir digunakan sebagai titik awal pemindaian.
Memindai dalam urutan terbalik dapat berguna untuk skenario berikut:
- Anda ingin menemukan peristiwa (baris), lalu membaca N jumlah peristiwa sebelumnya.
- Anda ingin menemukan nilai tertinggi sebelum nilai tertentu. Hal ini dapat membantu saat Anda menyimpan data deret waktu menggunakan stempel waktu sebagai sufiks kunci baris.
Pemindaian terbalik kurang efisien dibandingkan pemindaian maju. Secara umum, rancang kunci baris Anda sehingga sebagian besar pemindaian dilakukan ke depan. Gunakan pemindaian terbalik 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 (true). Secara default, nilainya adalah false.
Pemindaian terbalik tersedia saat Anda menggunakan library klien berikut:
- Library klien Bigtable untuk C++ versi 2.18.0 atau yang lebih baru
- Bigtable client library untuk Go versi 1.21.0 atau yang lebih baru
- Library klien Bigtable untuk Java versi 2.24.1 atau yang lebih baru
- Klien HBase Bigtable untuk Java versi 2.10.0 atau yang lebih baru
Untuk contoh kode yang menunjukkan cara menggunakan pemindaian terbalik, lihat Memindai secara terbalik.
Contoh kasus penggunaan
Contoh berikut menunjukkan cara pemindaian terbalik dapat digunakan untuk menemukan terakhir kali pelanggan mengubah sandinya dan fluktuasi harga suatu produk di sekitar 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 otomatis menyimpan data secara leksikografis, seperti
berikut. Perhatikan bahwa kolom tidak ada untuk baris (hari) saat 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 Anda ingin menemukan terakhir kali 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 Anda ingin menemukan fluktuasi harga di sekitar harga pada 14 Februari 2023, meskipun kunci baris untuk tanggal tertentu tersebut tidak ada dalam tabel, Anda dapat melakukan pemindaian maju yang dimulai dari kunci baris productA#model2#1676376000
untuk N jumlah baris, lalu melakukan pemindaian mundur untuk jumlah baris yang sama dari baris awal yang sama. Kedua pemindaian ini akan memberikan harga sebelum dan sesudah waktu yang ditentukan.
Pembacaan yang difilter
Jika hanya memerlukan baris yang berisi nilai tertentu, atau baris parsial, Anda dapat menggunakan filter dengan permintaan baca. Filter memungkinkan Anda memilih data yang diinginkan secara sangat selektif.
Filter juga memungkinkan Anda memastikan bahwa pembacaan cocok dengan kebijakan pengumpulan sampah yang digunakan tabel Anda. Hal ini sangat berguna jika Anda sering menulis sel baru yang diberi stempel waktu ke kolom yang ada. Karena pengumpulan sampah dapat memerlukan waktu hingga satu minggu 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 Anda butuhkan.
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 hal berikut:
- gcloud CLI
- Klien Bigtable untuk Java
Library klien Bigtable lainnya belum mendukung akses tampilan.
Metode apa pun yang memanggil metode ReadRows
atau SampleRowKeys
dari
Bigtable Data API didukung. Anda memberikan ID tampilan yang diizinkan
selain ID tabel saat membuat klien.
Membaca data dari tampilan terwujud berkelanjutan
Anda dapat membaca data dari tampilan terwujud berkelanjutan menggunakan SQL atau panggilan ReadRows
Data API. Tampilan terwujud berkelanjutan bersifat hanya baca. Data dalam tampilan terwujud
diketik berdasarkan kueri yang menentukannya.
SQL
Untuk membaca data dari tampilan materialis berkelanjutan menggunakan SQL, Anda dapat menggunakan editor kueri Bigtable Studio atau salah satu library klien yang mendukung kueri SQL.
SQL secara otomatis mengekspos hasil kueri sebagai kolom yang diketik, sehingga Anda tidak perlu menangani encoding dalam kueri.
Saat Anda membuat tampilan terwujud berkelanjutan, Bigtable akan otomatis membuat skema kunci baris untuk tabel yang menentukan kunci baris terstruktur untuk tampilan. Untuk mengetahui informasi selengkapnya tentang membuat kueri kunci baris terstruktur dengan SQL, lihat Kueri kunci baris terstruktur.
Data API
Jika Anda 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 tampilan 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.
Type | 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 |
WAKTU/STEMPEL WAKTU | Bilangan bulat 64-bit yang merepresentasikan jumlah mikrodetik sejak epoch Unix (konsisten dengan GoogleSQL) |
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
yang menentukan. 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 family kolom default
dan kualifikasi kolom sum_clicks
.
Bacaan dan performa
Pembacaan yang menggunakan filter lebih lambat daripada pembacaan 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:
Batasi rowset sebanyak mungkin. Membatasi jumlah baris yang harus dipindai oleh node Anda adalah langkah pertama untuk meningkatkan waktu ke byte pertama dan latensi kueri secara keseluruhan. Jika Anda tidak membatasi rowset, Bigtable hampir pasti harus memindai seluruh tabel Anda. Itulah sebabnya kami menyarankan agar Anda mendesain skema dengan cara yang memungkinkan kueri paling umum Anda berfungsi dengan cara ini.
Untuk penyesuaian performa tambahan setelah Anda membatasi rowset, 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 secara lebih efisien di setiap baris.
Jika Anda ingin menyetel performa baca lebih lanjut setelah dua strategi pertama, pertimbangkan untuk menggunakan filter yang lebih rumit. Anda mungkin mencoba cara ini karena beberapa alasan:
- Anda masih mendapatkan banyak data yang tidak Anda inginkan.
- Anda ingin menyederhanakan kode aplikasi dengan mendorong kueri ke Bigtable.
Namun, perlu diketahui bahwa filter yang memerlukan kondisi, penyisipan, atau pencocokan ekspresi reguler pada nilai besar cenderung lebih merugikan daripada menguntungkan jika filter tersebut memungkinkan sebagian besar data yang dipindai lolos. Kerugian ini berupa peningkatan penggunaan CPU di cluster Anda tanpa penghematan besar di sisi klien.
Selain strategi ini, hindari membaca sejumlah besar kunci baris atau rentang baris yang tidak berdekatan dalam satu permintaan baca. Saat Anda meminta ratusan row key atau rentang baris dalam satu permintaan, Bigtable akan memindai tabel dan membaca baris yang diminta secara berurutan. Kurangnya paralelisme ini memengaruhi latensi keseluruhan, dan setiap pembacaan yang mencapai node panas dapat meningkatkan latensi ekor. Semakin banyak rentang baris yang diminta, semakin lama waktu yang dibutuhkan untuk menyelesaikan pembacaan. Jika latensi ini tidak dapat diterima, Anda sebaiknya mengirim beberapa permintaan serentak yang masing-masing mengambil rentang baris yang lebih sedikit.
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 melakukan penomoran halaman pada permintaan dan menggunakan filter
cells per row limit
dan filtercells per row offset
. Perhatikan bahwa jika operasi tulis tiba untuk baris di antara permintaan baca yang dipaginasi, operasi baca mungkin tidak bersifat atomik.512 KB adalah ukuran maksimum panggilan API
ReadRows
. Jika Anda melebihi batas, Bigtable akan menampilkan errorINVALID_ARGUMENT
.
Langkah berikutnya
- Terapkan penghitung menggunakan sel gabungan.
- Baca ringkasan filter.
- Lihat contoh kode yang menunjukkan cara menggunakan filter.
- Baca tentang jenis permintaan tulis yang dapat Anda kirim ke Bigtable.
- Gunakan emulator Bigtable.