Baca

Halaman ini menjelaskan jenis permintaan baca yang dapat Anda kirim ke Bigtable, membahas implikasi performa, dan memberikan 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 konten 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 pembacaan beberapa baris

Untuk melihat cara traffic baca didistribusikan di berbagai jenis kueri, seperti pembacaan titik, pemindaian singkat, pemindaian terbalik, pembacaan sparse, dan pembacaan massal, lihat Menganalisis pola akses.

Operasi baca bersifat atomik di tingkat baris. Artinya, saat Anda mengirim permintaan baca untuk sebuah baris, Bigtable akan menampilkan seluruh baris atau, jika permintaan gagal, tidak ada baris yang ditampilkan. Baris parsial tidak akan pernah ditampilkan kecuali jika Anda memintanya 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 melakukan panggilan API ReadRows.

Membaca data dengan komputasi serverless Data Boost

Bigtable Data Boost memungkinkan Anda menjalankan tugas baca dengan throughput tinggi tanpa memengaruhi traffic aplikasi jalur penyaluran. Data Boost adalah layanan komputasi serverless yang dapat Anda gunakan untuk membaca data Bigtable, sementara aplikasi inti Anda menggunakan node cluster untuk komputasi. Enterprise Plus memperluas kemampuan kueri Data Boost dengan dukungan SQL serta akses ke data HDD dan penyimpanan bertingkat.

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

Pembacaan satu baris

Anda dapat meminta satu baris berdasarkan row key. Pembacaan satu baris, 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 row key atau menentukan row key awal dan akhir. Contoh kode tersedia untuk variasi berikut:

Pemindaian balik

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

Pemindaian 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 berguna saat Anda menyimpan data deret waktu menggunakan stempel waktu sebagai akhiran row key.

Pemindaian terbalik kurang efisien dibandingkan pemindaian maju. Secara umum, desain row key Anda sehingga sebagian besar pemindaian mengarah ke depan. Gunakan pemindaian terbalik untuk pemindaian singkat, seperti 50 baris atau kurang, guna mempertahankan waktu respons latensi rendah.

Untuk memindai secara terbalik, tetapkan nilai untuk kolom ReadRowsRequest reversed ke 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
  • 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 Memindai secara terbalik.

Contoh kasus penggunaan

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

Reset sandi

Pertimbangkan asumsi bahwa setiap row key 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 kapan terakhir kali pelanggan 123ABC mereset sandinya, Anda dapat memindai rentang 123ABC# hingga 123ABC#<DATE> secara terbalik, 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, row key 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 row key untuk tanggal tertentu tersebut tidak ada dalam tabel, Anda dapat melakukan pemindaian maju mulai dari row key productA#model2#1676376000 untuk N jumlah baris, lalu melakukan pemindaian terbalik untuk jumlah baris yang sama dari baris awal yang sama. Kedua pemindaian ini memberi Anda harga sebelum dan sesudah waktu yang ditentukan.

Pembacaan yang difilter

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

Filter juga memungkinkan Anda memastikan bahwa pembacaan cocok dengan kebijakan pembersihan sampah memori yang digunakan tabel Anda. Hal ini sangat berguna jika Anda sering menulis sel baru yang diberi stempel waktu ke kolom yang ada. Karena pembersihan sampah memori dapat memerlukan waktu hingga seminggu untuk menghapus data yang sudah tidak berlaku, menggunakan 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.

Metode apa pun 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 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 terwujud berkelanjutan menggunakan SQL, Anda dapat menggunakan editor kueri Bigtable Studio atau salah satu library klien yang mendukung kueri SQL.

SQL otomatis mengekspos hasil kueri sebagai kolom berformat khusus, sehingga Anda tidak perlu menangani encoding dalam kueri.

Saat Anda membuat tampilan terwujud berkelanjutan, Bigtable otomatis membuat skema row key untuk tabel yang menentukan row key terstruktur untuk tampilan. Untuk mengetahui informasi selengkapnya tentang cara membuat kueri row key terstruktur dengan SQL, lihat Kueri row key terstruktur.

Membaca data selama pengisian awal

Saat Anda membuat tampilan terwujud berkelanjutan pada tabel yang ada, Bigtable memulai proses pengisian awal yang menyalin data tabel yang ada ke dalam tampilan.

Secara default, untuk membantu memastikan kebenaran data, Bigtable menolak permintaan baca yang mencoba membaca dari tampilan terwujud berkelanjutan saat tampilan sedang dibuat. Jika Anda mengkueri tampilan yang masih diisi, Bigtable akan menampilkan error Materialized view is still creating.. Error ini memiliki kode status FAILED_PRECONDITION.

Jika aplikasi Anda dapat menoleransi data yang tidak lengkap, Anda dapat memilih untuk membaca dari tampilan sebelum populasi awal selesai. Untuk membaca dari tampilan terwujud berkelanjutan selama populasi awal, tambahkan petunjuk kueri tingkat pernyataan allow_incomplete_view=true ke kueri SQL Anda:

SELECT key_part FROM `VIEW_ID` @{allow_incomplete_view=true}

Ganti VIEW_ID dengan ID unik tampilan terwujud berkelanjutan Anda.

Untuk mengetahui informasi selengkapnya, lihat Membuat tampilan terwujud berkelanjutan pada tabel yang ada.

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 tersebut memiliki kolom _timestamp.

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

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 Tanpa 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 mengetahui 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 penentu. 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 grup kolom default dan penentu kolom sum_clicks.

Operasi baca dan performa

Pembacaan yang menggunakan filter lebih lambat daripada pembacaan tanpa filter, dan meningkatkan pemakaian CPU. Di sisi lain, filter dapat mengurangi jumlah bandwidth jaringan yang Anda gunakan secara signifikan, 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 oleh node Anda adalah langkah pertama untuk meningkatkan Time to First Byte dan latensi kueri secara keseluruhan. Jika Anda tidak membatasi set baris, Bigtable hampir pasti harus memindai seluruh tabel Anda. Oleh karena itu, sebaiknya Anda mendesain skema dengan cara yang memungkinkan kueri yang paling umum berfungsi seperti 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 meningkatkan performa baca setelah menerapkan dua strategi pertama, pertimbangkan untuk menggunakan filter yang lebih rumit. Anda dapat mencoba ini karena beberapa alasan:

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

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

Selain strategi ini, hindari membaca sejumlah besar row key atau rentang baris yang tidak berurutan 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 hot node dapat meningkatkan latensi tail. Makin banyak rentang baris yang diminta, makin lama waktu yang diperlukan untuk menyelesaikan pembacaan. Jika latensi ini tidak dapat diterima, Anda harus 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 bertambah besar melebihi batas, Anda dapat memberi nomor halaman pada permintaan dan menggunakan filter cells per row limit dan filter cells per row offset. Perlu diketahui bahwa jika penulisan tiba untuk baris di antara permintaan baca yang diberi nomor halaman, pembacaan mungkin tidak bersifat atomik.

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

Langkah berikutnya