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 meminta secara khusus.

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 kapan 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 ingin menemukan fluktuasi harga seputar harga pada 14 Februari 2023, meskipun kunci baris untuk tanggal tertentu 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 telah berakhir masa berlakunya, 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.

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 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 paling umum Anda 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 muncul dalam bentuk 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 membatasi ukuran baris hingga 256 MB, tetapi ukuran baris dapat melebihi batas maksimum tersebut secara tidak sengaja. 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.

Langkah selanjutnya