Perbedaan antara HBase dan Bigtable
Salah satu cara untuk mengakses Bigtable adalah dengan menggunakan versi kustom klien Apache HBase untuk Java. Secara umum, klien yang disesuaikan mengekspos API yang sama dengan penginstalan standar HBase. Halaman ini menjelaskan perbedaan antara klien HBase Cloud Bigtable untuk Java dan penginstalan HBase standar. Banyak dari perbedaan ini terkait dengan tugas pengelolaan yang ditangani Bigtable secara otomatis.
Klien HBase Cloud Bigtable untuk Java ditujukan bagi pelanggan yang bermigrasi ke Bigtable dari HBase dan ingin terus menggunakan HBase API. Dalam semua kasus lainnya, developer Java harus menggunakan klien Cloud Bigtable untuk Java, yang memanggil Bigtable API.
Grup kolom
Saat membuat grup kolom, Anda tidak dapat mengonfigurasi ukuran blok atau metode kompresi, baik dengan shell HBase maupun melalui HBase API. Bigtable mengelola ukuran blok dan kompresi untuk Anda.
Selain itu, jika Anda menggunakan HBase shell untuk mendapatkan informasi tentang tabel, HBase shell akan selalu melaporkan bahwa setiap grup kolom tidak menggunakan kompresi. Pada kenyataannya, Bigtable menggunakan metode kompresi eksklusif untuk semua data Anda.
Setelan grup kolom berikut diabaikan, karena Bigtable mengelola penyimpanan yang mendasarinya untuk Anda:
BLOCKCACHEBLOCKSIZEBLOOMFILTERCACHE_BLOOMS_ON_WRITECACHE_DATA_IN_L1CACHE_DATA_ON_WRITECACHE_INDEX_ON_WRITECOMPRESS_TAGSCOMPRESSIONCOMPRESSION_COMPACTDATA_BLOCK_ENCODINGEVICT_BLOCKS_ON_CLOSEIN_MEMORYKEEP_DELETED_CELLSPREFETCH_BLOCKS_ON_OPENREPLICATION_SCOPE
Setelan VERSIONS, MIN_VERSIONS, dan TTL dikonversi menjadi kebijakan pembersihan sampah memori Bigtable.
Bigtable mengharuskan nama grup kolom mengikuti ekspresi reguler [_a-zA-Z0-9][-_.a-zA-Z0-9]*. Jika Anda mengimpor data ke Bigtable dari HBase, Anda mungkin perlu mengubah nama kelompok terlebih dahulu untuk mengikuti pola ini.
Baris dan sel
- Anda tidak dapat menentukan ACL untuk setiap baris. Tampilan Bigtable yang diizinkan memungkinkan Anda memberikan akses ke subset data tabel, tetapi tidak diekspos melalui HBase API.
- Anda tidak dapat menetapkan visibilitas sel satu per satu.
- Tag tidak didukung. Anda tidak dapat menggunakan class
org.apache.hadoop.hbase.Taguntuk menambahkan metadata ke setiap sel. Tag apa pun yang Anda tambahkan ke sel akan dihapus sebelum sel ditulis.
Mutasi dan penghapusan
- Operasi
Appenddi Bigtable sepenuhnya atomik untuk pembaca dan penulis. Pembaca tidak akan pernah dapat membaca operasiAppendyang diterapkan sebagian. - Operasi
Incrementbersifat atomik, tetapi menetapkan rentang waktu padaIncrementtidak didukung. - Objek
RowMutationsyang Anda teruskan keTable#mutateRow()dapat berisi operasiPutdanDeleteatau operasiAppenddanIncrement, tetapi tidak keduanya. ObjekRowMutationsyang berisi operasiAppendatauIncrementtidak didukung dibatch(),checkAndMutate(), atauBufferedMutator. Penghapusan versi tertentu dari kolom tertentu berdasarkan stempel waktunya didukung. Namun, jenis penghapusan berikut tidak didukung:
- Menghapus hanya versi terbaru kolom
- Menghapus semua nilai dalam baris yang memiliki stempel waktu tertentu
- Menghapus semua nilai dalam grup kolom pada atau sebelum stempel waktu tertentu
Akibatnya, metode berikut dalam class
org.apache.hadoop.hbase.client.Deletetidak didukung: +new Delete(byte[] row, long timestamp)+addColumn(byte[] family, byte[] qualifier)+addFamily(byte[] family, long timestamp)+addFamilyVersion(byte[] family, long timestamp)Di HBase, penghapusan akan menyamarkan penempatan, tetapi Bigtable tidak menyamarkan penempatan setelah penghapusan jika permintaan penempatan dikirim setelah permintaan penghapusan. Artinya, di Bigtable, permintaan tulis yang dikirim ke sel tidak terpengaruh oleh permintaan penghapusan yang dikirim sebelumnya ke sel yang sama.
Get dan scan
- Pemindaian terbalik memungkinkan Anda membaca rentang baris secara terbalik. Untuk mengetahui detailnya, lihat Pemindaian terbalik.
- Tidak seperti HBase, saat Anda mengirim permintaan baca, Bigtable tidak otomatis memfilter data yang sudah tidak berlaku dan ditandai untuk dihapus dalam siklus pembersihan sampah memori mendatang. Agar tidak membaca data yang sudah tidak berlaku, gunakan filter dalam permintaan baca. Untuk mengetahui informasi selengkapnya, lihat Ringkasan pembersihan sampah memori.
- Membatasi jumlah nilai per baris per grup kolom tidak didukung. Anda
tidak dapat memanggil metode
org.apache.hadoop.hbase.client.Scan#setMaxResultsPerColumnFamily(int limit). - Hasil parsial tidak didukung. Baris selalu ditampilkan secara utuh. Panggilan ke
metode
org.apache.hadoop.hbase.client.Scan#setBatch(int batch)danorg.apache.hadoop.hbase.client.Scan#setAllowPartialResults(boolean allowPartialResults)diabaikan. - Pada panggilan
Table#getScanner(Scan)sinkron,org.apache.hadoop.hbase.client.Scan#setCaching(int caching)mengontrol jumlah baris yang diambil klien dalam satu waktu.AsyncTable#getScanner()mengabaikansetCaching(). Panggilan ke metodeorg.apache.hadoop.hbase.client.Scan#setMaxResultSize(long maxResultSize)selalu diabaikan.
Koprosesor
Koprosesor tidak didukung. Anda tidak dapat membuat class yang mengimplementasikan
antarmuka
org.apache.hadoop.hbase.coprocessor.
Filter
Tabel berikut mencantumkan filter yang didukung dalam paket
org.apache.hadoop.hbase.filter. Semua filter lain dalam paket tersebut tidak didukung dan menampilkan UnsupportedOperationException.
| Didukung | Didukung, dengan batasan |
|---|---|
|
|
ColumnCountGetFilterColumnPrefixFilterFilterListFirstKeyOnlyFilterFuzzyRowFilterMultipleColumnPrefixFilterPrefixFilter 1RandomRowFilterTimestampsFilter
|
ColumnPaginationFilter 2ColumnRangeFilter 3FamilyFilter 4KeyOnlyFilter 5MultiRowRangeFilter 6PageFilter 7QualifierFilter 8RowFilter 4SingleColumnValueExcludeFilter 3, 9, 10SingleColumnValueFilter 9, 10ValueFilter 9WhileMatchFilter 6, 11
|
Selain itu, perbedaan berikut memengaruhi filter Bigtable:
- Hanya komparator
BinaryComparatordanRegexStringComparatoryang didukung. Semua pembanding lainnya tidak didukung dan menampilkanUnsupportedOperationException. - Dalam filter yang menggunakan pembanding ekspresi reguler
(
org.apache.hadoop.hbase.filter.RegexStringComparator), ekspresi reguler menggunakan sintaksis RE2, bukan sintaksis Java. - Filter kustom tidak didukung. Anda tidak dapat membuat class yang diwarisi dari
org.apache.hadoop.hbase.filter.Filter. Untuk menggunakan filter Bigtable yang tidak memiliki padanan HBase, gabungkan dalamcom.google.cloud.bigtable.hbase.filter.BigtableFilter. - Ada batas ukuran 20 KB pada ekspresi filter, dan filter tidak dapat disusun bertingkat lebih dari 20 level. Sebagai solusi untuk mengurangi ukuran ekspresi filter, gunakan kolom tambahan yang menyimpan nilai hash kriteria filter.
Stempel waktu
Bigtable menyimpan stempel waktu dalam mikrodetik, sedangkan HBase menyimpan stempel waktu dalam milidetik. Perbedaan ini memiliki implikasi saat Anda menggunakan library klien HBase untuk Bigtable dan memiliki data dengan stempel waktu terbalik.
Library klien mengonversi antara mikrodetik dan milidetik, tetapi karena stempel waktu HBase terbesar yang dapat disimpan Bigtable adalah Long.MAX_VALUE/1000, nilai apa pun yang lebih besar dari itu akan dikonversi menjadi Long.MAX_VALUE/1000. Akibatnya, nilai stempel waktu terbalik yang besar mungkin tidak dikonversi dengan benar.
Administrasi
Bagian ini menjelaskan cara klien Bigtable HBase untuk Java
mengimplementasikan antarmuka
org.apache.hadoop.hbase.client.Admin. Karena Bigtable menangani sebagian besar tugas pengelolaan cluster dan penyimpanan secara otomatis, banyak metode administratif HBase yang tidak berlaku. Metode Admin apa pun yang tidak tercantum di bagian ini sebagai didukung
atau tidak berpengaruh, berarti tidak didukung dan akan menampilkan
UnsupportedOperationException.
Pengelolaan tabel
Metode Admin berikut untuk mengelola tabel dan grup kolom didukung:
addColumnFamily(TableName tableName, ColumnFamilyDescriptor columnFamily)danaddColumnFamilyAsync(TableName tableName, ColumnFamilyDescriptor columnFamily)(HBase 1.x:addColumn(TableName tableName, HColumnDescriptor column))createTable(TableDescriptor desc),createTable(TableDescriptor desc, byte[][] splitKeys),createTable(TableDescriptor desc, byte[] startKey, byte[] endKey, int numRegions),createTableAsync(TableDescriptor desc), dancreateTableAsync(TableDescriptor desc, byte[][] splitKeys)deleteColumnFamily(TableName tableName, byte[] columnName)dandeleteColumnFamilyAsync(TableName tableName, byte[] columnName)(HBase 1.x:deleteColumn(TableName tableName, byte[] columnName))deleteTable(TableName tableName),deleteTableAsync(TableName tableName),deleteTables(Pattern pattern), dandeleteTables(String regex)disableTable(TableName tableName),disableTableAsync(TableName tableName),disableTables(Pattern pattern), dandisableTables(String regex)enableTable(TableName tableName),enableTableAsync(TableName tableName),enableTables(Pattern pattern), danenableTables(String regex)getAlterStatus(TableName tableName)dangetAlterStatus(byte[] tableName)getDescriptor(TableName tableName),getTableDescriptor(TableName tableName),getTableDescriptors(List<String> names), dangetTableDescriptorsByTableName(List<TableName> tableNames)isTableAvailable(TableName tableName)danisTableAvailable(TableName tableName, byte[][] splitKeys)isTableDisabled(TableName tableName)danisTableEnabled(TableName tableName)listTableDescriptors(),listTableDescriptors(List<TableName> tableNames),listTableDescriptors(Pattern pattern), danlistTableDescriptors(Pattern pattern, boolean includeSysTables)(HBase 1.x:listTables(),listTables(Pattern pattern),listTables(Pattern pattern, boolean includeSysTables),listTables(String regex), danlistTables(String regex, boolean includeSysTables))listTableNames(),listTableNames(Pattern pattern),listTableNames(Pattern pattern, boolean includeSysTables),listTableNames(String regex), danlistTableNames(String regex, boolean includeSysTables)modifyColumnFamily(TableName tableName, ColumnFamilyDescriptor columnFamily)danmodifyColumnFamilyAsync(TableName tableName, ColumnFamilyDescriptor columnFamily)(HBase 1.x:modifyColumn(TableName tableName, HColumnDescriptor column))modifyTable(TableDescriptor td),modifyTable(TableName tableName, TableDescriptor td),modifyTableAsync(TableDescriptor td), danmodifyTableAsync(TableName tableName, TableDescriptor td)tableExists(TableName tableName)truncateTable(TableName tableName, boolean preserveSplits)dantruncateTableAsync(TableName tableName, boolean preserveSplits)
Metode pengelolaan tabel yang didukung berikut berperilaku berbeda di Bigtable atau mengabaikan parameter tertentu:
- Tabel Bigtable tidak dapat dinonaktifkan.
disableTable(),disableTableAsync(),disableTables(),enableTable(),enableTableAsync(), danenableTables()hanya mengubah status tabel dalam memori klien (yang dibaca olehisTableDisabled()danisTableEnabled()). modifyTable()danmodifyTableAsync()hanya menerapkan perubahan pada grup kolom. Atribut tingkat tabel diabaikan.truncateTable()dantruncateTableAsync()menghapus semua data dalam tabel. ParameterpreserveSplitsdiabaikan.- Overload
listTableDescriptors(),listTables(), danlistTableNames()yang menerima parameterincludeSysTablesakan mengabaikanincludeSysTables, karena Bigtable tidak memiliki tabel sistem. isTableAvailable(TableName tableName, byte[][] splitKeys)hanya memeriksa apakah tabel ada dan mengabaikan parametersplitKeys.getAlterStatus()selalu menampilkan(0, 0)karena modifikasi skema di Bigtable bersifat sinkron.
Tugas seperti pemadatan dan pemisahan tabel ditangani secara otomatis. Akibatnya, metode berikut tidak berpengaruh:
compact(TableName tableName)compact(TableName tableName, byte[] columnFamily)majorCompact(TableName tableName)majorCompact(TableName tableName, byte[] columnFamily)split(TableName tableName)split(TableName tableName, byte[] splitPoint)
Snapshot
Metode snapshot HBase membuat dan mengelola cadangan Bigtable. Karena cadangan disimpan di cluster tertentu, jika instance Anda memiliki lebih dari satu cluster, Anda harus menetapkan properti konfigurasi google.bigtable.snapshot.cluster.id ke cluster yang akan digunakan. Cadangan yang Anda buat dengan snapshot() akan berakhir setelah jumlah detik dalam properti konfigurasi google.bigtable.snapshot.default.ttl.secs (secara default 24 jam).
cloneSnapshot() memulihkan dari cadangan ke tabel baru.
Metode snapshot berikut didukung di Admin:
cloneSnapshot(byte[] snapshotName, TableName tableName)cloneSnapshot(String snapshotName, TableName tableName)deleteSnapshot(byte[] snapshotName)deleteSnapshot(String snapshotName)snapshot(byte[] snapshotName, TableName tableName)snapshot(String snapshotName, TableName tableName)
Selain itu, AsyncAdmin mendukung listSnapshots(), listSnapshots(Pattern
pattern), dan snapshot(SnapshotDescription snapshot). Semua metode snapshot lainnya—termasuk restoreSnapshot(), deleteSnapshots(), deleteTableSnapshots(), listTableSnapshots(), dan cloneSnapshot(String
snapshotName, TableName tableName, boolean restoreAcl)—tidak didukung dan menampilkan UnsupportedOperationException.
Pengelolaan region
Bigtable menggunakan tablet, yang mirip dengan region. Metode berikut untuk mengambil informasi region didukung, dengan perbedaan dari HBase standar:
getRegions(TableName tableName)dangetTableRegions(TableName tableName), serta metode dalam antarmukaorg.apache.hadoop.hbase.client.RegionLocator, menampilkan batas perkiraan berdasarkan sampel row key dalam tabel. Nama server di region yang ditampilkan bukanlah server yang sebenarnya.getRegionMetrics(ServerName serverName, TableName tableName)mengabaikan parameterserverNamedan menampilkan metrik perkiraan ukuran region berdasarkan sampel row key dalam tabel.
Karena Bigtable mengelola tablet Anda secara otomatis, metode berikut tidak akan berpengaruh:
assign(byte[] regionName)compactRegion(byte[] regionName)compactRegion(byte[] regionName, byte[] columnFamily)flushRegion(byte[] regionName)majorCompactRegion(byte[] regionName)majorCompactRegion(byte[] regionName, byte[] columnFamily)splitRegion(byte[] regionName)splitRegion(byte[] regionName, byte[] splitPoint)
Di HBase 1.x, compactRegionServer(ServerName sn, boolean major),
mergeRegions(byte[] encodedNameOfRegionA, byte[] encodedNameOfRegionB, boolean
forcible), move(byte[] encodedRegionName, byte[] destServerName), dan
unassign(byte[] regionName, boolean force) juga tidak berpengaruh. Padanan HBase 2.x-nya tidak didukung dan menampilkan UnsupportedOperationException.
Status dan koneksi cluster
Bigtable menangani tugas pemeliharaan cluster secara otomatis, sehingga metode pemeliharaan di Admin menampilkan UnsupportedOperationException. Hanya
metode koneksi dan status berikut yang didukung:
close()tidak berpengaruh.getClusterMetrics(),getClusterMetrics(EnumSet<Option> options), dangetClusterStatus()menampilkan nilai placeholder dengan daftar server kosong, dangetClusterMetrics(EnumSet<Option> options)mengabaikan parameteroptions.getConfiguration()menampilkan objekConfigurationklien.getConnection()menampilkan objekConnectionklien.
Namespace
Bigtable tidak menggunakan namespace. Anda dapat menggunakan awalan kunci baris untuk menyimulasikan namespace.
Secara default, semua metode namespace menampilkan UnsupportedOperationException.
Namun, jika Anda menetapkan properti konfigurasi
google.bigtable.namespace.warnings ke true, metode berikut akan mencatat
peringatan dan tidak berpengaruh (menampilkan null atau hasil kosong), bukan
menampilkan pengecualian:
createNamespace(NamespaceDescriptor descriptor)deleteNamespace(String name)deleteNamespaceAsync(String name)getNamespaceDescriptor(String name)listNamespaceDescriptors()listTableDescriptorsByNamespace(byte[] name)listTableDescriptorsByNamespace(String name)listTableNamesByNamespace(String name)modifyNamespace(NamespaceDescriptor descriptor)
Meskipun google.bigtable.namespace.warnings ditetapkan ke true,
listNamespaces() akan menampilkan UnsupportedOperationException.
Fitur administratif lainnya
Bigtable tidak mendukung metode Admin dalam kategori berikut, dan memanggilnya akan menampilkan UnsupportedOperationException:
- Grup lokalitas: Bigtable tidak mengizinkan Anda menentukan grup lokalitas untuk grup kolom.
- Koprosesor dan prosedur terdistribusi: Bigtable tidak mendukung koprosesor atau prosedur terdistribusi.
- Kuota: Untuk mempelajari kuota Bigtable, lihat Kuota dan batas.
- Replikasi: Bigtable mereplikasi data secara otomatis di antara cluster dalam sebuah instance. Untuk mengetahui detailnya, lihat Ringkasan replikasi. Untuk mereplikasi dari HBase ke Bigtable, lihat Mereplikasi dari HBase ke Bigtable.
- Kontrol akses: Bigtable menggunakan IAM untuk kontrol akses.
- Grup RegionServer: Bigtable mengelola server secara otomatis dan tidak mengekspos grup RegionServer.