

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

# 使用 HBase 快照
<a name="emr-hbase-snapshot"></a>

HBase 使用内置[快照](https://hbase.apache.org/book.html#ops.snapshots)功能创建表的轻量级备份。在 EMR 集群中，可使用 EMRFS 将这些备份导出到 Amazon S3。您可以使用 sh HBase ell 在主节点上创建快照。本主题向您展示如何与 shell 交互式运行这些命令，或者通过使用或的步骤来`command-runner.jar`运行这些命令。 AWS CLI 适用于 Java 的 AWS SDK有关其他类型 HBase 备份的更多信息，请参阅HBase 文档中的[HBase 备份](https://hbase.apache.org/book.html#ops.backup)。

## 使用表创建快照
<a name="w2aac33c49b4"></a>

```
hbase snapshot create -n snapshotName -t tableName
```

使用来自 AWS 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"]
```

适用于 Java 的 AWS SDK

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

**注意**  
如果您的快照名称不唯一，则创建操作将失败，并返回 `-1` 或者 `255`，但您可能看不到说明出现问题的错误消息。要使用相同的快照名称，请先将其删除，然后重新创建。

## 删除快照
<a name="w2aac33c49b6"></a>

```
hbase shell
>> delete_snapshot 'snapshotName'
```

## 查看快照信息
<a name="w2aac33c49b8"></a>

```
hbase snapshot info -snapshot snapshotName
```

## 将快照导出到 Amazon S3
<a name="w2aac33c49c10"></a>

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

```
hbase snapshot export -snapshot snapshotName \
-copy-to s3://amzn-s3-demo-bucket/folder -mappers 2
```

`command-runner.jar`从以下位置使用 AWS 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://amzn-s3-demo-bucket/folder","-mappers","2","-bandwidth","50"]
```

适用于 Java 的 AWS SDK:

```
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 导入快照
<a name="w2aac33c49c12"></a>

尽管这是导入，但此处使用的 HBase 选项仍然是`export`。

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

`command-runner.jar`从以下位置使用 AWS 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://amzn-s3-demo-bucket/folder", \
"-copy-to","hdfs://masterPublicDNSName:8020/user/hbase","-mappers","2","-chmod","700"]
```

适用于 Java 的 AWS SDK:

```
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");
```

## 从 s HBase hell 中的快照还原表
<a name="w2aac33c49c14"></a>

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

HBase 目前不支持 s HBase hell 中的所有快照命令。例如，没有用于恢复快照的 HBase 命令行选项，因此必须在 shell 中恢复快照。这意味着 `command-runner.jar` 必须运行 Bash 命令。

**注意**  
由于此处使用的命令为 `echo`，因此您的 Shell 命令可能仍将失败，即使 Amazon EMR 运行的命令返回退出代码 `0` 也是如此。如果选择将 shell 命令作为步骤运行，请检查步骤日志。

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

以下是使用 AWS 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
```

适用于 Java 的 AWS SDK:

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