将 Apache HBase 群集迁移到 HDInsight 5.1

本文介绍如何将 Azure HDInsight 上的 Apache HBase 群集更新为新版本。

仅当你为源群集和目标群集使用相同的 Microsoft Azure 存储帐户时,本文才适用。 若要使用新存储帐户或其他存储帐户为目标群集升级,请参阅使用新存储帐户将 Apache HBase 迁移到 HDInsight 5.1

升级时的故障时间可能超过 20 分钟。 产生此故障时间是因为要执行步骤来刷新所有内存中数据并等待所有过程完成,在新群集上配置和重启服务也会耗费时间。 最终时间因节点数目、数据量和其他变数而异。

检查 Apache HBase 兼容性

在升级 Apache HBase 之前,请确保源群集和目标群集上的 HBase 版本兼容。 查看 HBase 参考指南中的 HBase 版本兼容性对照表和发行说明,以确保应用程序与新版本兼容。

下面是一个示例兼容性对照表。 Y 表示兼容,N 表示可能不兼容

兼容性类型 主版本 次版本 修补程序
客户端-服务器网络兼容性 N Y Y
服务器-服务器兼容性 N Y Y
文件格式兼容性 N Y Y
客户端 API 兼容性 N Y Y
客户端二进制文件兼容性 N N Y
服务器端受限的 API 兼容性
Stable N Y Y
不断变化 N N Y
不稳定 N N N
依赖项兼容性 N Y Y
操作兼容性 N N Y

有关 HDInsight 版本和兼容性的详细信息,请参阅 Azure HDInsight 版本

Apache HBase 群集迁移概述

若要升级 Azure HDInsight 上的 Apache HBase 群集,请完成以下基本步骤。 有关详细说明,请参阅详细步骤和命令,或使用“使用脚本迁移 HBase,实现自动迁移”部分中的脚本。

准备源群集:

  1. 停止数据引入。
  2. 检查群集运行状况
  3. 如需要,请停止复制
  4. 刷新 memstore 数据。
  5. 停止 HBase。
  6. 对于具有加速写入的群集,请备份“Write Ahead Log (WAL)”目录。

准备目标群集:

  1. 创建目标群集。
  2. 从 Ambari 停止 HBase。
  3. 在 HDFS 服务配置中更新 fs.defaultFS 以引用原始源群集容器。
  4. 对于具有加速写入的群集,在 HBase 服务配置中更新 hbase.rootdir 以引用原始源群集容器。
  5. 清理 Zookeeper 数据。

完成迁移:

  1. 清理并迁移 WAL。
  2. 将应用程序从目标群集的默认容器复制到原始源容器。
  3. 从 Ambari 目标群集启动所有服务。
  4. 验证 HBase。
  5. 删除源群集。

详细的迁移步骤和命令

使用这些详细步骤和命令迁移 Apache HBase 群集。

准备源群集

  1. 停止引入到源 HBase 群集。

  2. 检查 Hbase hbck 以验证群集运行状况

    1. 验证 HBase UI 上的 HBCK 报告页。 正常的群集不会表现出任何不一致情况 屏幕截图显示了如何验证 HBCK 报告。
    2. 如果存在任何不一致,请使用 hbase hbck2 修复不一致问题
  3. 记下源群集联机区域中的区域数,以便在迁移后可以在目标群集中引用该数字。 显示区域总数的屏幕截图。

  4. 如果群集上启用了复制,请在迁移后停止复制并重新启用目标群集上的复制。 有关详细信息,请参阅 Hbase 复制指南

  5. 刷新要升级的源 HBase 群集。

    HBase 将传入的数据写入名为“memstore”的内存中存储。 memstore 达到特定的大小后,HBase 会将其刷新到群集存储帐户中用作长期存储的磁盘中。 如果在升级后删除源群集,则还会删除 memstore 中的所有数据。 若要保留数据,请在升级前将每个表的 memstore 手动刷新到磁盘。

    可通过从 Azure hbase-utils GitHub 存储库运行 flush_all_tables.sh 脚本来刷新 memstore 数据。

    还可以通过从 HDInsight 群集运行以下 HBase shell 命令来刷新 memstore 数据:

    hbase shell
    flush "<table-name>"
    
  6. 等待 15 分钟并验证所有过程是否已完成,masterProcWal 文件没有任何待处理的过程。

    1. 验证“过程”页以确认没有待处理的过程。

      屏幕截图显示了如何验证主流程。

  7. 停止 HBase

    1. 使用 https://<OLDCLUSTERNAME>.azurehdinsight.cn 在源群集上登录到 Apache Ambari

    2. 为 HBase 打开维护模式。

    3. 仅先停止 HBase Master。 首先停止备用主节点,最后停止活动的 HBase 主节点。

      屏幕截图显示了如何停止主服务。

    4. 停止 HBase 服务,它会停止剩余的服务器。

    注意

    HBase 2.4.11 不支持某些旧过程。

    有关连接和使用 Ambari 的详细信息,请参阅使用 Ambari Web UI 管理 HDInsight 群集

    在前面的步骤中停止 HBase,以避免创建新的主 proc WAL。

  8. 如果源 HBase 群集没有加速写入功能,请跳过此步骤。 对于具有加速写入的源 HBase 群集,从源群集的任何 Zookeeper 节点或工作器节点上的 SSH 会话运行以下命令,从而备份 HDFS 下的 WAL 目录。

    hdfs dfs -mkdir /hbase-wal-backup
    hdfs dfs -cp hdfs://mycluster/hbasewal /hbase-wal-backup
    

准备目标群集

  1. 在 Microsoft Azure 门户中,使用与源群集相同的存储帐户 设置新的目标 HDInsight 群集,但使用不同的容器名称:

  2. 在新群集 (https://<NEWCLUSTERNAME>.azurehdinsight.cn) 上登录 Apache Ambari,然后停止 HBase 服务。

  3. 在“Services(服务)”>“HDFS”>“Configs(配置)”>“Advanced(高级)”>“Advanced core-site(高级核心站点)”下,将 fs.defaultFS HDFS 设置更改为指向原始源群集容器名称。 例如,以下屏幕截图中的设置应更改为 wasbs://hbase-upgrade-old-2021-03-22

    屏幕截图显示了在 Ambari 中选择“服务”>“HDFS”>“配置”>“高级”>“高级核心站点”,然后更改容器名称。

  4. 如果目标群集具有加速写入功能,请更改 hbase.rootdir 路径以指向原始源群集容器名称。 例如,以下路径应更改为 hbase-upgrade-old-2021-03-22。 如果群集没有加速写入,请跳过此步骤。

    屏幕截图显示了在 Ambari 中更改 HBase rootdir 的容器名称。

  5. 在任何 Zookeeper 节点或工作器节点中运行以下命令,从而清除目标群集上的 Zookeeper 数据:

    hbase zkcli
    rmr /hbase-unsecure
    quit
    

清理并迁移 WAL

根据源 HDInsight 版本以及源和目标群集是否具有加速写入,运行以下命令。

  1. 目标群集始终为 HDInsight 版本 4.0,因为 HDInsight 3.6 采用的是基本支持,不建议用于新群集。
  2. HDFS 复制命令为 hdfs dfs <copy properties starting with -D> -cp <source> <destination> # Serial execution

注意

  • 存储类型 WASB 的 <source-container-fullpath>wasbs://<source-container-name>@<storageaccountname>.blob.core.chinacloudapi.cn
  • 存储类型 Azure Data Lake Storage Gen2 的 <source-container-fullpath>abfs://<source-container-name>@<storageaccountname>.dfs.core.chinacloudapi.cn

源群集是具有加速写入的 HDInsight 4.0,目标群集具有加速写入

清理目标群集的 WAL FS 数据,并将 WAL 目录从源群集复制到目标群集的 HDFS 中。 通过在任何 Zookeeper 节点或工作器节点中运行以下命令来复制目录:

sudo -u hbase hdfs dfs -rm -r hdfs://mycluster/hbasewal
sudo -u hbase hdfs dfs -cp <source-container-fullpath>/hbase-wal-backup/hbasewal hdfs://mycluster/

源群集是不具有加速写入的 HDInsight 4.0,目标群集具有加速写入

清理目标群集的 WAL FS 数据,并将 WAL 目录从源群集复制到目标群集的 HDFS 中。 通过在任何 Zookeeper 节点或工作器节点中运行以下命令来复制目录:

sudo -u hbase hdfs dfs -rm -r hdfs://mycluster/hbasewal
sudo -u hbase hdfs dfs -cp <source-container-fullpath>/hbase-wals/* hdfs://mycluster/hbasewal

源群集是不具有加速写入的 HDInsight 4.0,目标群集不具有加速写入

清理目标群集的 WAL FS 数据,并将源群集的 WAL 目录复制到目标群集的 HDFS 中。 通过在任何 Zookeeper 节点或工作器节点中运行以下命令来复制该目录:

sudo -u hbase hdfs dfs -rm -r /hbase-wals/*
sudo -u hbase hdfs dfs -Dfs.azure.page.blob.dir="/hbase-wals" -cp <source-container-fullpath>/hbase-wals /

完成迁移

  1. 使用 sudo -u hdfs 用户上下文,将文件夹 /hdp/apps/<new-version-name> 及其内容从 <destination-container-fullpath> 复制到 <source-container-fullpath> 下的 /hdp/apps 文件夹。 可以通过在目标群集上运行以下命令来复制文件夹:

    sudo -u hdfs hdfs dfs -cp /hdp/apps/<hdi-version> <source-container-fullpath>/hdp/apps
    

    例如:

    sudo -u hdfs hdfs dfs -cp /hdp/apps/4.1.3.6 wasbs://hbase-upgrade-old-2021-03-22@hbaseupgrade.blob.core.chinacloudapi.cn/hdp/apps
    
  2. 在目标群集上保存更改,然后重启 Ambari 指示的所有所需服务。

  3. 将应用程序指向目标群集。

    注意

    升级时,应用程序的静态 DNS 名称会更改。 请勿硬编码此 DNS 名称,可以在域名的 DNS 设置中配置一个指向群集名称的 CNAME。 另一种做法是使用应用程序的、无需重新部署即可更新的配置文件。

  4. 开始引入。

  5. 验证 HBase 一致性以及简单数据定义语言 (DDL) 和数据操作语言 (DML) 操作。

  6. 如果目标群集没有问题,请删除源群集。

使用脚本迁移 HBase

  1. 记下源群集联机区域中的区域数,以便在迁移后可以在目标群集中引用该数字。 屏幕截图显示了区域计数。

  2. 刷新要升级的源 HBase 群集。

    HBase 将传入的数据写入名为“memstore”的内存中存储。 memstore 达到特定的大小后,HBase 会将其刷新到群集存储帐户中用作长期存储的磁盘中。 如果在升级后删除源群集,则还会删除 memstore 中的所有数据。 若要保留数据,请在升级前将每个表的 memstore 手动刷新到磁盘。

    可通过从 Azure hbase-utils GitHub 存储库运行 flush_all_tables.sh 脚本来刷新 memstore 数据。

    还可以通过从 HDInsight 群集运行以下 HBase shell 命令来刷新 memstore 数据:

    hbase shell
    flush "<table-name>"
    
  3. 等待 15 分钟并验证所有过程是否已完成,masterProcWal 文件没有任何待处理的过程。

    1. 验证“过程”页以确认没有待处理的过程。

      屏幕截图显示了如何验证主流程。

  4. 在源群集上执行脚本 migrate-to-HDI5.1-hbase-source.sh,在目标群集上执行 migrate-hbase-dest.sh。 使用以下说明执行这些脚本。

    注意

    这些脚本不会在迁移过程中复制 HBase 的旧 WAL;因此,不会在启用了 HBase 备份或复制功能的群集上使用脚本。

  5. 在源群集上

    sudo bash migrate-to-HDI5.1-hbase-source.sh 
    
  6. 在目标群集上

    sudo bash migrate-hbase-dest.sh  -f <src_default_Fs>
    

上述命令的必需参数:

   -f, --src-fs
   The fs.defaultFS of the source cluster
   For example:
   -f wasb://anynamehbase0316encoder-2021-03-17t01-07-55-935z@anynamehbase0hdistorage.blob.core.chinacloudapi.cn

疑难解答

用例 1:

如果 Hbase 主节点和区域服务器均已启动,而区域停滞在转换状态,或者只分配了一个区域,即 hbase:meta 区域。 等待其他区域分配

解决方案

  1. 通过 ssh 连接到原始群集的任何 ZooKeeper 节点,如果这是 ESP 群集,请运行 kinit -k -t /etc/security/keytabs/hbase.service.keytab hbase/<zk FQDN>

  2. 运行 echo "scan 'hbase:meta'" | hbase shell > meta.outhbase:meta 读取到文件中

  3. 运行 grep "info:sn" meta.out | awk '{print $4}' | sort | uniq 获取旧群集中存在区域的所有 RS 实例名称。 输出应该类似于 value=<wn FQDN>,16020,........

  4. 创建具有该 wn 值的虚拟 WAL dir

    如果群集为加速写入的群集

    hdfs dfs -mkdir hdfs://mycluster/hbasewal/WALs/<wn FQDN>,16020,.........
    

    如果群集为非加速写入的群集

    hdfs dfs -mkdir /hbase-wals/WALs/<wn FQDN>,16020,.........
    
  5. 重启活动的 Hmaster

后续步骤

若要详细了解 Apache HBase 以及如何升级 HDInsight 群集,请参阅以下文章: