输入与输出错误 - 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 的最新发行版启动您的集群。

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

  • 设计应用程序时应考虑最终一致性这一因素。在集群运行时将 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 错误最佳实践