HBase 和 Bigtable 的差異
其中一種存取 Bigtable 的方式,是使用 Java 適用的 Apache HBase 用戶端的自訂版本。一般而言,自訂用戶端會公開相同的 API 做為 HBase 的標準安裝。本頁說明 Java 適用的 Cloud BigTable HBase 用戶端與標準 HBase 安裝之間的差異,其中許多與 Bigtable 自動處理的管理任務有關。
Java 適用的 Cloud Bigtable HBase 用戶端適用於從 HBase 遷移至 Bigtable,並想繼續使用 HBase API 的客戶。在所有其他情況下,Java 開發人員應改用 Java 適用的 Cloud Bigtable 用戶端,該用戶端會呼叫 Bigtable API。
資料欄系列
無論是使用 HBase shell 或 HBase API,建立資料欄系列時都無法設定區塊大小或壓縮方法。Bigtable 會為您管理區塊大小和壓縮。
此外,如果您使用 HBase shell 取得資料表資訊,HBase shell 一律會回報每個資料欄系列未使用壓縮。事實上,Bigtable 會對所有資料使用專屬的壓縮方法。
Bigtable 規定資料欄系列名稱必須符合 [_a-zA-Z0-9][-_.a-zA-Z0-9]*
這個規則運算式。如果您要將資料從 HBase 匯入 Bigtable,可能需要先變更系列名稱,使其符合這個模式。
資料列與儲存格
- 您無法為單一的資料列定義存取控制清單 (ACL)。
- 您無法設置單一儲存格的瀏覽權限。
- 不支援標記。您無法使用
org.apache.hadoop.hbase.Tag
類別將中繼資料加入個別儲存格。
變異和刪除操作
- 您只能在 Bigtable 中讀取及寫入整個
Append
作業。讀者絕不會讀取部分套用的Append
作業。 - 支援基於其時間戳記刪除特定資料列的特定版本,但是不支援刪除既定之資料欄與資料列中,具特定時間戳記的所有值。系統不支援類別
org.apache.hadoop.hbase.client.Delete
中的下列方法:new Delete(byte[] row, long timestamp)
addColumn(byte[] family, byte[] qualifier)
addFamily(byte[] family, long timestamp)
addFamilyVersion(byte[] family, long timestamp)
- 在 HBase 中,刪除作業會遮蓋 put 作業,但 Bigtable 不會在刪除要求後遮蓋 put 作業 (如果刪除要求後傳送 put 要求)。也就是說,在 Bigtable 中,傳送至儲存格的寫入要求,不會受到先前傳送至相同儲存格的刪除要求影響。
獲取及掃描
- 反向掃描可讓您反向讀取某個範圍內的資料列。詳情請參閱「反向掃描」。
- 與 HBase 不同,當您傳送讀取要求時,Bigtable 不會自動篩除即將在垃圾收集週期中標示為刪除的過期資料。如要避免讀取過期資料,請在讀取要求中使用篩選器。詳情請參閱「垃圾收集總覽」。
- 不支援在時間戳記範圍內查詢資料欄系列的版本。您無法呼叫下列方法:
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)
- 不支援限制每個資料欄系列中每個資料列的值的數量。您無法呼叫
org.apache.hadoop.hbase.client.Scan#setMaxResultsPerColumnFamily(int limit)
方法。 - 系統不支援為每次呼叫
next()
設定傳回的儲存格數量上限。系統會忽略對org.apache.hadoop.hbase.client.Scan#setBatch(int batch)
方法的呼叫。 - 不支援為快取設定資料列的數量。系統會忽略對
org.apache.hadoop.hbase.client.Scan#setCaching(int caching)
方法的呼叫。
輔助處理器
不支援輔助處理器。您無法建立實作 org.apache.hadoop.hbase.coprocessor
介面的類別。
篩選器
下表列出支援的篩選器。這些篩選器都包含在 org.apache.hadoop.hbase.filter
套件中。
支援 | 有限地支援 | 不支援 |
---|---|---|
|
||
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 |
此外,下列差異會影響 Bigtable 篩選器:
- 在使用規則運算式比較子 (
org.apache.hadoop.hbase.filter.RegexStringComparator
) 的篩選器中,規則運算式會使用 RE2 語法,而非 Java 語法。 - 不支援自訂篩選器。您無法建立從
org.apache.hadoop.hbase.filter.Filter
沿用的類別。 - 篩選運算式的大小上限為 20 KB。如要縮減篩選運算式的大小,請使用儲存篩選條件雜湊值的補充資料欄。
時間戳記
Bigtable 儲存的時間戳記以微秒為單位,HBase 則以毫秒為單位。如果您使用 Bigtable 的 HBase 用戶端程式庫,且資料含有反向時間戳記,這項差異就會造成影響。
用戶端程式庫會在微秒和毫秒之間轉換,但由於 Bigtable 可儲存的最大 HBase 時間戳記為 Long.MAX_VALUE/1000,因此任何大於該值的值都會轉換為 Long.MAX_VALUE/1000。因此,系統可能無法正確轉換大型反向時間戳記值。
管理
本節說明 org.apache.hadoop.hbase.client.Admin
介面中無法在 Bigtable 上使用的方法,或是在 Bigtable 上的行為與 HBase 不同的方法。這些清單尚未含括完整內容,且可能未反映最近新增的 HBase API 方法。
這些方法在 Bigtable 上大部分都用不到,因為管理工作會自動執行。由於部分方法與 Bigtable 不支援的功能相關,因此無法使用。
一般維護任務
Bigtable 會自動處理大部分的維護工作。因此,以下的方法不可用:
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)
位置群組
Bigtable 不允許指定資料欄系列的位置群組。因此您無法呼叫傳回位置群組的 HBase 方法。
命名空間
Bigtable 不會使用命名空間。您可以使用資料列索引鍵的前置字串來模擬命名空間。下列方法無法使用:
createNamespace(NamespaceDescriptor descriptor)
deleteNamespace(String name)
getNamespaceDescriptor(String name)
listNamespaceDescriptors()
listTableDescriptorsByNamespace(String name)
listTableNamesByNamespace(String name)
modifyNamespace(NamespaceDescriptor descriptor)
地區管理
Bigtable 使用子表,類似於區域。Bigtable 會自動管理平板電腦。因此,以下的方法不可用:
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)
快照
下列方法不適用。
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)
資料表管理
資料表壓縮的任務為自動化處理。因此,以下的方法不可用:
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)
輔助處理器
Bigtable 不支援協同處理器。因此,以下的方法不可用:
coprocessorService()
coprocessorService(ServerName serverName)
getMasterCoprocessors()
分散式程序
Bigtable 不支援分散式程序。因此,以下的方法不可用:
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)