作者: Dalei Xu、Zhiyong Su 和 Shijian Tang
日期: 2024 年 10 月 23 日
领域: ,,
Apache HBase 是一个开源非关系分布式数据库系统,作为 Apache 软件基金会 Hadoop 项目的一部分进行开发。HBase 可以运行在 [Hadoop 分布式文件系统 (HDFS)](https://hadoop.apache.org/docs/stable/hadoop-project- dist/hadoop-hdfs/HdfsDesign.html) 或 上,能够承载拥有数十亿行和数百万列的非常大的数据表。
HBase 的一些典型用例包括:
对于现有的 HBase 集群(包括基于开源 HBase 自建或由其他云服务提供商提供的 HBase),我们推荐使用 HBase快照和复制技术进行数据迁移,这样可以在无需显著停机时间的情况下完成迁移。
这篇博客介绍了一系列基于实际客户案例的典型 HBase 迁移解决方案和最佳实践。此外,我们还深入探讨了在迁移过程中面临的一些关键挑战,例如:
HBase 快照允许您在对区域服务器影响较小的情况下,拍摄表的快照,不需要大量的数据复制。将快照导出到另一个集群也不会对区域服务器产生太大影响。
HBase 复制是 HBase集群之间数据复制的方式。它允许您保持一个集群与另一个集群的状态同步,利用源集群的日志来传播变更。它可以作为灾难恢复解决方案,也能提高架构的可用性。
要实施 HBase 迁移,您必须满足以下先决条件:
EMR_DefaultRole 和 EMR_EC2_DefaultRole)。请参考 以获取指导,或者在终端或 中运行以下 API 来创建默认角色:aws emr create-default-roles
在本例中,我们将演示一个典型的迁移解决方案,即从源 HBase(Cluster A)到目标 Amazon EMR HBase(ClusterB)的迁移。以下图示展示了解决方案架构。

以下是根据上面的图示,我们将沿着 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 |
接下来我们将详细说明这些步骤的具体操作。
在将快照从源 HBase 集群导出到 Amazon EMR HBase 集群时,必须修改源集群上的以下设置,以确保数据传输的性能和稳定性。
| 配置分类 | 配置项目 | 建议值 | 备注 |
|---|---|---|---|
| core-site | fs.s3.awsAccessKeyId | 您的 AWS 访问密钥 ID | 快照导出需要相对较长的时间。如果没有访问密钥和秘密密钥,快照导出到 Amazon S3 将会出现诸如 com.amazon.aws.emr.hadoop.fs.shaded.com.amazonaws.SdkClientException: 无法从任何提供程序加载 AWS 凭据的错误。 |
| core-site | fs.s3.awsSecretAccessKey | 您的 AWS 秘密访问密钥 | |
| yarn-site | yarn.nodemanager.resource.memory-mb | 单核节点 RAM 的一半 | 可分配给容器的物理内存量,单位为 MB。 |
| yarn-site | yarn.scheduler.maximum-allocation-mb | 单核节点 RAM 的一半 | ResourceManager 中每个容器请求的最大分配量,单位为 MB。因为快照导出是在 YARN Map Reduce 任务中运行的,因此,需要为 YARN 分配足够的内存以确保传输速度。 |
这些值的设置会根据集群资源、工作负载和表数据量进行调整。如果可以使用 Web UI,您也可以通过标准的配置 XML 文件进行修改。完成更改后,请重新启动 HBase 服务。
使用以下推荐设置来启动 EMR 集群:
| 配置分类 | 配置项目 | 建议值 | 备注 |
|---|---|---|---|
| yarn-site | yarn.nodemanager.resource.memory-mb | 单核节点 RAM 的 20% | 可分配给容器的物理内存量,单位为 MB。 |
| yarn-site | yarn.scheduler.maximum-allocation-mb | 单核节点 RAM 的 20% | ResourceManager 中每个容器请求的最大分配量,单位为 MB。由于快照恢复是在 HBase 中运行的,因此需要为 YARN 分配少量内存,并留出足够的内存供 HBase 使用,以确保恢复操作顺利进行。 |
| hbase-env.export | HBASE_MASTER_OPTS | 单核节点 RAM 的 70% | 为主 HBase 设置 Java 堆大小。 |
| hbase-env.export | HBASE_REGIONSERVER_OPTS | 单核节点 RAM 的 70% | 为 HBase 区域服务器设置 Java 堆大小。 |
| hbase | hbase.emr.storageMode | S3 | 指示 HBase 使用 S3 存储数据。 |
| hbase-site | hbase.rootdir | <Your-HBase-Folder-on-S3> | 您在 S3 上的 HBase 数据文件夹。 |
有关详细信息,请参阅 。 另外,每种 Amazon EC2 实例类型的 Amazon EMR 默认 YARN 配置可在 中找到。
在我们的示例中,配置如图所示。
删除)
接下来,我们配置源 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