

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

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

HBase 會採用內建的[快照](https://hbase.apache.org/book.html#ops.snapshots)功能來為資料表建立輕量型備份。在 EMR 叢集中，可以使用 EMRFS 將這些備份匯出到 Amazon S3。您可以使用 HBase shell 在主節點上建立快照。本主題說明如何使用 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
```

從 使用 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", "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");
```

## 在 HBase shell 中從快照還原表格
<a name="w2aac33c49c14"></a>

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

HBase 目前不支援 HBase shell 中提供的所有快照命令。例如，由於並不存在還原快照的 HBase 命令列，因此您必須在 shell 中將其還原。這表示 `command-runner.jar` 必須執行 Bash 命令。

**注意**  
由於此處使用的命令為 `echo`，即使 Amazon EMR 執行的命令傳回 `0` 結束程式碼，Shell 命令仍可能會失敗。若您選擇執行一個 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");
```