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 中,发送到单元格的写入请求不会受之前发送到同一单元格的删除请求的影响。
获取和扫描
- 借助反向扫描,您可以反向读取一系列行。如需了解详情,请参阅反向扫描。
- 与 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)