使用 HBase 快照 - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 HBase 快照

HBase 使用内置的snapshot功能创建表的轻量级备份。在 EMR 群集中,可使用 EMRFS 将这些备份导出到 Amazon S3。您可以使用 HBase 外壳在主节点上创建快照。本主题说明如何使用 Shell 或通过将 command-runner.jar 与 Amazon CLI 或 Amazon SDK for Java 结合使用的步骤以交互方式运行这些命令。有关其他类型 HBase 备份的更多信息,请参阅HBase 备份在 HBase 文档中。

使用表创建快照

hbase snapshot create -n snapshotName -t tableName

从 Amazon CLI 使用 command-runner.jar:

aws emr add-steps --cluster-id j-2AXXXXXXGAPLF \ --steps Name="HBase Shell Step",Jar="command-runner.jar",\ Args=[ "hbase", "snapshot", "create","-n","snapshotName","-t","tableName"]

Amazon SDK for Java

HadoopJarStepConfig hbaseSnapshotConf = new HadoopJarStepConfig() .withJar("command-runner.jar") .withArgs("hbase","snapshot","create","-n","snapshotName","-t","tableName");
注意

如果快照名称不唯一,则创建操作将失败,返回代码为-1或者255但是你可能看不到一条错误消息,说明出了什么问题。要使用相同的快照名称,请删除它,然后重新创建它。

删除快照

hbase shell >> delete_snapshot 'snapshotName'

查看快照信息

hbase snapshot info -snapshot snapshotName

将快照导出到 Amazon S3

重要

如果您不指定-mappers值时,HBase 会使用任意计算来确定映射器的数量。此值可能非常大,具体取决于表大小,这会在导出过程中对正在运行的作业产生负面影响。为此,我们建议您指定-mappers参数,-bandwidth参数(指定每秒使用的带宽 (以 MB 为单位)),或同时同时限制导出操作使用的群集资源。或者,您可以在低使用率期间运行导出快照操作。

hbase snapshot export -snapshot snapshotName \ -copy-to s3://bucketName/folder -mappers 2

从 Amazon CLI 使用 command-runner.jar

aws emr add-steps --cluster-id j-2AXXXXXXGAPLF \ --steps Name="HBase Shell Step",Jar="command-runner.jar",\ Args=[ "hbase", "snapshot", "export","-snapshot","snapshotName","-copy-to","s3://bucketName/folder","-mappers","2","-bandwidth","50"]

Amazon SDK for Java:

HadoopJarStepConfig hbaseImportSnapshotConf = new HadoopJarStepConfig() .withJar("command-runner.jar") .withArgs("hbase","snapshot","export", "-snapshot","snapshotName","-copy-to", "s3://bucketName/folder", "-mappers","2","-bandwidth","50");

从 Amazon S3 导入快照

虽然这是一个导入,但这里使用的 HBase 选项仍然是export

sudo -u hbase hbase snapshot export \ -D hbase.rootdir=s3://bucketName/folder \ -snapshot snapshotName \ -copy-to hdfs://masterPublicDNSName:8020/user/hbase \ -mappers 2

从 Amazon CLI 使用 command-runner.jar

aws emr add-steps --cluster-id j-2AXXXXXXGAPLF \ --steps Name="HBase Shell Step",Jar="command-runner.jar", \ Args=["sudo","-u","hbase","hbase snapshot export","-snapshot","snapshotName", \ "-D","hbase.rootdir=s3://bucketName/folder", \ "-copy-to","hdfs://masterPublicDNSName:8020/user/hbase","-mappers","2","-chmod","700"]

Amazon SDK for Java:

HadoopJarStepConfig hbaseImportSnapshotConf = new HadoopJarStepConfig() .withJar("command-runner.jar") .withArgs("sudo","-u","hbase","hbase","snapshot","export", "-D","hbase.rootdir=s3://path/to/snapshot", "-snapshot","snapshotName","-copy-to", "hdfs://masterPublicDNSName:8020/user/hbase", "-mappers","2","-chuser","hbase");

从 HBase 外壳程序中的快照恢复表

hbase shell >> disable tableName >> restore_snapshot snapshotName >> enable tableName

HBase 目前不支持在 HBase 外壳中找到的所有快照命令。例如,没有用于还原快照的 HBase 命令行选项,因此您必须在 shell 中还原快照。这意味着command-runner.jar必须运行 Bash 命令。

注意

因为这里使用的命令是echo,您的 Shell 命令可能仍将失败,即使 Amazon EMR 运行的命令返回0退出代码。如果选择将 shell 命令作为步骤运行,请检查步骤日志。

echo 'disable tableName; \ restore_snapshot snapshotName; \ enable tableName' | hbase shell

以下是使用 Amazon CLI 的步骤。首先,创建以下snapshot.jsonfile:

[ { "Name": "restore", "Args": ["bash", "-c", "echo $'disable \"tableName\"; restore_snapshot \"snapshotName\"; enable \"tableName\"' | hbase shell"], "Jar": "command-runner.jar", "ActionOnFailure": "CONTINUE", "Type": "CUSTOM_JAR" } ]
aws emr add-steps --cluster-id j-2AXXXXXXGAPLF \ --steps file://./snapshot.json

Amazon SDK for Java:

HadoopJarStepConfig hbaseRestoreSnapshotConf = new HadoopJarStepConfig() .withJar("command-runner.jar") .withArgs("bash","-c","echo $'disable \"tableName\"; restore_snapshot \"snapshotName\"; enable \"snapshotName\"' | hbase shell");