HBase 和 Bigtable 之间的差异

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

列族

在创建列族时,无法使用 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 中,删除遮盖放置,但在删除请求之后发送放置请求时,Bigtable 不会遮盖放置。这意味着在 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,那么 Bigtable 会将 PageFilter 视为 MUST_PASS_ALL,且仅返回与 PageFilter 的 pageSize 对应的行数。
  6. 在大多数情况下,PrefixFilter 会扫描 PrefixFilter 中的行。但是,如果 PrefixFilterFilterList 的一部分并且包含 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)