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

使用 HBase 快照

HBase 使用内置快照功能创建表的轻量级备份。在 EMR 集群中,可使用 EMRFS 将这些备份导出到 Amazon S3。您可以使用 HBase shell 在主节点上创建快照。本主题说明如何使用 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

command-runner.jar 使用 Amazon CLI:

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

command-runner.jar 使用 Amazon CLI:

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 shell 中的快照恢复表

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

HBase 目前不支持 HBase shell 中找到的所有快照命令。例如,没有用于还原快照的 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.json 文件:

[ { "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");