本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
EMRFS 一致视图元数据
EMRFS 一致视图使用 DynamoDB 表跟踪 Amazon S3 中已与 EMRFS 同步或已由 EMRFS 创建的对象,从而跟踪一致性。元数据用于跟踪所有操作 (读取、写入、更新和复制)。其中不存储任何实际内容。此元数据用于验证从 Amazon S3 接收的对象或元数据是否与预期内容匹配。此确认使 EMRFS 能够检查 EMRFS 写入 Amazon S3 的新对象或与 EMRFS 同步的对象的列表 read-after-write一致性和一致性。多个集群可共享相同的元数据。
如何向元数据添加条目
您可以使用 sync
或 import
子命令向元数据添加条目。sync
反映路径中 Amazon S3 对象的状态,而 import
用于向元数据添加新条目。有关更多信息,请参阅EMRFS CLI 命令参考。
如何检查元数据与 Amazon S3 中的对象之间的差异
要检查元数据与 Amazon S3 之间的差异,请使用 EMRFS CLI 的 diff
子命令。有关更多信息,请参阅EMRFS CLI 命令参考。
如何了解元数据操作是否受限制
EMRFS 针对元数据的读取和写入操作,分别设置了默认 500 和 100 个单位的吞吐量容量限制。大量对象或存储桶可能会导致操作超过此容量,此时 DynamoDB 会对它们进行限制。例如,如果您执行的操作超过这些容量限制,则应用程序可能会导致 EMRFS 引发 ProvisionedThroughputExceededException
。施加节流时,EMRFS CLI 工具将尝试使用指数回退重试对 DynamoDB 表进行写入操作,直到操作完成,或是达到将对象从 Amazon EMR 写入到 Amazon S3 的最大重试次数值。
您可以配置自己的吞吐容量限制。但是,对于读取和写入操作,DynamoDB 有严格的分区限制,分别为每秒 3000 个读取容量单位 RCUs WCUs () 和 1000 个写入容量单位 ()。为避免限制导致sync
故障,我们建议您将读取操作的吞吐量限制在 3000 RCUs 以下,将写入操作的吞吐量限制在 1000 以下。 WCUs有关设置自定义吞吐容量限制的说明,请参阅 配置一致视图。
您还可以在 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 值在日志中查看操作结果。