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 中,傳送至儲存格的寫入要求,不會受到先前傳送至相同儲存格的刪除要求影響。

獲取及掃描

輔助處理器

不支援輔助處理器。您無法建立實作 org.apache.hadoop.hbase.coprocessor 介面的類別。

篩選器

下表列出支援的篩選器。這些篩選器都包含在 org.apache.hadoop.hbase.filter 套件中。

支援 有限地支援 不支援
  1. 僅支援單一資料欄系列。
  2. 系統不支援撥打 setLenAsVal(true)
  3. 僅支援 BinaryComparator 比較子。如果使用 EQUAL 以外的任何運算子,系統只會支援單欄系列。
  4. 僅支援下列比較子:
    • BinaryComparator
    • RegexStringComparator 沒有標記 (系統會忽略標記) 以及 EQUAL 運算子
  5. 如果 PageFilterFilterList 之中,當 FilterList 設定為 MUST_PASS_ALL (預設) 時,PageFilter 僅會如同 HBase 般運作。如果將 FilterList 設為 MUST_PASS_ONE,Bigtable 會將 PageFilter 視為 MUST_PASS_ALL,且只會傳回與 PageFilter 頁面大小相符的資料列數量。
  6. 在大多數情況下,PrefixFilter 會掃描 PrefixFilter 中的資料列。不過,如果 PrefixFilter 屬於 FilterList 的一部分且有運算子 MUST_PASS_ONE,Bigtable 則無法判斷默示範圍,而會改為執行從開始資料列到停止資料列的未篩選掃描。將 PrefixFilterBigtableExtendedScan 搭配使用或使用篩選器組合,以在這種情況下發揮最大效能。
  7. 依賴 Bigtable 條件篩選器,這可能會很慢。支援,但不建議使用。
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

此外,下列差異會影響 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)