

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

# EMRFS CLI 命令参考
<a name="emrfs-cli-reference"></a>

默认情况下，EMRFS CLI 安装在使用 Amazon EMR 发行版 3.2.1 或更高版本创建的所有集群主节点上。您可以使用 EMRFS CLI 管理一致视图的元数据。

**注意**  
只有 VT100 终端仿真才支持该**emrfs**命令。但是，它可能适用于其它终端仿真器模式。

## emrfs 顶级命令
<a name="emrfs-top-level"></a>

**emrfs** 顶级命令支持以下结构。

```
emrfs [describe-metadata | set-metadata-capacity | delete-metadata | create-metadata | \
list-metadata-stores | diff | delete | sync | import ] [options] [arguments]
```

指定 [选项]，根据需要使用或不使用下表中描述的 [参数]。有关特定于子命令 (`describe-metadata`、`set-metadata-capacity` 等) 的 [选项]，请参阅下面的每个子命令。


**emrfs 的 [选项]**  

| 选项  | 描述  | 必填  | 
| --- | --- | --- | 
|  `-a AWS_ACCESS_KEY_ID \| --access-key AWS_ACCESS_KEY_ID`  |  用于向 Amazon S3 写入对象以及在 DynamoDB 中创建或访问元数据存储的访问密钥。 AWS 默认情况下，设置*AWS\$1ACCESS\$1KEY\$1ID*为用于创建集群的访问密钥。  |  否  | 
|  `-s AWS_SECRET_ACCESS_KEY \| --secret-key AWS_SECRET_ACCESS_KEY`  |  与您用于向 Amazon S3 写入对象以及在 DynamoDB 中创建或访问元数据存储的访问 AWS 密钥关联的密钥。默认情况下，设置*AWS\$1SECRET\$1ACCESS\$1KEY*为与用于创建集群的访问密钥关联的密钥。  |  否  | 
|  `-v \| --verbose`  |  使输出为详细模式。  |  否  | 
|  `-h \| --help`  |  通过用法语句显示 `emrfs` 命令的帮助消息。  |  否  | 

## emrfs describe-metadata 子命令
<a name="emrfs-describe-metadata"></a>


**emrfs describe-metadata 的 [选项]**  

| 选项  | 描述  | 必填  | 
| --- | --- | --- | 
|  `-m METADATA_NAME \| --metadata-name METADATA_NAME`  |  *METADATA\$1NAME*是 DynamoDB 元数据表的名称。如果未提供*METADATA\$1NAME*参数，则默认值为`EmrFSMetadata`。  |  否  | 

**Example emrfs describe-metadata 示例**  <a name="emrfs-describe-metadata"></a>
以下示例描述默认元数据表。  

```
$ emrfs describe-metadata
EmrFSMetadata
  read-capacity: 400
  write-capacity: 100
  status: ACTIVE
  approximate-item-count (6 hour delay): 12
```

## emrfs set-metadata-capacity 子命令
<a name="emrfs-set-metadata-capacity"></a>


**emrfs 的 [选项] set-metadata-capacity**  

| 选项  | 描述  | 必填  | 
| --- | --- | --- | 
|  `-m METADATA_NAME \| --metadata-name METADATA_NAME`  |  *METADATA\$1NAME*是 DynamoDB 元数据表的名称。如果未提供*METADATA\$1NAME*参数，则默认值为`EmrFSMetadata`。  |  否  | 
|  `-r READ_CAPACITY \| --read-capacity READ_CAPACITY`  |  对元数据表请求的读取吞吐容量。如果未提供*READ\$1CAPACITY*参数，则默认值为`400`。  |  否  | 
|  `-w WRITE_CAPACITY \| --write-capacity WRITE_CAPACITY`  |  对元数据表请求的写入吞吐容量。如果未提供*WRITE\$1CAPACITY*参数，则默认值为`100`。  |  否  | 

**Example emrfs 示例 set-metadata-capacity**  
以下示例将名为 `600` 的元数据表的读取吞吐容量设置为 `150`，将写入容量设置为 `EmrMetadataAlt`。  

```
$ emrfs set-metadata-capacity --metadata-name EmrMetadataAlt  --read-capacity 600 --write-capacity 150
  read-capacity: 400
  write-capacity: 100
  status: UPDATING
  approximate-item-count (6 hour delay): 0
```

## emrfs delete-metadata 子命令
<a name="emrfs-delete-metadata"></a>


**emrfs delete-metadata 的 [选项]**  

| 选项  | 描述  | 必填  | 
| --- | --- | --- | 
|  `-m METADATA_NAME \| --metadata-name METADATA_NAME`  |  *METADATA\$1NAME*是 DynamoDB 元数据表的名称。如果未提供*METADATA\$1NAME*参数，则默认值为`EmrFSMetadata`。  |  否  | 

**Example emrfs delete-metadata 示例**  
以下示例删除默认元数据表。  

```
$ emrfs delete-metadata
```

## emrfs create-metadata 子命令
<a name="emrfs-create-metadata"></a>


**emrfs create-metadata 的 [选项]**  

| 选项  | 描述  | 必填  | 
| --- | --- | --- | 
|  `-m METADATA_NAME \| --metadata-name METADATA_NAME`  |  *METADATA\$1NAME*是 DynamoDB 元数据表的名称。如果未提供*METADATA\$1NAME*参数，则默认值为`EmrFSMetadata`。  |  否  | 
|  `-r READ_CAPACITY \| --read-capacity READ_CAPACITY`  |  对元数据表请求的读取吞吐容量。如果未提供*READ\$1CAPACITY*参数，则默认值为`400`。  |  否  | 
|  `-w WRITE_CAPACITY \| --write-capacity WRITE_CAPACITY`  |  对元数据表请求的写入吞吐容量。如果未提供*WRITE\$1CAPACITY*参数，则默认值为`100`。  |  否  | 

**Example emrfs create-metadata 示例**  
以下示例创建一个名为 `EmrFSMetadataAlt` 的元数据表。  

```
$ emrfs create-metadata -m EmrFSMetadataAlt
Creating metadata: EmrFSMetadataAlt
EmrFSMetadataAlt
  read-capacity: 400
  write-capacity: 100
  status: ACTIVE
  approximate-item-count (6 hour delay): 0
```

## emrfs list-metadata-stores 子命令
<a name="emrfs-list-metadata-stores"></a>

**emrfs list-metadata-stores** 子命令没有任何 [选项]。

**Example List-metadata-stores 示例**  
以下示例列出您的元数据表。  

```
$ emrfs list-metadata-stores
  EmrFSMetadata
```

## emrfs diff 子命令
<a name="emrfs-diff"></a>


**emrfs diff 的 [选项]**  

| 选项  | 描述  | 必填  | 
| --- | --- | --- | 
|  `-m METADATA_NAME \| --metadata-name METADATA_NAME`  |  *METADATA\$1NAME*是 DynamoDB 元数据表的名称。如果未提供*METADATA\$1NAME*参数，则默认值为`EmrFSMetadata`。  |  否  | 
|  *s3://s3Path*  |  与元数据表进行比较的 Amazon S3 存储桶的路径。存储桶以递归方式同步。  |  是  | 

**Example emrfs diff 示例**  
以下示例将默认元数据表与 Amazon S3 存储桶进行比较。  

```
$ emrfs diff s3://elasticmapreduce/samples/cloudfront
BOTH | MANIFEST ONLY | S3 ONLY
DIR elasticmapreduce/samples/cloudfront
DIR elasticmapreduce/samples/cloudfront/code/
DIR elasticmapreduce/samples/cloudfront/input/
DIR elasticmapreduce/samples/cloudfront/logprocessor.jar
DIR elasticmapreduce/samples/cloudfront/input/XABCD12345678.2009-05-05-14.WxYz1234
DIR elasticmapreduce/samples/cloudfront/input/XABCD12345678.2009-05-05-15.WxYz1234
DIR elasticmapreduce/samples/cloudfront/input/XABCD12345678.2009-05-05-16.WxYz1234
DIR elasticmapreduce/samples/cloudfront/input/XABCD12345678.2009-05-05-17.WxYz1234
DIR elasticmapreduce/samples/cloudfront/input/XABCD12345678.2009-05-05-18.WxYz1234
DIR elasticmapreduce/samples/cloudfront/input/XABCD12345678.2009-05-05-19.WxYz1234
DIR elasticmapreduce/samples/cloudfront/input/XABCD12345678.2009-05-05-20.WxYz1234
DIR elasticmapreduce/samples/cloudfront/code/cloudfront-loganalyzer.tgz
```

## emrfs delete 子命令
<a name="emrfs-delete"></a>


**emrfs delete 的 [选项]**  

|  选项  |  描述  |  必填  | 
| --- | --- | --- | 
|  `-m METADATA_NAME \| --metadata-name METADATA_NAME`  |  *METADATA\$1NAME*是 DynamoDB 元数据表的名称。如果未提供*METADATA\$1NAME*参数，则默认值为`EmrFSMetadata`。  |  否  | 
|  *s3://s3Path*  |  为实现一致视图而跟踪的 Amazon S3 存储桶的路径。存储桶以递归方式同步。  |  是  | 
| -t TIME \$1 --time TIME |  过期时间 (使用时间单位参数进行解释)。将删除指定存储桶中所有早于*TIME*参数的元数据条目。  |  | 
|  `-u UNIT \| --time-unit UNIT`  |  用于解释时间参数的度量值 (纳秒、微秒、毫秒、秒、分钟、小时或天)。如果未指定参数，则默认值为 `days`。  |  | 
|  `--read-consumption READ_CONSUMPTION`  |  请求用于 **delete** 操作的可用读取吞吐量。如果未指定*READ\$1CONSUMPTION*参数，则默认值为`400`。  |  否   | 
|  `--write-consumption WRITE_CONSUMPTION`  |  请求用于 **delete** 操作的可用写入吞吐量。如果未指定*WRITE\$1CONSUMPTION*参数，则默认值为`100`。  |  否  | 

**Example emrfs delete 示例**  
以下示例从一致视图的跟踪元数据中删除一个 Amazon S3 存储桶中的所有对象。  

```
$ emrfs delete s3://elasticmapreduce/samples/cloudfront
entries deleted: 11
```

## emrfs import 子命令
<a name="emrfs-import"></a>


**for emrfs import 的 [选项]**  

| 选项  | 描述  | 必填  | 
| --- | --- | --- | 
|  `-m METADATA_NAME \| --metadata-name METADATA_NAME`  |  *METADATA\$1NAME*是 DynamoDB 元数据表的名称。如果未提供*METADATA\$1NAME*参数，则默认值为`EmrFSMetadata`。  |  否  | 
|  *s3://s3Path*  |  为实现一致视图而跟踪的 Amazon S3 存储桶的路径。存储桶以递归方式同步。  |  是  | 
|  `--read-consumption READ_CONSUMPTION`  |  请求用于 **delete** 操作的可用读取吞吐量。如果未指定*READ\$1CONSUMPTION*参数，则默认值为`400`。  |  否  | 
|  `--write-consumption WRITE_CONSUMPTION`  |  请求用于 **delete** 操作的可用写入吞吐量。如果未指定*WRITE\$1CONSUMPTION*参数，则默认值为`100`。  |  否  | 

**Example emrfs import 示例**  
以下示例随一致视图的跟踪元数据导入一个 Amazon S3 存储桶中的所有对象。忽略所有未知键。  

```
$ emrfs import s3://elasticmapreduce/samples/cloudfront
```

## emrfs sync 子命令
<a name="emrfs-sync"></a>


**emrfs sync 的 [选项]**  

| 选项  | 描述  | 必填  | 
| --- | --- | --- | 
|  `-m METADATA_NAME \| --metadata-name METADATA_NAME`  |  *METADATA\$1NAME*是 DynamoDB 元数据表的名称。如果未提供*METADATA\$1NAME*参数，则默认值为`EmrFSMetadata`。  |  否  | 
|  *s3://s3Path*  |  为实现一致视图而跟踪的 Amazon S3 存储桶的路径。存储桶以递归方式同步。  |  是  | 
|  `--read-consumption READ_CONSUMPTION`  |  请求用于 **delete** 操作的可用读取吞吐量。如果未指定*READ\$1CONSUMPTION*参数，则默认值为`400`。  |  否  | 
|  `--write-consumption WRITE_CONSUMPTION`  |  请求用于 **delete** 操作的可用写入吞吐量。如果未指定*WRITE\$1CONSUMPTION*参数，则默认值为`100`。  |  否  | 

**Example emrfs sync 命令示例**  
以下示例随一致视图的跟踪元数据导入一个 Amazon S3 存储桶中的所有对象。删除所有未知键。  

```
$ emrfs sync s3://elasticmapreduce/samples/cloudfront
Synching samples/cloudfront                                       0 added | 0 updated | 0 removed | 0 unchanged
Synching samples/cloudfront/code/                                 1 added | 0 updated | 0 removed | 0 unchanged
Synching samples/cloudfront/                                      2 added | 0 updated | 0 removed | 0 unchanged
Synching samples/cloudfront/input/                                9 added | 0 updated | 0 removed | 0 unchanged
Done synching s3://elasticmapreduce/samples/cloudfront            9 added | 0 updated | 1 removed | 0 unchanged
creating 3 folder key(s)
folders written: 3
```

## emrfs read-sqs 子命令
<a name="emrfs-read-sqs"></a>


**emrfs read-sqs 的 [选项]**  

| 选项  | 描述  | 必填  | 
| --- | --- | --- | 
|  `-q QUEUE_NAME \| --queue-name QUEUE_NAME`  |  *QUEUE\$1NAME*是在中配置的 Amazon SQS 队列的名称。`emrfs-site.xml`默认值为 **EMRFS-Inconsistency-<jobFlowId>**。  |  是  | 
|  `-o OUTPUT_FILE \| --output-file OUTPUT_FILE`  |  *OUTPUT\$1FILE*是主节点本地文件系统上输出文件的路径。从队列读取的消息会写入此文件。  |  是  | 

## emrfs delete-sqs 子命令
<a name="emrfs-delete-sqs"></a>


**emrfs delete-sqs 的 [选项]**  

| 选项  | 描述  | 必填  | 
| --- | --- | --- | 
|  `-q QUEUE_NAME \| --queue-name QUEUE_NAME`  |  *QUEUE\$1NAME*是在中配置的 Amazon SQS 队列的名称。`emrfs-site.xml`默认值为 **EMRFS-Inconsistency-<jobFlowId>**。  |  是  | 

## 以步骤形式提交 EMRFS CLI 命令
<a name="emrfs-submit-steps-as-cli"></a>

以下示例说明如何在主节点上使用该`emrfs`实用程序，方法是利用 AWS CLI 或 API 和`command-runner.jar`，将`emrfs`命令作为一个步骤运行。该示例使用 适用于 Python (Boto3) 的 AWS SDK 向集群添加一个步骤，该步骤将 Amazon S3 存储桶中的对象添加到默认 EMRFS 元数据表中。

```
import boto3
from botocore.exceptions import ClientError


def add_emrfs_step(command, bucket_url, cluster_id, emr_client):
    """
    Add an EMRFS command as a job flow step to an existing cluster.

    :param command: The EMRFS command to run.
    :param bucket_url: The URL of a bucket that contains tracking metadata.
    :param cluster_id: The ID of the cluster to update.
    :param emr_client: The Boto3 Amazon EMR client object.
    :return: The ID of the added job flow step. Status can be tracked by calling
             the emr_client.describe_step() function.
    """
    job_flow_step = {
        "Name": "Example EMRFS Command Step",
        "ActionOnFailure": "CONTINUE",
        "HadoopJarStep": {
            "Jar": "command-runner.jar",
            "Args": ["/usr/bin/emrfs", command, bucket_url],
        },
    }

    try:
        response = emr_client.add_job_flow_steps(
            JobFlowId=cluster_id, Steps=[job_flow_step]
        )
        step_id = response["StepIds"][0]
        print(f"Added step {step_id} to cluster {cluster_id}.")
    except ClientError:
        print(f"Couldn't add a step to cluster {cluster_id}.")
        raise
    else:
        return step_id


def usage_demo():
    emr_client = boto3.client("emr")
    # Assumes the first waiting cluster has EMRFS enabled and has created metadata
    # with the default name of 'EmrFSMetadata'.
    cluster = emr_client.list_clusters(ClusterStates=["WAITING"])["Clusters"][0]
    add_emrfs_step(
        "sync", "s3://elasticmapreduce/samples/cloudfront", cluster["Id"], emr_client
    )


if __name__ == "__main__":
    usage_demo()
```

可以使用返回的 `step_id` 值检查日志以了解操作结果。