HBase 与 Cloud Bigtable 之间的差异

如需访问 Cloud Bigtable,一种方式是使用 Java 版 Apache HBase 客户端的定制版本。通常,自定义客户端与标准安装的 HBase 客户端会展示相同的 API。本页面介绍 Java 版 Cloud Bigtable HBase 客户端与标准 HBase 安装之间的差异,其中许多差异与 Cloud Bigtable 自动处理的管理任务有关。

列族

在创建列族时,无法使用 HBase shell 或 HBase API 配置块大小或压缩方法。Cloud Bigtable 会为您管理块大小和压缩。

另外,如果您使用 HBase shell 获取表的相关信息,HBase shell 始终会报告每个列族均不使用压缩。实际上,Cloud Bigtable 会为您的所有数据使用专有压缩方法。

行和单元格

  • 您无法为单个行定义 ACL。
  • 您无法设置个别单元格的公开范围。
  • 不支持标记。您无法使用 org.apache.hadoop.hbase.Tag 类来向个别单元格添加元数据。

变更和删除

  • 对于读取者和写入者而言,Cloud 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 中,删除遮盖放置,但在删除请求之后发送放置请求时,Cloud Bigtable 不会遮盖放置。这意味着在 Cloud Bigtable 中,发送到单元格的写入请求不会受之前发送到同一单元格的删除请求的影响。

获取和扫描

协处理器

不支持协处理器。您无法创建实现 org.apache.hadoop.hbase.coprocessor 接口的类。

过滤器

下表显示了当前支持的过滤器。所有这些过滤器均包含在 org.apache.hadoop.hbase.filter 软件包中。

支持 受支持(存在限制) 不支持
  1. 仅支持单个列族。
  2. 不支持调用 setLenAsVal(true)
  3. 仅支持 BinaryComparator 比较器。如果使用 EQUAL 以外的运算符,则仅支持单个列族。
  4. 仅支持以下比较器:
    • BinaryComparator
    • RegexStringComparator,无标志(忽略标志)和 EQUAL 运算
  5. 如果 PageFilter 位于 FilterList 中,那么当 FilterList 设置为 MUST_PASS_ALL 时(默认行为),PageFilter 的运行方式将与 HBase 类似。如果 FilterList 设置为 MUST_PASS_ONE,那么 Cloud Bigtable 会将 PageFilter 视为 MUST_PASS_ALL,且仅返回与 PageFilter 的 pageSize 对应的行数。
  6. 在大多数情况下,PrefixFilter 会扫描 PrefixFilter 中的行。但是,如果 PrefixFilterFilterList 的一部分并且包含 MUST_PASS_ONE 运算符,则 Cloud Bigtable 无法确定隐式范围,而是执行从开始行到停止行的未过滤扫描。在这种情况下,将 PrefixFilterBigtableExtendedScan 搭配使用或使用过滤条件组合可以优化性能。
  7. 依赖 Cloud 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

另外,以下差异会影响 Cloud Bigtable 过滤条件:

时间戳

Cloud Bigtable 存储以微秒为单位的时间戳,而 HBase 存储以毫秒为单位的时间戳。如果您使用适用于 Cloud Bigtable 的 HBase 客户端库,并且您的数据具有反向时间戳,则此区别会产生影响。

客户端库会在微秒和毫秒之间转换,但由于 Cloud Bigtable 可以存储的最大 HBase 时间戳为 Long.MAX_VALUE/1000,因此任何大于该值的值都会转换为 Long.MAX_VALUE/1000。因此,较大的反向时间戳值可能无法正确转换。

管理

本部分介绍 org.apache.hadoop.hbase.client.Admin 接口中的方法,这些方法无法在 Cloud Bigtable 中使用,或者其行为在 Cloud Bigtable 和 HBase 中有所不同。

其中大多数方法在 Cloud Bigtable 中都是不必要的,因为系统会自动处理管理任务。您将无法使用某些方法,因为这些方法与 Cloud Bigtable 不支持的功能相关。

常规维护任务

Cloud 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)

位置组

Cloud Bigtable 不允许您为列族指定位置组。因此,您无法调用返回位置组的 HBase 方法。

命名空间

Cloud Bigtable 不使用命名空间。您可以使用行键前缀来模拟命名空间。以下方法不可用:

  • createNamespace(NamespaceDescriptor descriptor)
  • deleteNamespace(String name)
  • getNamespaceDescriptor(String name)
  • listNamespaceDescriptors()
  • listTableDescriptorsByNamespace(String name)
  • listTableNamesByNamespace(String name)
  • modifyNamespace(NamespaceDescriptor descriptor)

区域管理

Cloud Bigtable 使用片(与区域类似)进行区域管理。Cloud 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)

快照

您目前无法使用以下方法:

  • cloneSnapshot(byte[] snapshotName, TableName tableName)
  • cloneSnapshot(String snapshotName, TableName tableName)
  • deleteSnapshot(byte[] snapshotName)
  • deleteSnapshot(String snapshotName)
  • deleteSnapshots(Pattern pattern)
  • deleteSnapshots(String regex)
  • isSnapshotFinished(HBaseProtos.SnapshotDescription snapshot)
  • listSnapshots()
  • listSnapshots(Pattern pattern)
  • listSnapshots(String regex)
  • restoreSnapshot(byte[] snapshotName)
  • restoreSnapshot(String snapshotName)
  • restoreSnapshot(byte[] snapshotName, boolean takeFailSafeSnapshot)
  • restoreSnapshot(String snapshotName, boolean takeFailSafeSnapshot)
  • snapshot(HBaseProtos.SnapshotDescription snapshot)
  • snapshot(byte[] snapshotName, TableName tableName)
  • snapshot(String snapshotName, TableName tableName)
  • snapshot(String snapshotName, TableName tableName, HBaseProtos.SnapshotDescription.Type type)
  • takeSnapshotAsync(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)

协处理器

Cloud Bigtable 不支持协处理器。因此,您将无法使用以下方法:

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

分布式过程

Cloud 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)