从 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 集群,接下来几个部分将对此进行详细介绍。

  1. 停止向 HBase 发送写入
  2. 在 Bigtable 中创建目标表。
  3. 获取 HBase 快照并将其导入 Bigtable
  4. 验证导入的数据。
  5. 更新应用以向 Bigtable 发送读取和写入操作

映像

准备工作

  1. 安装 Google Cloud CLI 或使用 Cloud Shell

  2. 创建 Cloud Storage 存储桶以存储验证输出数据。在计划运行 Dataproc 作业的位置创建存储桶。

  3. 确定要迁移的 Hadoop 集群。您必须在与 HBase 集群的 Namenode 和 Datanode 建立网络连接的 Dataproc 1.x 集群上运行作业。记下迁移集群所需的 HBase 集群的 ZooKeeper Quorum 地址Namenode URI

  4. 在与源 HBase 集群相同的网络中创建 Dataproc 集群 1.x 版。您可以使用此集群来运行导入和验证作业。

  5. 创建 Bigtable 实例以存储新表。 Bigtable 实例中至少还必须有一个集群与 Dataproc 集群位于同一区域。示例:us-central1

  6. 获取 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,请执行以下操作:

    1. 转到代码库。
    2. 点击浏览以查看代码库文件。
    3. 点击最新的版本号。
    4. 找到 JAR with dependencies file(通常位于顶部)。
    5. 右键点击并复制网址,或点击以下载该文件。
  7. 获取 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,请执行以下操作:

    1. 转到代码库。
    2. 点击最新的版本号。
    3. 点击下载内容
    4. 将鼠标悬停在 shaded-byo-hadoop.jar 上。
    5. 右键点击并复制网址,或点击以下载该文件。
  8. 设置以下环境变量:

    #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
  9. (可选)如需确认变量已正确设置,请运行 printenv 命令以查看所有环境变量。

停止向 HBase 发送写入

在截取 HBase 表的快照之前,停止向 HBase 集群发送写入数据。

在 Bigtable 中创建目标表

下一步是在 Bigtable 实例中为要迁移的每个 HBase 表创建一个目标表。使用对实例具有 bigtable.tables.create 权限的账号。

本指南使用 Bigtable Schema Translation 工具,该工具会自动为您创建表。但是,如果您不希望 Bigtable 架构与 HBase 架构完全匹配,可以使用 cbt CLI 或 Google Cloud 控制台创建表

Bigtable 架构转换工具可捕获 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 的每个表完成以下步骤。

  1. 运行以下命令:

    echo "snapshot 'HBASE_TABLE_NAME', 'HBASE_SNAPSHOT_NAME'" | hbase shell -n
    

    替换以下内容:

    • HBASE_TABLE_NAME:要迁移到 Bigtable 的 HBase 表的名称。
    • HBASE_SNAPSHOT_NAME:新快照的唯一名称
  2. 通过运行以下命令导入快照:

    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 的哈希值,从而完成验证。

  1. 如需创建用于验证的哈希值,请针对要迁移的每个表运行以下命令:

    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 表的名称。

  2. 在命令 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 cellDifferent values。如需启用调试模式,请配置 --properties mapreduce.map.log.level=DEBUG。执行作业后,使用 Cloud Logging 并搜索表达式 jsonPayload.class="org.apache.hadoop.hbase.mapreduce.SyncTable" 来查看离散的单元。

您可以重新尝试导入作业,或使用 SyncTable 通过设置 dryrun=false 来同步源表和目标表。在继续操作之前,请先查看 HBase SyncTable 和其他配置选项。

Cloud Logging 中的 SyncTable 结果

更新应用以向 Bigtable 发送读取和写入操作

验证集群中每个表的数据后,您可以配置应用以将所有流量路由到 Bigtable,然后弃用 HBase 集群。

迁移完成后,您可以删除快照。

后续步骤