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 operasiAppend
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
- Pemindaian terbalik memungkinkan Anda membaca rentang baris secara mundur. Untuk mengetahui detailnya, lihat Pemindaian terbalik.
- Membuat kueri versi grup kolom dalam rentang stempel waktu tidak
didukung. Anda tidak dapat memanggil metode berikut:
org.apache.hadoop.hbase.client.Query#setColumnFamilyTimeRange(byte[] cf, long minStamp, long maxStamp)
org.apache.hadoop.hbase.client.Get#setColumnFamilyTimeRange(byte[] cf, long minStamp, long maxStamp)
org.apache.hadoop.hbase.client.Scan#setColumnFamilyTimeRange(byte[] cf, long minStamp, long maxStamp)
- Membatasi jumlah nilai per baris per grup kolom tidak didukung. Anda
tidak dapat memanggil metode
org.apache.hadoop.hbase.client.Scan#setMaxResultsPerColumnFamily(int limit)
. - Menetapkan jumlah sel maksimum yang akan ditampilkan untuk setiap panggilan ke
next()
tidak didukung. Panggilan ke metodeorg.apache.hadoop.hbase.client.Scan#setBatch(int batch)
akan diabaikan. - Menyetel jumlah baris untuk penyimpanan dalam cache tidak didukung. Panggilan ke metode
org.apache.hadoop.hbase.client.Scan#setCaching(int caching)
akan diabaikan.
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 |
---|---|---|
|
||
ColumnPrefixFilter FamilyFilter FilterList FuzzyRowFilter MultipleColumnPrefixFilter MultiRowRangeFilter PrefixFilter 6RandomRowFilter TimestampsFilter
|
ColumnCountGetFilter 1ColumnPaginationFilter 1ColumnRangeFilter 1FirstKeyOnlyFilter 1KeyOnlyFilter 2PageFilter 5QualifierFilter 3RowFilter 1, 4SingleColumnValueExcludeFilter 1, 4, 7SingleColumnValueFilter 4, 7ValueFilter 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)