Amazon EMR
管理指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

EMRFS 一致视图元数据

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

如何向元数据添加条目

您可以使用 syncimport 子命令向元数据添加条目。sync 反映路径中 Amazon S3 对象的状态,而 import 完全用于向元数据添加新条目。有关更多信息,请参阅 EMRFS CLI 参考

如何检查元数据与 Amazon S3 中的对象之间的差异

要检查元数据与 Amazon S3 之间的差异,请使用 EMRFS CLI 的 diff 子命令。有关更多信息,请参阅 EMRFS CLI 参考

如何了解元数据操作是否受限制

EMRFS 针对元数据的读取和写入操作,分别设置了默认 400 和 100 个单位的吞吐量容量限制。大量对象或存储桶可能会导致操作超过此容量,此时 DynamoDB 会对它们进行限制。例如,如果您执行的操作超过这些容量限制,则应用程序可能会导致 EMRFS 引发 ProvisionedThroughputExceededException。施加限制时,EMRFS CLI 工具将尝试使用指数回退重试对 DynamoDB 表进行写入操作,直到操作完成,或是达到将对象从 Amazon EMR 写入到 Amazon S3 的最大重试次数值。

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

重要 EMRFS 操作的吞吐量特征

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

Operation 每秒平均读取量 每秒平均写入量
create (对象) 26.79 6.70
delete (对象) 10.79 10.79
delete (包含 1 000 个对象的目录) 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 (包含 1 000 个对象的目录) 308.81 0
listStatus (包含 10 000 个对象的目录) 416.05 0
listStatus (包含 100 000 个对象的目录) 823.56 0
listStatus (包含 1 百万个对象的目录) 882.36 0
mkdir (持续 120 秒) 24.18 4.03
mkdir 12.59 0
rename (对象) 19.53 4.88
rename (包含 1 000 个对象的目录) 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 值检查日志以了解操作结果。