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:

  • BLOCKCACHE
  • BLOCKSIZE
  • BLOOMFILTER
  • CACHE_BLOOMS_ON_WRITE
  • CACHE_DATA_IN_L1
  • CACHE_DATA_ON_WRITE
  • CACHE_INDEX_ON_WRITE
  • COMPRESS_TAGS
  • COMPRESSION
  • COMPRESSION_COMPACT
  • DATA_BLOCK_ENCODING
  • EVICT_BLOCKS_ON_CLOSE
  • IN_MEMORY
  • KEEP_DELETED_CELLS
  • PREFETCH_BLOCKS_ON_OPEN
  • REPLICATION_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.Tag untuk menambahkan metadata ke setiap sel. Tag apa pun yang Anda tambahkan ke sel akan dihapus sebelum sel ditulis.

Mutasi dan penghapusan

  • Operasi Append di Bigtable sepenuhnya atomik untuk pembaca dan penulis. Pembaca tidak akan pernah dapat membaca operasi Append yang diterapkan sebagian.
  • Operasi Increment bersifat atomik, tetapi menetapkan rentang waktu pada Increment tidak didukung.
  • Objek RowMutations yang Anda teruskan ke Table#mutateRow() dapat berisi operasi Put dan Delete atau operasi Append dan Increment, tetapi tidak keduanya. Objek RowMutations yang berisi operasi Append atau Increment tidak didukung di batch(), checkAndMutate(), atau BufferedMutator.
  • 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.Delete tidak 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

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
  1. PrefixFilter memindai baris di PrefixFilter dalam sebagian besar kasus. Namun, jika PrefixFilter adalah bagian dari FilterList dan memiliki operator MUST_PASS_ONE, Bigtable tidak dapat menentukan rentang tersirat dan melakukan pemindaian tanpa filter dari baris awal hingga baris akhir. Gunakan PrefixFilter dengan BigtableExtendedScan atau kombinasi filter untuk mengoptimalkan performa dalam kasus ini.
  2. Memerlukan satu grup kolom hanya saat Anda menggunakan penentu kolom sebagai offset kolom.
  3. Hanya mendukung satu grup kolom.
  4. Hanya mendukung operator EQUAL, dengan pembanding BinaryComparator atau pembanding RegexStringComparator.
  5. Membuat filter dengan new KeyOnlyFilter(true) tidak didukung.
  6. Tidak boleh menjadi bagian dari FilterList yang menggunakan operator MUST_PASS_ONE.
  7. PageFilter harus berupa filter tingkat teratas atau filter terakhir dalam FilterList tingkat teratas yang menggunakan operator MUST_PASS_ALL, yang merupakan perilaku default. PageFilter dalam FilterList yang menggunakan operator MUST_PASS_ONE tidak didukung.
  8. Hanya mendukung pembanding BinaryComparator, atau pembanding RegexStringComparator dengan operator EQUAL. Jika operator selain EQUAL digunakan, hanya satu grup kolom yang didukung.
  9. Hanya mendukung pembanding berikut:
    • BinaryComparator
    • RegexStringComparator tanpa flag (flag diabaikan) dan operator EQUAL
  10. Mengandalkan filter kondisi Bigtable, yang dapat berjalan lambat. Didukung, tetapi tidak direkomendasikan.
  11. Hanya satu WhileMatchFilter yang didukung per pemindaian.
ColumnCountGetFilter
ColumnPrefixFilter
FilterList
FirstKeyOnlyFilter
FuzzyRowFilter
MultipleColumnPrefixFilter
PrefixFilter 1
RandomRowFilter
TimestampsFilter
ColumnPaginationFilter 2
ColumnRangeFilter 3
FamilyFilter 4
KeyOnlyFilter 5
MultiRowRangeFilter 6
PageFilter 7
QualifierFilter 8
RowFilter 4
SingleColumnValueExcludeFilter 3, 9, 10
SingleColumnValueFilter 9, 10
ValueFilter 9
WhileMatchFilter 6, 11

Selain itu, perbedaan berikut memengaruhi filter Bigtable:

  • Hanya komparator BinaryComparator dan RegexStringComparator yang didukung. Semua pembanding lainnya tidak didukung dan menampilkan UnsupportedOperationException.
  • 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 dalam com.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) dan addColumnFamilyAsync(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), dan createTableAsync(TableDescriptor desc, byte[][] splitKeys)
  • deleteColumnFamily(TableName tableName, byte[] columnName) dan deleteColumnFamilyAsync(TableName tableName, byte[] columnName) (HBase 1.x: deleteColumn(TableName tableName, byte[] columnName))
  • deleteTable(TableName tableName), deleteTableAsync(TableName tableName), deleteTables(Pattern pattern), dan deleteTables(String regex)
  • disableTable(TableName tableName), disableTableAsync(TableName tableName), disableTables(Pattern pattern), dan disableTables(String regex)
  • enableTable(TableName tableName), enableTableAsync(TableName tableName), enableTables(Pattern pattern), dan enableTables(String regex)
  • getAlterStatus(TableName tableName) dan getAlterStatus(byte[] tableName)
  • getDescriptor(TableName tableName), getTableDescriptor(TableName tableName), getTableDescriptors(List<String> names), dan getTableDescriptorsByTableName(List<TableName> tableNames)
  • isTableAvailable(TableName tableName) dan isTableAvailable(TableName tableName, byte[][] splitKeys)
  • isTableDisabled(TableName tableName) dan isTableEnabled(TableName tableName)
  • listTableDescriptors(), listTableDescriptors(List<TableName> tableNames), listTableDescriptors(Pattern pattern), dan listTableDescriptors(Pattern pattern, boolean includeSysTables) (HBase 1.x: listTables(), listTables(Pattern pattern), listTables(Pattern pattern, boolean includeSysTables), listTables(String regex), dan listTables(String regex, boolean includeSysTables))
  • listTableNames(), listTableNames(Pattern pattern), listTableNames(Pattern pattern, boolean includeSysTables), listTableNames(String regex), dan listTableNames(String regex, boolean includeSysTables)
  • modifyColumnFamily(TableName tableName, ColumnFamilyDescriptor columnFamily) dan modifyColumnFamilyAsync(TableName tableName, ColumnFamilyDescriptor columnFamily) (HBase 1.x: modifyColumn(TableName tableName, HColumnDescriptor column))
  • modifyTable(TableDescriptor td), modifyTable(TableName tableName, TableDescriptor td), modifyTableAsync(TableDescriptor td), dan modifyTableAsync(TableName tableName, TableDescriptor td)
  • tableExists(TableName tableName)
  • truncateTable(TableName tableName, boolean preserveSplits) dan truncateTableAsync(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(), dan enableTables() hanya mengubah status tabel dalam memori klien (yang dibaca oleh isTableDisabled() dan isTableEnabled()).
  • modifyTable() dan modifyTableAsync() hanya menerapkan perubahan pada grup kolom. Atribut tingkat tabel diabaikan.
  • truncateTable() dan truncateTableAsync() menghapus semua data dalam tabel. Parameter preserveSplits diabaikan.
  • Overload listTableDescriptors(), listTables(), dan listTableNames() yang menerima parameter includeSysTables akan mengabaikan includeSysTables, karena Bigtable tidak memiliki tabel sistem.
  • isTableAvailable(TableName tableName, byte[][] splitKeys) hanya memeriksa apakah tabel ada dan mengabaikan parameter splitKeys.
  • 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) dan getTableRegions(TableName tableName), serta metode dalam antarmuka org.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 parameter serverName dan 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), dan getClusterStatus() menampilkan nilai placeholder dengan daftar server kosong, dan getClusterMetrics(EnumSet<Option> options) mengabaikan parameter options.
  • getConfiguration() menampilkan objek Configuration klien.
  • getConnection() menampilkan objek Connection klien.

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.