Perbedaan antara HBase dan Bigtable

Salah satu cara untuk mengakses Bigtable adalah menggunakan klien Apache HBase versi khusus untuk Java. Secara umum, klien yang disesuaikan mengekspos API yang sama seperti penginstalan standar HBase. Halaman ini menjelaskan perbedaan antara klien HBase Cloud Bigtable untuk Java dan penginstalan HBase standar. Banyak 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 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 mewajibkan 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 untuk mengikuti pola ini.

Baris dan sel

  • Anda tidak dapat menentukan ACL untuk setiap baris.
  • Anda tidak dapat menetapkan visibilitas setiap sel.
  • 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 atomik untuk pembaca dan penulis. Pembaca tidak akan pernah dapat membaca operasi Append yang diterapkan sebagian.
  • Menghapus versi tertentu dari kolom tertentu berdasarkan stempel waktunya didukung, tetapi menghapus semua nilai dengan stempel waktu tertentu dalam keluarga atau baris kolom tertentu tidak didukung. Metode berikut di 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 menyembunyikan operasi put, tetapi Bigtable tidak menyembunyikan operasi put setelah penghapusan saat permintaan put dikirim setelah permintaan penghapusan. Artinya, di Bigtable, permintaan tulis yang dikirim ke kolom tidak terpengaruh oleh permintaan penghapusan yang dikirim sebelumnya ke kolom yang sama.

Mendapatkan dan memindai

Koprosesor

Coprocessor 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 operator selain EQUAL digunakan, hanya satu keluarga kolom yang didukung.
  4. Hanya mendukung pembanding berikut:
    • BinaryComparator
    • RegexStringComparator tanpa tanda (tanda akan diabaikan) dan operator EQUAL
  5. Jika PageFilter berada dalam FilterList, PageFilter hanya akan berfungsi mirip dengan HBase saat FilterList ditetapkan ke MUST_PASS_ALL, yang merupakan perilaku default. Jika FilterList ditetapkan ke MUST_PASS_ONE, Bigtable akan memperlakukan PageFilter sebagai MUST_PASS_ALL dan hanya menampilkan sejumlah baris yang sesuai dengan pageSize PageFilter.
  6. 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 yang tersirat dan sebagai gantinya melakukan pemindaian tanpa filter dari baris awal ke baris akhir. Dalam hal ini, gunakan PrefixFilter dengan BigtableExtendedScan atau kombinasi filter untuk mengoptimalkan performa.
  7. Bergantung pada 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.
  • Ekspresi filter memiliki batas ukuran 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 yang 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 yang dibalik 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 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 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 grup 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 region

Bigtable menggunakan tablet, yang mirip dengan region. Bigtable mengelola tablet Anda secara otomatis. Oleh karena itu, 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 tabel

Tugas seperti pemadatan tabel ditangani secara otomatis. Oleh karena itu, 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. Akibatnya, metode berikut tidak tersedia:

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

Prosedur terdistribusi

Bigtable tidak mendukung prosedur terdistribusi. Oleh karena itu, 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)