将数据从 HBase 迁移到 Cloud Bigtable

本文介绍了将数据从 Apache HBase 集群迁移到 Google Cloud 上的 Cloud Bigtable 集群的注意事项和流程。

在开始迁移之前,您应该考虑性能影响、Bigtable 架构设计、身份验证和授权方法的影响以及 Bigtable 功能集。

性能影响

在典型工作负载下,Bigtable 的性能具有高度可预测性。如需了解详情,请参阅了解 Bigtable 性能

Bigtable 架构设计

设计 Bigtable 架构与设计关系型数据库的架构不同。在设计架构之前,请查看设计架构中列出的概念。

此外,您还必须将架构保持在建议的大小限制之内。 建议将单行保持在 100 MB 以内,单个值保持在 10 MB 以内。在某些情况下,您可能需要存储较大的值,但这会影响性能,因为提取这些值需要时间和内存。请根据具体情况评估这些场景。

身份验证和授权

在为 Bigtable 设计访问权限控制之前,请查看现有的 HBase 身份验证和授权流程。

Bigtable 使用 Google Cloud 的标准身份验证机制和 Identity and Access Management 来提供访问权限控制,因此您可以将 HBase 上的现有授权转换为 IAM。您可以将为 HBase 提供访问权限控制机制的现有 Hadoop 组映射到不同的服务帐号。

通过 Bigtable,您可以在项目级层、实例级层和表级层控制访问权限。如需了解详情,请参阅访问权限控制

将 HBase 迁移到 Bigtable

要将数据从 HBase 迁移到 Bigtable,可以将数据导出为一系列 Hadoop 序列文件。这是 HBase 使用的文件格式,由二进制键值对组成。

要将 HBase 表迁移到 Bigtable,请按照下列步骤操作:

  1. 从 HBase 收集详细信息。
  2. 将 HBase 表导出为序列文件。
  3. 将序列文件移动到 Cloud Storage。
  4. 使用 Dataflow 将序列文件导入 Bigtable。
  5. 验证移动是否成功。

规划迁移:从 HBase 收集详细信息

要准备迁移,请从现有 HBase 集群中收集以下信息,因为您将使用此信息来构建目标表。

  • 表列表
  • 行数
  • 单元格数
  • 列族详细信息(包括生存时间、最大版本数)

在源表上收集这些详细信息的一种简单方法是使用以下脚本,该脚本将结果保留在 HDFS 上:

#!/usr/bin/env bash
# Table Name is the Source HBase Table Name
TABLENAME="$1"
# Export Directory will be located on HDFS
EXPORTDIR="$2"
hadoop fs -mkdir -p ${EXPORTDIR}
hbase shell << EOQ
describe ${TABLENAME}
EOQ | hadoop fs -put - ${EXPORTDIR}/${TABLENAME}-schema.json
hbase shell << EOQ
get_splits ${TABLENAME}
EOQ | hadoop fs -put - ${EXPORTDIR}/${TABLENAME}-splits.txt

将 HBase 表导出到 Cloud Storage

了解要迁移的 HBase 表的基本信息后,需要将表导出为序列文件并将其移动到 Cloud Storage。在迁移任何在线数据之前,请执行以下步骤以确保您的集群满足访问 Google Cloud 的前提条件:

  • 安装 Cloud Storage 连接器

    如果要使用 distcp 迁移在线数据,则必须安装和配置 Cloud Storage 连接器。首先,确定用于管理要迁移的数据的 HDFS 文件系统。接下来,确定 Hadoop 集群中有权访问此文件系统的客户端节点。最后,在客户端节点上安装连接器。如需了解详细安装步骤,请参阅安装 Cloud Storage 连接器

  • 安装 Cloud SDK

    要使用 distcpgsutil 迁移数据,请在将要启动迁移的 Hadoop 集群客户端节点上安装 Cloud SDK。如需了解详细安装步骤,请参阅 Cloud SDK 文档

将 HBase 表导出到 HDFS

接下来,将要迁移的 HBase 表导出到 Hadoop 集群中的某个位置。假设您的 HBase 表的名称为 [MY_NEW_TABLE],并且目标目录位于 HDFS 中的用户目录下,则请使用以下命令将 HBase 表导出为序列文件:

TABLENAME="my-new-table"
EXPORTDIR=/usr/[USERNAME]/hbase-${TABLENAME}-export
hadoop fs -mkdir -p ${EXPORTDIR}
MAXVERSIONS=2147483647
bin/hbase org.apache.hadoop.hbase.mapreduce.Export \
    -Dmapred.output.compress=true \
    -Dmapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec \
    -Dhbase.client.scanner.caching=100 \
    -Dmapred.map.tasks.speculative.execution=false \
    -Dmapred.reduce.tasks.speculative.execution=false \
    ${TABLENAME} ${EXPORTDIR} ${MAXVERSIONS}

将序列文件从 HDFS 迁移到 Cloud Storage

下一步是将序列文件移动到 Cloud Storage 存储分区。根据数据大小、文件数、数据来源和可用带宽,您可以在 Transfer Appliance、distcpgsutil 或 Storage Transfer Service 中选择合适的方案将序列文件移动到 Cloud Storage。

使用 Transfer Appliance

在以下情况下使用 Transfer Appliance 迁移数据:

  • 您希望按预定计划控制传出带宽。
  • 数据大小超过 20 TB。

使用此方案,您无需购买或预配额外的 Google 网络。端到端传输时间(Appliance 装载时间、补充数据等)平均为 100 Mbps。

要使用 Transfer Appliance 移动数据,请将序列文件复制到 Transfer Appliance,然后将 Appliance 装运回 Google。Google 会将数据加载到 Google Cloud 上。如需了解详情,请参阅此 Transfer Appliance 文档

使用 distcp

在以下情况下使用 distcp 迁移数据:

  • 超过 100 Mbps 的带宽可用于迁移。
  • 可以在源 Hadoop 环境中安装 Cloud Storage 连接器和 Cloud SDK。
  • 可以管理新的 Hadoop 作业以执行数据迁移。
  • 数据大小小于 20 TB。

要使用 distcp 移动数据,请使用配置了 Cloud Storage 连接器的 Hadoop 集群客户端节点提交 MapReduce 作业,以将序列文件复制到 Cloud Storage:

hadoop distcp hdfs://[NAMENODE]:[NAMENODE_PORT]/[SOURCE_DIRECTORY] \
gs://[BUCKET]/DESTINATION_DIRECTORY]

使用 gsutil

在以下情况下使用 gsutil 迁移数据:

  • 超过 100 Mbps 的带宽可用于迁移。
  • 可以在源 Hadoop 环境中安装 Cloud SDK。
  • 不接受管理新的 Hadoop 作业以执行数据迁移。
  • 数据大小小于 10 TB。

要使用 gsutil 移动数据,请使用 Hadoop 集群客户端节点启动数据迁移:

TABLENAME="my-new-table"
EXPORTDIR=/usr/[USERNAME]/hbase-${TABLENAME}-export
gsutil -m cp -r  ${EXPORTDIR} gs://[BUCKET]

使用 Storage Transfer Service

在以下情况下使用 Storage Transfer Service 迁移数据:

  • 您的数据源为 Amazon S3 存储分区、HTTP/HTTPS 位置或 Cloud Storage 存储分区。
  • 数据大小小于 10 TB。

Storage Transfer Service 为您提供了多个选项,以便您更轻松地在数据源和数据接收器之间传输和同步数据。例如,您可以执行以下操作:

  • 安排一次性传输操作或周期性传输操作。
  • 如果目标存储分区中的现有对象在来源中没有对应的对象,将目标存储分区中的现有对象删除。
  • 在传输完成后删除源对象。
  • 指定基于文件创建日期的高级过滤条件、文件名过滤条件以及您希望导入数据的时段,安排从数据源到接收器的定期同步。

如需了解详情,请参阅 Storage Transfer Service 文档。

创建目标表

下一步是在 Bigtable 中创建目标表。

首先,使用 gcloud 命令行工具安装 Bigtable 客户端工具 cbt

gcloud components update
gcloud components install cbt

接下来,您将在 Bigtable 中创建一个表,其中包含您之前发现操作中的合适列族。

使用现有拆分,在创建目标表时对其进行预拆分。这将提高批量加载性能。

例如,如果您发现现有拆分如下:

'15861', '29374', '38173', '180922', '203294', '335846', '641111', '746477', '807307', '871053', '931689', '1729462', '1952670', '4356485', '4943705', '5968738', '6917370', '8993145', '10624362', '11309714', '12056747', '12772074', '14370672', '16583264', '18835454', '21194008', '22021148', '23702800', '25532516', '55555555'

请为您的用户帐号设置 cbt 工具的默认项目和 Bigtable 实例,如下所示:

$ cat > ${HOME}/.cbtrc << EOF
project = [YOUR-GCP-PROJECT]
instance = [BIGTABLE-INSTANCE-NAME]
EOF

在目标表中创建以下拆分:

cbt -instance my-instance createtable my-new-table \
splits=15861,29374,38173,180922,203294,335846,641111,746477,807307,871053,931689,\
1729462,1952670,4356485,4943705,5968738,6917370,8993145,10624362,11309714,\
12056747,12772074,14370672,16583264,18835454,21194008,22021148,23702800,\
5532516,55555555

在目标表中创建列族以匹配之前发现的列族。 例如,如果您发现有两个列族,cf1cf2,请在 Bigtable 上创建列族 cf1,如下所示:

cbt createfamily my-new-table cf1

然后创建列族 cf2,如下所示:

cbt createfamily my-new-table cf2

创建列族之后,必须要更新每个列族的垃圾回收政策,包括该列族中值的最长存在时间和最大版本数。即使您为 HBase 表使用 HBase 的默认设置,也必须这样做,因为 Bigtable 的原生工具使用与 HBase 不同的默认设置。

cbt setgcpolicy [TABLE] [FAMILY] ( maxage=[D]| maxversions=[N] )

使用 Dataflow 将 HBase 数据导入 Bigtable

如需详细了解如何将数据导入 Bigtable,请参阅 Bigtable 文档中的导入和导出数据

请记住以下提示:

  • 要提高数据加载的性能,请务必设置 maxNumWorkers。此值有助于确保导入作业具有足够的计算能力,能够在合理的时间内完成导入,同时避免 Bigtable 集群过载。

  • 在导入期间,您应监控 Bigtable 集群的 CPU 使用情况。 如需详细了解此主题,请参阅 Bigtable 监控文档的 CPU 使用情况部分。如果 Bigtable 集群的 CPU 利用率过高,则可能需要添加更多节点。集群最多可能需要 20 分钟即可完成此操作,从而降低利用率,提高性能。

如需详细了解如何监控 Bigtable 实例,请参阅监控 Bigtable 实例

验证 Bigtable 中的导入数据

要验证导入的数据,您可以使用以下几种不同的检查方法:

  • 检查行数匹配。 Dataflow 作业将报告总行数。此值需要与源 HBase 表的行数匹配。
  • 使用特定行查询进行抽查。您可以从源表中选取一组特定的行键,并在目标表上查询这些行键,以确保它们匹配:
cbt lookup [destination-table] [rowkey1]
cbt lookup [destination-table] [rowkey2]

后续步骤