

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

# EMRFS 一致视图元数据
<a name="emrfs-metadata"></a>

EMRFS 一致视图使用 DynamoDB 表跟踪 Amazon S3 中已与 EMRFS 同步或已由 EMRFS 创建的对象，从而跟踪一致性。元数据用于跟踪所有操作 (读取、写入、更新和复制)。其中不存储任何实际内容。此元数据用于验证从 Amazon S3 接收的对象或元数据是否与预期内容匹配。此确认使 EMRFS 能够检查 EMRFS 写入 Amazon S3 的新对象或与 EMRFS 同步的对象的列表 read-after-write一致性和一致性。多个集群可共享相同的元数据。

**如何向元数据添加条目**  
您可以使用 `sync` 或 `import` 子命令向元数据添加条目。`sync` 反映路径中 Amazon S3 对象的状态，而 `import` 用于向元数据添加新条目。有关更多信息，请参阅[EMRFS CLI 命令参考](emrfs-cli-reference.md)。

**如何检查元数据与 Amazon S3 中的对象之间的差异**  
要检查元数据与 Amazon S3 之间的差异，请使用 EMRFS CLI 的 `diff` 子命令。有关更多信息，请参阅[EMRFS CLI 命令参考](emrfs-cli-reference.md)。

**如何了解元数据操作是否受限制**  
EMRFS 针对元数据的读取和写入操作，分别设置了默认 500 和 100 个单位的吞吐量容量限制。大量对象或存储桶可能会导致操作超过此容量，此时 DynamoDB 会对它们进行限制。例如，如果您执行的操作超过这些容量限制，则应用程序可能会导致 EMRFS 引发 `ProvisionedThroughputExceededException`。施加节流时，EMRFS CLI 工具将尝试使用[指数回退](https://docs.aws.amazon.com/general/latest/gr/api-retries.html)重试对 DynamoDB 表进行写入操作，直到操作完成，或是达到将对象从 Amazon EMR 写入到 Amazon S3 的最大重试次数值。

您可以配置自己的吞吐容量限制。但是，对于读取和写入操作，DynamoDB 有严格的分区限制，分别为每秒 3000 个读取容量单位 RCUs WCUs () 和 1000 个写入容量单位 ()。为避免限制导致`sync`故障，我们建议您将读取操作的吞吐量限制在 3000 RCUs 以下，将写入操作的吞吐量限制在 1000 以下。 WCUs有关设置自定义吞吐容量限制的说明，请参阅 [配置一致视图](emrfs-configure-consistent-view.md)。

您还可以在 DynamoDB 控制台中查看 EMRFS 元数据的亚马逊 CloudWatch 指标，您可以在其中查看受限制的读取和写入请求数量。如果受限制的请求数不为零值，则增加为读取或写入操作分配的吞吐量容量可能会使应用程序受益。如果您发现操作长时间接近分配的最大读取或写入吞吐量容量，则这样做也可能会获得性能好处。

**重要 EMRFS 操作的吞吐量特征**  
读取和写入操作的默认值分别为 400 和 100 个吞吐量容量单位。您可以通过以下性能特征了解特定操作所需的吞吐量。这些测试是使用单节点 `m3.large` 集群执行的。所有操作都是单线程执行。特定应用程序特征会对性能造成很大影响，可能需要通过实验来优化文件系统操作。


| 操作  | 平均值 read-per-second  | 平均值 write-per-second  | 
| --- | --- | --- | 
| create（对象） | 26.79 |  6.70 | 
| delete（对象） | 10.79 |  10.79 | 
| delete（包含 1000 个对象的目录） | 21.79 | 338.40  | 
|  getFileStatus（对象） | 34.70 | 0  | 
| getFileStatus（目录） | 19.96 | 0 | 
| listStatus（包含 1 个对象的目录） | 43.31 | 0 | 
| listStatus（包含 10 个对象的目录） | 44.34 | 0 | 
| listStatus（包含 100 个对象的目录） | 84.44 | 0 | 
| listStatus（包含 1000 个对象的目录） | 308.81 | 0 | 
| listStatus（包含 10000 个对象的目录） | 416.05 | 0 | 
| listStatus（包含 100000 个对象的目录） | 823.56 | 0 | 
| listStatus（包含 1000000 个对象的目录） | 882.36 | 0 | 
| mkdir（持续 120 秒）  | 24.18 | 4.03 | 
| mkdir | 12.59 | 0 | 
| rename（对象） | 19.53 | 4.88 | 
| rename（包含 1000 个对象的目录） | 23.22 | 339.34 | 

**提交从元数据存储中清除旧数据的步骤**  
用户可能希望在基于 DynamoDB 的元数据中删除特定条目。这样可以帮助降低与表关联的存储成本。用户可以使用 EMRFS CLI `delete` 子命令，以手动或编程方式清除特定条目。但是，如果从元数据中删除条目，则 EMRFS 不再进行任何一致性检查。

可以通过向集群提交在 EMRFS CLI 中执行命令的最终步骤，以编程方式在任务完成之后进行清除。例如，键入以下命令可向集群提交删除两天之前的所有条目的步骤。

```
aws emr add-steps --cluster-id j-2AL4XXXXXX5T9 --steps Name="emrfsCLI",Jar="command-runner.jar",Args=["emrfs","delete","--time","2","--time-unit","days"]
{
    "StepIds": [
        "s-B12345678902"
    ]
}
```

使用返回的 StepId 值在日志中查看操作结果。