Perbedaan antara HBase dan Bigtable

Salah satu cara untuk mengakses Bigtable adalah menggunakan versi klien Apache HBase yang disesuaikan untuk Java. Secara umum, klien yang disesuaikan menampilkan API yang sama dengan penginstalan standar HBase. Halaman ini menjelaskan perbedaan antara klien Cloud Bigtable HBase untuk Java dan penginstalan HBase standar. Banyak dari perbedaan tersebut terkait dengan tugas pengelolaan yang ditangani secara otomatis oleh Bigtable.

Kelompok 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 shell HBase untuk mendapatkan informasi tentang tabel, shell HBase akan selalu melaporkan bahwa setiap grup kolom tidak menggunakan kompresi. Pada kenyataannya, Bigtable menggunakan metode kompresi eksklusif untuk semua data Anda.

Bigtable mengharuskan nama keluarga kolom mengikuti ekspresi reguler [_a-zA-Z0-9][-_.a-zA-Z0-9]*. Jika mengimpor data ke Bigtable dari HBase, Anda mungkin perlu mengubah nama keluarga terlebih dahulu agar mengikuti pola ini.

Baris dan sel

  • Anda tidak dapat menentukan ACL untuk setiap baris.
  • Anda tidak dapat menetapkan visibilitas sel individual.
  • Tag tidak didukung. Anda tidak dapat menggunakan class org.apache.hadoop.hbase.Tag untuk menambahkan metadata ke setiap sel.

Mutasi dan penghapusan

  • Operasi Append di Bigtable sepenuhnya bersifat atomik bagi pembaca dan penulis. Pembaca tidak akan dapat membaca operasi Append yang diterapkan sebagian.
  • Penghapusan versi tertentu dari kolom tertentu berdasarkan stempel waktunya didukung, tetapi penghapusan semua nilai dengan stempel waktu tertentu dalam grup atau baris kolom tertentu tidak didukung. 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, deletes mask put, tetapi Bigtable tidak menerapkan mask setelah penghapusan ketika permintaan put dikirim setelah permintaan penghapusan. Ini berarti bahwa di Bigtable, permintaan tulis yang dikirim ke sel tidak terpengaruh oleh permintaan penghapusan yang dikirim sebelumnya ke sel yang sama.

Mendapatkan dan memindai

Koprosesor

Koprosesor tidak didukung. Anda tidak dapat membuat class yang mengimplementasikan antarmuka org.apache.hadoop.hbase.coprocessor.

Filter

Tabel berikut menunjukkan filter yang didukung. Semua filter ini ada dalam paket org.apache.hadoop.hbase.filter.

Didukung Didukung, dengan batasan Tidak didukung
  1. Hanya mendukung satu grup kolom.
  2. Memanggil setLenAsVal(true) tidak didukung.
  3. Hanya mendukung pembanding BinaryComparator. Jika ada operator selain EQUAL yang digunakan, hanya satu grup kolom yang didukung.
  4. Hanya mendukung pembanding berikut:
    • BinaryComparator
    • RegexStringComparator tanpa tanda (tanda diabaikan) dan operator EQUAL
  5. Jika PageFilter berada dalam FilterList, PageFilter hanya akan berfungsi serupa dengan HBase saat FilterList ditetapkan ke MUST_PASS_ALL, yang merupakan perilaku default. Jika FilterList disetel ke MUST_PASS_ONE, Bigtable akan memperlakukan PageFilter sebagai MUST_PASS_ALL dan hanya menampilkan sejumlah baris yang sesuai dengan pageSize PageFilter.
  6. Pada umumnya, PrefixFilter memindai baris di PrefixFilter. Namun, jika PrefixFilter adalah bagian dari FilterList dan memiliki operator MUST_PASS_ONE, Bigtable tidak dapat menentukan rentang tersirat, dan melakukan pemindaian yang tidak difilter dari baris awal ke baris perhentian. Dalam kasus ini, gunakan PrefixFilter dengan BigtableExtendedScan atau kombinasi filter untuk mengoptimalkan performa.
  7. Mengandalkan filter kondisi Bigtable, yang dapat menjadi lambat. Didukung tetapi tidak direkomendasikan.
ColumnPrefixFilter
FamilyFilter
FilterList
FuzzyRowFilter
MultipleColumnPrefixFilter
MultiRowRangeFilter
PrefixFilter 6
RandomRowFilter
TimestampsFilter
ColumnCountGetFilter 1
ColumnPaginationFilter 1
ColumnRangeFilter 1
FirstKeyOnlyFilter 1
KeyOnlyFilter 2
PageFilter 5
QualifierFilter 3
RowFilter 1, 4
SingleColumnValueExcludeFilter 1, 4, 7
SingleColumnValueFilter 4, 7
ValueFilter 4
DependentColumnFilter
FirstKeyValueMatchingQualifiersFilter
InclusiveStopFilter
ParseFilter
SkipFilter
WhileMatchFilter

Selain itu, perbedaan berikut memengaruhi filter Bigtable:

  • 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 mewarisi dari org.apache.hadoop.hbase.filter.Filter.
  • Batas ukuran untuk ekspresi filter adalah 20 KB. 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 melakukan konversi 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 metode di antarmuka org.apache.hadoop.hbase.client.Admin yang tidak tersedia di Bigtable, atau yang berperilaku berbeda di Bigtable dibandingkan dengan yang ada di HBase. Daftar ini tidak lengkap, dan mungkin tidak mencerminkan metode HBase API yang baru ditambahkan.

Sebagian besar metode ini tidak diperlukan di Bigtable, karena tugas pengelolaan ditangani secara otomatis. Beberapa metode tidak tersedia karena metode tersebut terkait dengan fitur yang tidak didukung Bigtable.

Tugas pemeliharaan umum

Bigtable menangani sebagian besar tugas pemeliharaan secara otomatis. Akibatnya, metode berikut tidak tersedia:

  • abort(String why, Throwable e)
  • balancer()
  • enableCatalogJanitor(boolean enable)
  • getMasterInfoPort()
  • getOperationTimeout()
  • isCatalogJanitorEnabled()
  • rollWALWriter(ServerName serverName)
  • runCatalogScan()
  • setBalancerRunning(boolean on, boolean synchronous)
  • shutdown()
  • stopMaster()
  • updateConfiguration()
  • updateConfiguration(ServerName serverName)

Grup lokalitas

Bigtable tidak mengizinkan Anda menentukan grup lokalitas untuk jenis kolom. Akibatnya, Anda tidak dapat memanggil metode HBase yang menampilkan grup lokalitas.

Namespace

Bigtable tidak menggunakan namespace. Anda dapat menggunakan awalan kunci baris untuk menyimulasikan namespace. Metode berikut tidak tersedia:

  • createNamespace(NamespaceDescriptor descriptor)
  • deleteNamespace(String name)
  • getNamespaceDescriptor(String name)
  • listNamespaceDescriptors()
  • listTableDescriptorsByNamespace(String name)
  • listTableNamesByNamespace(String name)
  • modifyNamespace(NamespaceDescriptor descriptor)

Pengelolaan wilayah

Bigtable menggunakan tablet, yang serupa dengan region. Bigtable mengelola tablet Anda secara otomatis. Akibatnya, metode berikut tidak tersedia:

  • assign(byte[] regionName)
  • closeRegion(byte[] regionname, String serverName)
  • closeRegion(ServerName sn, HRegionInfo hri)
  • closeRegion(String regionname, String serverName)
  • closeRegionWithEncodedRegionName(String encodedRegionName, String serverName)
  • compactRegion(byte[] regionName)
  • compactRegion(byte[] regionName, byte[] columnFamily)
  • compactRegionServer(ServerName sn, boolean major)
  • flushRegion(byte[] regionName)
  • getAlterStatus(byte[] tableName)
  • getAlterStatus(TableName tableName)
  • getCompactionStateForRegion(byte[] regionName)
  • getOnlineRegions(ServerName sn)
  • majorCompactRegion(byte[] regionName)
  • majorCompactRegion(byte[] regionName, byte[] columnFamily)
  • mergeRegions(byte[] encodedNameOfRegionA, byte[] encodedNameOfRegionB, boolean forcible)
  • move(byte[] encodedRegionName, byte[] destServerName)
  • offline(byte[] regionName)
  • splitRegion(byte[] regionName)
  • splitRegion(byte[] regionName, byte[] splitPoint)
  • stopRegionServer(String hostnamePort)
  • unassign(byte[] regionName, boolean force)

Snapshot

Metode berikut tidak tersedia.

  • deleteSnapshots(Pattern pattern)
  • deleteSnapshots(String regex)
  • isSnapshotFinished(HBaseProtos.SnapshotDescription snapshot)
  • restoreSnapshot(byte[] snapshotName)
  • restoreSnapshot(String snapshotName)
  • restoreSnapshot(byte[] snapshotName, boolean takeFailSafeSnapshot)
  • restoreSnapshot(String snapshotName, boolean takeFailSafeSnapshot)
  • snapshot(HBaseProtos.SnapshotDescription snapshot)

Pengelolaan meja

Tugas seperti pemadatan tabel ditangani secara otomatis. Akibatnya, metode berikut tidak tersedia:

  • compact(TableName tableName)
  • compact(TableName tableName, byte[] columnFamily)
  • flush(TableName tableName)
  • getCompactionState(TableName tableName)
  • majorCompact(TableName tableName)
  • majorCompact(TableName tableName, byte[] columnFamily)
  • modifyTable(TableName tableName, HTableDescriptor htd)
  • split(TableName tableName)
  • split(TableName tableName, byte[] splitPoint)

Koprosesor

Bigtable tidak mendukung koprosesor. Oleh karena itu, metode berikut tidak tersedia:

  • coprocessorService()
  • coprocessorService(ServerName serverName)
  • getMasterCoprocessors()

Prosedur terdistribusi

Bigtable tidak mendukung prosedur terdistribusi. Akibatnya, metode berikut tidak tersedia:

  • execProcedure(String signature, String instance, Map<String, String> props)
  • execProcedureWithRet(String signature, String instance, Map<String, String> props)
  • isProcedureFinished(String signature, String instance, Map<String, String> props)