从 Google Cloud 上的 HBase 迁移
本页介绍从 Google Cloud 服务(例如 Dataproc 或 Compute Engine)上托管的 Apache HBase 集群迁移到 Bigtable的注意事项和流程。
如需了解如何从外部 Apache HBase 环境迁移到 Bigtable,请参阅将数据从 HBase 迁移到 Bigtable。如需了解在线迁移,请参阅从 HBase 复制到 Bigtable。
为何要从 Google Cloud 上的 HBase 迁移到 Bigtable
选择此迁移路径的原因包括:
- 您可以保留客户端应用的当前部署位置,仅更改连接配置。
- 您的数据仍保留在 Google Cloud 生态系统中。
- 如果您愿意,可以继续使用 HBase API。Java 版 Cloud Bigtable HBase 客户端是 Java 版 Apache HBase 库的完全受支持扩展程序。
- 您希望使用代管式服务来存储数据的优势。
注意事项
本部分针对您在开始迁移之前应注意并考虑的一些事项提出建议。
Bigtable 架构设计
在大多数情况下,您可以在 Bigtable 中使用与 HBase 中相同的架构设计。如果您想要更改架构或用例发生变化,请在迁移数据之前先查看设计架构中列出的一些概念。
准备和测试
在迁移数据之前,请务必了解 HBase 和 Bigtable 之间的差异。您应该花一些时间来了解如何配置连接以将应用连接到 Bigtable。此外,您可能希望在迁移之前执行系统和功能测试以验证应用或服务。
迁移步骤
如需将数据从 HBase 迁移到 Bigtable,请截取 HBase 快照,并将数据直接从 HBase 集群导入 Bigtable。这些步骤适用于单个 HBase 集群,接下来几个部分将对此进行详细介绍。
准备工作
创建 Cloud Storage 存储桶以存储验证输出数据。在计划运行 Dataproc 作业的位置创建存储桶。
确定要迁移的 Hadoop 集群。您必须在与 HBase 集群的 Namenode 和 Datanode 建立网络连接的 Dataproc 1.x 集群上运行作业。记下迁移集群所需的 HBase 集群的 ZooKeeper Quorum 地址和 Namenode URI。
在与源 HBase 集群相同的网络中创建 Dataproc 集群 1.x 版。您可以使用此集群来运行导入和验证作业。
创建 Bigtable 实例以存储新表。 Bigtable 实例中至少还必须有一个集群与 Dataproc 集群位于同一区域。示例:
us-central1
获取 Schema Translation 工具:
wget BIGTABLE_HBASE_TOOLS_URL
将
BIGTABLE_HBASE_TOOLS_URL
替换为该工具的 Maven 代码库中可用的最新JAR with dependencies
的网址。文件名类似于https://repo1.maven.org/maven2/com/google/cloud/bigtable/bigtable-hbase-1.x-tools/2.6.0/bigtable-hbase-1.x-tools-2.6.0-jar-with-dependencies.jar
。如需查找网址或手动下载 JAR,请执行以下操作:
- 转到代码库。
- 点击浏览以查看代码库文件。
- 点击最新的版本号。
- 找到
JAR with dependencies file
(通常位于顶部)。 - 右键点击并复制网址,或点击以下载该文件。
获取 MapReduce 工具,用于导入和验证作业:
wget BIGTABLE_MAPREDUCE_URL
将
BIGTABLE_MAPREDUCE_URL
替换为该工具的 Maven 代码库中可用的最新shaded-byo JAR
的网址。文件名类似于https://repo1.maven.org/maven2/com/google/cloud/bigtable/bigtable-hbase-1.x-mapreduce/2.6.0/bigtable-hbase-1.x-mapreduce-2.6.0-shaded-byo-hadoop.jar
。如需查找网址或手动下载 JAR,请执行以下操作:
- 转到代码库。
- 点击最新的版本号。
- 点击下载内容。
- 将鼠标悬停在 shaded-byo-hadoop.jar 上。
- 右键点击并复制网址,或点击以下载该文件。
设置以下环境变量:
#Google Cloud export PROJECT_ID=PROJECT_ID export REGION=REGION ##Cloud Bigtable export BIGTABLE_INSTANCE_ID=BIGTABLE_INSTANCE_ID ##Dataproc export DATAPROC_CLUSTER_ID=DATAPROC_CLUSTER_NAME #Cloud Storage export BUCKET_NAME="gs://BUCKET_NAME" export STORAGE_DIRECTORY="$BUCKET_NAME/hbase-migration" #HBase export ZOOKEEPER_QUORUM=ZOOKEPER_QUORUM export ZOOKEEPER_PORT=2181 export ZOOKEEPER_QUORUM_AND_PORT="$ZOOKEEPER_QUORUM:$ZOOKEEPER_PORT" export MIGRATION_SOURCE_NAMENODE_URI=MIGRATION_SOURCE_NAMENODE_URI export MIGRATION_SOURCE_TMP_DIRECTORY=${MIGRATION_SOURCE_NAMENODE_URI}/tmp export MIGRATION_SOURCE_DIRECTORY=${MIGRATION_SOURCE_NAMENODE_URI}/hbase #JAR files export TRANSLATE_JAR=TRANSLATE_JAR export MAPREDUCE_JAR=MAPREDUCE_JAR
将占位符替换为迁移的值。
Google Cloud:
PROJECT_ID
:Bigtable 实例所在的 Google Cloud 项目REGION
:包含将运行导入和验证作业的 Dataproc 集群所在的区域。
Bigtable:
BIGTABLE_INSTANCE_ID
:要向其中导入数据的 Bigtable 实例的标识符
Dataproc:
DATAPROC_CLUSTER_ID
:将运行导入和验证作业的 Dataproc 集群的 ID
Cloud Storage:
BUCKET_NAME
:您存储快照的 Cloud Storage 存储桶的名称
HBase:
ZOOKEEPER_QUORUM
:该工具将连接的 ZooKeeper 主机,格式为host1.myownpersonaldomain.com
MIGRATION_SOURCE_NAMENODE_URI
:HBase 集群的 Namenode 的 URI,格式为hdfs://host1.myownpersonaldomain.com:8020
JAR 文件
TRANSLATE_JAR
:您从 Maven 下载的bigtable hbase tools
JAR 文件的名称和版本号。该值应该类似于bigtable-hbase-1.x-tools-2.6.0-jar-with-dependencies.jar
。MAPREDUCE_JAR
:您从 Maven 下载的bigtable hbase mapreduce
JAR 文件的名称和版本号。该值应该类似于bigtable-hbase-1.x-mapreduce-2.6.0-shaded-byo-hadoop.jar
。
(可选)如需确认变量已正确设置,请运行
printenv
命令以查看所有环境变量。
停止向 HBase 发送写入
在截取 HBase 表的快照之前,停止向 HBase 集群发送写入数据。
在 Bigtable 中创建目标表
下一步是在 Bigtable 实例中为要迁移的每个 HBase 表创建一个目标表。使用对实例具有 bigtable.tables.create
权限的账号。
本指南使用 Bigtable Schema Translation 工具,该工具会自动为您创建表。但是,如果您不希望 Bigtable 架构与 HBase 架构完全匹配,可以使用 cbt
CLI 或 Google Cloud 控制台创建表。
Bigtable Schema Translation 工具可捕获 HBase 表的架构,包括表名称、列族、垃圾回收政策和分块。然后,它在 Bigtable 中创建一个类似的表。
对于要导入的每个表,请运行以下命令,将架构从 HBase 复制到 Bigtable。
java \
-Dgoogle.bigtable.project.id=$PROJECT_ID \
-Dgoogle.bigtable.instance.id=$BIGTABLE_INSTANCE_ID \
-Dgoogle.bigtable.table.filter=TABLE_NAME \
-Dhbase.zookeeper.quorum=$ZOOKEEPER_QUORUM \
-Dhbase.zookeeper.property.clientPort=$ZOOKEEPER_PORT \
-jar $TRANSLATE_JAR
将 TABLE_NAME
替换为您要导入的 HBase 表的名称。Schema Translation 工具会为新的 Bigtable 表使用此名称。
您还可以视情况将 TABLE_NAME
替换为正则表达式,例如“.*”,这样会捕获要创建的所有表,然后仅运行一次该命令。
截取 HBase 表快照并将其导入 Bigtable
对您计划迁移到 Bigtable 的每个表完成以下步骤。
运行以下命令:
echo "snapshot 'HBASE_TABLE_NAME', 'HBASE_SNAPSHOT_NAME'" | hbase shell -n
替换以下内容:
HBASE_TABLE_NAME
:要迁移到 Bigtable 的 HBase 表的名称。HBASE_SNAPSHOT_NAME
:新快照的唯一名称
通过运行以下命令导入快照:
gcloud dataproc jobs submit hadoop \ --cluster $DATAPROC_CLUSTER_ID \ --region $REGION \ --project $PROJECT_ID \ --jar $MAPREDUCE_JAR \ -- \ import-snapshot \ -Dgoogle.bigtable.project.id=$PROJECT_ID \ -Dgoogle.bigtable.instance.id=$BIGTABLE_INSTANCE_ID \ HBASE_SNAPSHOT_NAME \ $MIGRATION_SOURCE_DIRECTORY \ BIGTABLE_TABLE_NAME \ $MIGRATION_SOURCE_TMP_DIRECTORY
替换以下内容:
HBASE_SNAPSHOT_NAME
:您为要导入的表的快照分配的名称BIGTABLE_TABLE_NAME
:要向其中导入数据的 Bigtable 表的名称
运行该命令后,该工具会在源集群上恢复 HBase 快照,然后导入该快照。恢复快照的过程可能需要几分钟时间才能完成,具体取决于快照的大小。
导入数据时,您还可以使用以下选项:
为缓冲更改器请求设置基于客户端的超时(默认为 600000ms)。请参阅以下示例:
-Dgoogle.bigtable.rpc.use.timeouts=true -Dgoogle.bigtable.mutate.rpc.timeout.ms=600000
考虑基于延迟时间的限制,这样可以减少导入批处理作业对其他工作负载的影响。您应针对迁移用例测试限制。请参阅以下示例:
-Dgoogle.bigtable.buffered.mutator.throttling.enable=true -Dgoogle.bigtable.buffered.mutator.throttling.threshold.ms=100
修改读取单个 HBase 区域的映射任务数量(每个区域默认为 2 个映射任务)。请参阅以下示例:
-Dgoogle.bigtable.import.snapshot.splits.per.region=3
将其他 MapReduce 配置设置为属性。请参阅以下示例:
-Dmapreduce.map.maxattempts=4 -Dmapreduce.map.speculative=false -Dhbase.snapshot.thread.pool.max=20
导入时请谨记以下提示:
- 要提高数据加载的性能,请确保有足够的 Dataproc 集群工作器来并行运行映射导入任务。默认情况下,n1-standard-8 Dataproc 工作器将运行八个导入任务。拥有足够的工作器可确保导入作业具有足够的计算能力,能够在合理的时间内完成导入,同时避免 Bigtable 实例过载。
- 如果您未将 Bigtable 实例用于其他工作负载,请将 Bigtable 实例中的节点数乘以 3,然后除以 8(使用 n1-standard-8 dataproc 工作器)。将结果用作 Dataproc 工作器的数量。
- 如果您在导入 HBase 数据的同时将该实例用于其他工作负载,请降低 Dataproc 工作器的值或增加 Bigtable 节点的数量以满足工作负载要求。
- 在导入期间,您应监控 Bigtable 实例的 CPU 使用情况。如果 Bigtable 实例的 CPU 利用率过高,则可能需要添加更多节点。添加节点可以立即提高 CPU 利用率,但在添加节点后,集群最多可能需要 20 分钟才能达到最佳性能。
如需详细了解如何监控 Bigtable 实例,请参阅监控 Bigtable 实例。
验证 Bigtable 中导入的数据
接下来,通过对源表和目标表之间执行哈希比较来验证数据迁移,以确保所迁移数据的完整性。首先,运行 hash-table
作业以生成源表行范围的哈希值。然后,运行 sync-table
作业以根据源表计算和匹配 Bigtable 的哈希值,从而完成验证。
如需创建用于验证的哈希值,请针对要迁移的每个表运行以下命令:
gcloud dataproc jobs submit hadoop \ --project $PROJECT_ID \ --cluster $DATAPROC_CLUSTER_ID \ --region $REGION \ --jar $MAPREDUCE_JAR \ -- \ hash-table \ -Dhbase.zookeeper.quorum=$ZOOKEEPER_QUORUM_AND_PORT \ HBASE_TABLE_NAME \ $STORAGE_DIRECTORY/HBASE_TABLE_NAME/hash-output/
将
HBASE_TABLE_NAME
替换为您为其创建了快照的 HBase 表的名称。在命令 shell 中运行以下命令:
gcloud dataproc jobs submit hadoop \ --project $PROJECT_ID \ --cluster $DATAPROC_CLUSTER_ID \ --region $REGION \ --jar $MAPREDUCE_JAR \ -- \ sync-table \ --sourcezkcluster=$ZOOKEEPER_QUORUM_AND_PORT:/hbase \ --targetbigtableproject=$PROJECT_ID \ --targetbigtableinstance=$BIGTABLE_INSTANCE_ID \ $STORAGE_DIRECTORY/HBASE_TABLE_NAME/hash-output/ \ HBASE_TABLE_NAME \ BIGTABLE_TABLE_NAME
替换以下内容:
HBASE_TABLE_NAME
:要从中导入的 HBase 表的名称BIGTABLE_TABLE_NAME
:要向其中导入数据的 Bigtable 表的名称
您可以根据需要在命令中添加 --dryrun=false
,在源和目标之间实现同步,以便分离哈希范围。
sync-table
作业完成后,作业的计数器将显示在执行作业的 Google Cloud 控制台中。如果导入作业成功导入所有数据,则 HASHES_MATCHED
的值和 HASHES_NOT_MATCHED
的值为 0。
如果 HASHES_NOT_MATCHED
显示值,则您可以在调试模式下重新运行 sync-table
,以发出差异范围和单元格级别的详细信息,例如 Source missing cell
Target missing cell
或 Different values
。如需启用调试模式,请配置 --properties mapreduce.map.log.level=DEBUG
。执行作业后,使用 Cloud Logging 并搜索表达式 jsonPayload.class="org.apache.hadoop.hbase.mapreduce.SyncTable"
来查看离散的单元。
您可以重新尝试导入作业,或使用 SyncTable 通过设置 dryrun=false
来同步源表和目标表。在继续操作之前,请先查看 HBase SyncTable 和其他配置选项。
更新应用以向 Bigtable 发送读取和写入操作
验证集群中每个表的数据后,您可以配置应用以将所有流量路由到 Bigtable,然后弃用 HBase 集群。
迁移完成后,您可以删除快照。