Apache HBase 在线迁移到 Amazon EMR 大数据博客

从 Apache HBase 在线迁移到 Amazon EMR

作者: Dalei Xu、Zhiyong Su 和 Shijian Tang
日期: 2024 年 10 月 23 日
领域: ,,

要点摘要

  • Apache HBase 是一种开源的、非关系分布式数据库,适用于高频交易,以及电商等领域。
  • Amazon EMR 5.2.0 及之后版本中,可以选择将 HBase 运行在 Amazon S3 上。
  • 建议使用 HBase 快照和复制技术,以实现低宕机时间的迁移。

HBase 的发布模式推荐

Apache HBase 是一个开源非关系分布式数据库系统,作为 Apache 软件基金会 Hadoop 项目的一部分进行开发。HBase 可以运行在 [Hadoop 分布式文件系统 (HDFS)](https://hadoop.apache.org/docs/stable/hadoop-project- dist/hadoop-hdfs/HdfsDesign.html) 或 上,能够承载拥有数十亿行和数百万列的非常大的数据表。

HBase 的一些典型用例包括:

  • 在电商场景中,根据产品 ID 快速检索详细的产品信息。
  • 在安全评估与欺诈检测中,用户的评估维度各异,HBase 的非关系架构和灵活的列扩展能力能够满足复杂需求。
  • 在高频实时交易平台中,HBase 支持高并发的读写,提升生产力和商业灵活性。

推荐的 HBase 迁移方式

对于现有的 HBase 集群(包括基于开源 HBase 自建或由其他云服务提供商提供的 HBase),我们推荐使用 HBase快照和复制技术进行数据迁移,这样可以在无需显著停机时间的情况下完成迁移。

这篇博客介绍了一系列基于实际客户案例的典型 HBase 迁移解决方案和最佳实践。此外,我们还深入探讨了在迁移过程中面临的一些关键挑战,例如:

  • 使用 HBase 快照实现初步迁移,并利用 HBase 复制进行实时数据挪移。
  • 其他云平台上提供的 HBase 不支持快照。
  • 单个数据表的规模过大,如超过 50 TB。
  • 使用 BucketCache 提高迁移后的读性能。

HBase 快照允许您在对区域服务器影响较小的情况下,拍摄表的快照,不需要大量的数据复制。将快照导出到另一个集群也不会对区域服务器产生太大影响。

HBase 复制是 HBase集群之间数据复制的方式。它允许您保持一个集群与另一个集群的状态同步,利用源集群的日志来传播变更。它可以作为灾难恢复解决方案,也能提高架构的可用性。

先决条件

要实施 HBase 迁移,您必须满足以下先决条件:

  • 拥有一个 AWS 账户以访问 AWS 服务。
  • 生成用于 SSH 连接到 Amazon EMR 主节点的密钥对。有关说明,请参考 。
  • 配置 Amazon EMR 默认角色(EMR_DefaultRoleEMR_EC2_DefaultRole)。请参考 以获取指导,或者在终端或 中运行以下 API 来创建默认角色:
    aws emr create-default-roles
    
  • 自建 HBase,作为源 HBase 集群及其相关资源,例如 或其他云服务商提供的资源。
  • 使用 在源 HBase 集群中构建一个演示数据集。

解决方案概要

在本例中,我们将演示一个典型的迁移解决方案,即从源 HBase(Cluster A)到目标 Amazon EMR HBase(ClusterB)的迁移。以下图示展示了解决方案架构。

![解决方案架构](https://d2908q01vomqb2.cloudfront.net/b6692ea5df920cad691c20319a6fffd7a4a766b8/2024/10/07/BDB-4000-arch- 删除)

以下是根据上面的图示,我们将沿着 HBase 迁移过程推荐的操作步骤。

步骤活动描述预计时间
1配置 Cluster A(源 HBase)修改源 HBase 集群的配置,为后续快照导出做准备少于 5 分钟
2创建 Cluster B(Amazon EMR HBase 在 S3 上)创建一个 EMR 集群,并将 HBase 运行在 Amazon S3 上作为迁移目标集群少于 10 分钟
3配置复制配置源 HBase 集群到 Amazon EMR HBase 的复制,但不启动少于 1 分钟
4暂停服务暂停源 HBase 集群的服务少于 1 分钟
5创建快照为源 HBase 集群的每个表创建快照少于 5 分钟
6恢复服务恢复源 HBase 集群的服务少于 1 分钟
7快照导出与恢复使用快照将数据从源 HBase 集群迁移到 Amazon EMR HBase 集群视表数据量大小而定
8启动复制启动从源 HBase 集群到 Amazon EMR HBase 的复制并同步增量数据视快照导出恢复期间积累的数据量而定
9测试与验证测试并验证 Amazon EMR HBase

接下来我们将详细说明这些步骤的具体操作。

1. 配置 Cluster A(源 HBase)

在将快照从源 HBase 集群导出到 Amazon EMR HBase 集群时,必须修改源集群上的以下设置,以确保数据传输的性能和稳定性。

配置分类配置项目建议值备注
core-sitefs.s3.awsAccessKeyId您的 AWS 访问密钥 ID快照导出需要相对较长的时间。如果没有访问密钥和秘密密钥,快照导出到 Amazon S3 将会出现诸如 com.amazon.aws.emr.hadoop.fs.shaded.com.amazonaws.SdkClientException: 无法从任何提供程序加载 AWS 凭据的错误。
core-sitefs.s3.awsSecretAccessKey您的 AWS 秘密访问密钥
yarn-siteyarn.nodemanager.resource.memory-mb单核节点 RAM 的一半可分配给容器的物理内存量,单位为 MB。
yarn-siteyarn.scheduler.maximum-allocation-mb单核节点 RAM 的一半ResourceManager 中每个容器请求的最大分配量,单位为 MB。因为快照导出是在 YARN Map Reduce 任务中运行的,因此,需要为 YARN 分配足够的内存以确保传输速度。

这些值的设置会根据集群资源、工作负载和表数据量进行调整。如果可以使用 Web UI,您也可以通过标准的配置 XML 文件进行修改。完成更改后,请重新启动 HBase 服务。

2. 创建 Cluster B(EMR HBase 在 S3 上)

使用以下推荐设置来启动 EMR 集群:

配置分类配置项目建议值备注
yarn-siteyarn.nodemanager.resource.memory-mb单核节点 RAM 的 20%可分配给容器的物理内存量,单位为 MB。
yarn-siteyarn.scheduler.maximum-allocation-mb单核节点 RAM 的 20%ResourceManager 中每个容器请求的最大分配量,单位为 MB。由于快照恢复是在 HBase 中运行的,因此需要为 YARN 分配少量内存,并留出足够的内存供 HBase 使用,以确保恢复操作顺利进行。
hbase-env.exportHBASE_MASTER_OPTS单核节点 RAM 的 70%为主 HBase 设置 Java 堆大小。
hbase-env.exportHBASE_REGIONSERVER_OPTS单核节点 RAM 的 70%为 HBase 区域服务器设置 Java 堆大小。
hbasehbase.emr.storageModeS3指示 HBase 使用 S3 存储数据。
hbase-sitehbase.rootdir<Your-HBase-Folder-on-S3>您在 S3 上的 HBase 数据文件夹。

有关详细信息,请参阅 。 另外,每种 Amazon EC2 实例类型的 Amazon EMR 默认 YARN 配置可在 中找到。

在我们的示例中,配置如图所示。

删除)

3. 配置复制

接下来,我们配置源 HBase 到 EMR 集群的复制对等体。

操作步骤包括:

  • 创建一个对等体。
  • 由于快照迁移尚未完成,开始时先禁用该对等体。
  • 指定需要进行复制的表。
  • 启用表复制。

以表 usertable 为例,shell 脚本如下:

shell MASTER_IP="<Master-IP>" TABLE_NAME="usertable" cat << EOF | sudo -u hbase hbase shell 2>/dev/null add_peer 'PEER_$TABLE_NAME', CLUSTER_KEY => '$MASTER_IP:2181:/hbase' disable_peer 'PEER_$TABLE_NAME' enable_table_replication '$TABLE_NAME' EOF

结果将类似于以下文本。

shell hbase:001:0> add_peer 'PEER_usertable', CLUSTER_KEY => '<Master- IP>:2181:/hbase' Took 13.4117 seconds hbase:002:0> disable_peer 'PEER_usertable' Took 8.1317 seconds hbase:003:0> enable_table_replication 'usertable' The replication of table 'usertable' successfully enabled Took168.7254 seconds

在本实验中,我们以表 usertable 为例。如果我们有许多表需要配置为复制,可以使用以下代码:


# 获取所有表

TABLE_LIST=$(echo 'list' | sudo -u hbase hbase shell 2>/dev/null | sed -e '1,/TABLE/d' -e '/seconds/,$d' -e '/row/,$d')

# 遍历每个表

for TABLE_NAME in $TABLE_LIST; do # 添加操作 cat << EOF | sudo -u hbase hbase shell 2>/dev/null add_peer 'PEER_$TABLE_NAME', CLUSTER_KEY => '$MASTER_IP:2181:/hbase' disable_peer 'PEER_$TABLE_NAME' enable_table_replication '$TABLE_NAME' EOF done ```

在接下来的步骤中,如果您需要对所有表进行操作,可以参考上述代码示例。

此时,对等体的状态为“禁用”,因此不会启动复制。需要从源到目标 EMR 集群同步的数据将会在源 HBase 集群中积压,而不会同步到 EMR 集群的
HBase。

在 Amazon EMR 集群上完成快照恢复(步骤 7)后,我们可以启用对等体以开始同步数据。

如果源 HBase 版本为 1.x,您必须运行 `set_peer_tableCFs` 函数。请参阅 。

### 4\. 暂停服务

要暂停源 HBase 集群的服务,需要禁用 HBase 表。您可以使用以下脚本:

`shell sudo -u hbase bash /usr/lib/hbase/bin/disable_all_tables.sh2>/dev/null`

结果如图所示。

删除)

禁用所有表后,请检查 HBase UI,以确保没有后台任务在运行,然后停止任何访问源 HBase 的服务。这将需要 5-10 分钟。

HBase UI 如下图所示。

删除)

### 5\. 创建快照

确保源 HBase 中的表已禁用。然后,您可以创建源的快照。此过程需要 1-5 分钟。

以表 `usertable` 为例,shell 脚本如下:

`shell DATE=`date +"%Y%m%d"` TABLE_NAME="usertable" sudo -u hbase hbasesnapshot create -n "${TABLE_NAME/:/_}-$DATE" -t ${TABLE_NAME} 2>/dev/null`

您可以使用以下脚本检查快照:

`shell sudo -u hbase hbase snapshot info -list-snapshots 2>/dev/null`

结果如下图所示。

删除)

### 6\. 恢复服务

在源 HBase 中成功创建快照后,您可以启用表并恢复访问源 HBase 的服务。这些操作需要几分钟,因此在实施过程中(步骤 3 到步骤 6)源 HBase的总数据不可用时间大约为 10 分钟。

启用表的命令如下:

`shell TABLE_NAME="usertable" echo -e "enable '$TABLE_NAME'" | sudo -u hbase hbase shell 2>/dev/null`

结果如图所示。

删除)

此时,您可以继续向源 HBase 写入数据,因为对等体的状态为禁用,因此增量数据不会同步到目标集群。

### 7\. 快照导出与恢复

在源 HBase 中创建快照后,您可以开始将快照导出到目标 EMR 集群的 HBase 数据目录。示例脚本如下:

`shell DATE=`date +"%Y%m%d"` TABLE_NAME="usertable" TARGET_BUCKET="<Your-
HBase-Folder-on-S3>" nohup sudo -u hbase hbase snapshot export -snapshot
${TABLE_NAME/:/_}-$DATE -copy-to $TARGET_BUCKET &> ${TABLE_NAME/:/_}-$DATE-
export.log &`

快照导出所需时间根据数据量从 10 分钟到几小时不等,因此我们将其置于后台运行。您可以使用 yarn application -list命令检查进度,如下图所示。

删除)

例如,如果您使用的是拥有 20 个 r6g.4xlarge 核心节点的 HBase 集群,导出 50 TB 的数据到同一 AWS 区域的 Amazon S3会耗时大约 3 小时。

在源 HBase 完成快照导出后,您可以使用以下脚本在目标 EMR 集群中检查快照:

`shell sudo -u hbase hbase snapshot info -list-snapshots 2>/dev/null`

结果如下图所示。

删除)

确认快照名称,例如 `usertable-20240710`,然后使用以下脚

Leave a Reply

Required fields are marked *