输入与输出错误 - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

输入与输出错误

以下是集群输入与输出操作中的常见错误。

您的 Amazon Simple Storage Service(Amazon S3)路径中是否至少有三个斜杠?

在指定 Amazon S3 存储桶时,必须在 URL 的末尾加上终止斜杠。举例来说,不要以下列格式引用存储桶“s3n://DOC-EXAMPLE-BUCKET1”,而应使用“s3n://DOC-EXAMPLE-BUCKET1/”,否则 Hadoop 会在大多数情况下导致集群失败。

您是否正在尝试以递归的方式遍历输入目录?

Hadoop 不会以递归的方式搜索文件的输入目录。如果您拥有 /corpus/01/01.txt、/corpus/01/02.txt、/corpus/02/01.txt 等目录结构,且指定 /corpus/ 作为集群的输入参数,则 Hadoop 将找不到任何输入文件,因为 /corpus/ 目录为空,且 Hadoop 不会查看子目录的内容。同样地,Hadoop 不会以递归的方式查看 Amazon S3 存储桶的子目录。

输入文件必须直接放入您指定的输入目录或者 Amazon S3 存储桶中,而不是子目录中。

您的输出目录是否已经存在?

如果您指定的输出路径已经存在,Hadoop 会在大多数情况下导致集群失败。这意味着如果您运行集群一次,并使用完全相同的参数再运行一次,那么第一次正常很可能运行,但后面的运行就再也不会成功;因为在第一次运行后,会出现输出路径,这导致所有后续的运行失败。

您是否尝试指定一个使用 HTTP URL 的资源?

Hadoop 不接受使用 http:// 前缀指定的资源位置。您不能使用 HTTP URL 引用资源。例如,以 http://mysite/myjar.jar 作为 JAR 参数进行传递会导致集群失败。

您是否在使用无效名称格式引用 Amazon S3 存储桶?

如果您尝试在 Amazon EMR 中使用诸如“DOC-EXAMPLE-BUCKET1.1”的存储桶名称,那么集群会失败,因为 Amazon EMR 要求存储桶名称必须是有效的 RFC 2396 主机名称,名称不能以数字结尾。另外,根据 Hadoop 的要求,与 Amazon EMR 一起使用的 Amazon S3 存储桶名称必须仅包含小写字母、数字、英文句点(.)和连字符(-)。有关如何格式化 Amazon S3 存储桶名称的更多信息,请参阅《Amazon Simple Storage Service 用户指南》中的存储桶限制

您在向 Amazon S3 装载数据或者从中移出数据时是否遇到问题?

Amazon S3 是最常见的 Amazon EMR 输入与输出源。常见的错误是将 Amazon S3 当做典型的文件系统进行处理。Amazon S3 和文件系统之间存在区别,在运行集群时必须予以考虑。

  • 如果 Amazon S3 中出现内部错误,您的应用程序必须顺利地予以处理,并重试该操作。

  • 如果调用 Amazon S3 的返回时间太长,那么,您的应用程序可能必须降低调用 Amazon S3 的频率。

  • 列出 Amazon S3 存储桶中的所有对象是一种成本很高的调用。您的应用程序应该将此类操作的次数降到最低程度。

您可以使用多种方式提高您的集群与 Amazon S3 的交互。

  • 使用 Amazon EMR 的最新发行版启动您的集群。

  • 使用 S3 DistCp 将对象移入和移出 Amazon S3。S3 DistCp 实施了错误处理、重试和回退,以满足 Amazon S3 的要求。有关更多信息,请参阅使用 S3 进行分布式复制DistCp

  • 设计应用程序时应考虑最终一致性这一因素。在集群运行时将 HDFS 用于中间数据存储和 Amazon S3,以便仅输入原始数据与输出最终结果。

  • 如果您的集群每秒向 Amazon S3 提交不少于 200 个事务,请联系支持人员,以每秒提交更多的事务为前提准备存储桶,并考虑使用 Amazon S3 性能提示与和技巧中所述的密钥分区策略。

  • 设置 Hadoop 配置设置 io.file.buffer.size 为 65536。这可让 Hadoop 在 Amazon S3 对象中搜索时花费较少的时间。

  • 如果您的集群遇到 Amazon S3 并发问题,请考虑禁用 Hadoop 的推测执行功能。当您排除速度很慢的集群故障时,这也非常有用。您可以通过将 mapreduce.map.speculativemapreduce.reduce.speculative 属性设置为 false 来执行此操作。在您启动集群时,您可以使用 mapred-env 配置分类来设置这些值。有关更多信息,请参阅 Amazon EMR 发行版指南中的配置应用程序

  • 如果您运行的是 Hive 集群,请参阅 您是否有关于在 Amazon S3 与 Hive 之间加载数据的问题?

有关 Amazon S3 权限的更多信息,请参阅《Amazon Simple Storage Service 用户指南》中的 Amazon S3 错误最佳实践