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 operasiAppend
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
- Pemindaian terbalik memungkinkan Anda membaca rentang baris secara terbalik. Untuk mengetahui detailnya, lihat Pemindaian mundur.
- Tidak seperti HBase, saat Anda mengirim permintaan baca, Bigtable tidak otomatis memfilter data yang sudah tidak berlaku yang ditandai untuk dihapus dalam siklus pembersihan sampah mendatang. Untuk menghindari pembacaan data yang telah habis masa berlakunya, gunakan filter dalam permintaan baca. Untuk mengetahui informasi selengkapnya, lihat Ringkasan pembersihan sampah memori.
- Membuat kueri versi keluarga 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 keluarga kolom tidak didukung. Anda
tidak dapat memanggil metode
org.apache.hadoop.hbase.client.Scan#setMaxResultsPerColumnFamily(int limit)
. - Menetapkan jumlah maksimum sel 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
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 |
---|---|---|
|
||
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
. - 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)