

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

# Amazon EMR 操作期间的集群输入和输出错误
<a name="emr-troubleshoot-errors-io"></a>

以下是集群输入与输出操作中的常见错误。使用本主题中的指南进行问题排查并检查配置。

**Topics**
+ [您的 Amazon Simple Storage Service（Amazon S3）路径中是否至少有三个斜杠？](#threeslashes)
+ [您是否正在尝试以递归的方式遍历输入目录？](#recurseinput)
+ [您的输出目录是否已经存在？](#directoryexist)
+ [您是否尝试指定一个使用 HTTP URL 的资源？](#httpurl)
+ [您是否在使用无效名称格式引用 Amazon S3 存储桶？](#validdnsname)
+ [您在向 Amazon S3 装载数据或者从中移出数据时是否遇到问题？](#emr-troubleshoot-errors-io-1)

## 您的 Amazon Simple Storage Service（Amazon S3）路径中是否至少有三个斜杠？
<a name="threeslashes"></a>

 在指定 Amazon S3 存储桶时，必须在 URL 的末尾加上终止斜杠。例如，您应该使用 "s3n://amzn-s3-demo-bucket1/" 而不是 "s3n://amzn-S3-demo-bucket1/" 来引用存储桶，否则 Hadoop 在大多数情况下会导致集群失败。

## 您是否正在尝试以递归的方式遍历输入目录？
<a name="recurseinput"></a>

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

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

## 您的输出目录是否已经存在？
<a name="directoryexist"></a>

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

## 您是否尝试指定一个使用 HTTP URL 的资源？
<a name="httpurl"></a>

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

## 您是否在使用无效名称格式引用 Amazon S3 存储桶？
<a name="validdnsname"></a>

 如果您尝试在 Amazon EMR 中使用 "amzn-s3-demo-bucket1.1" 之类的存储桶名称，集群将会失败，因为 Amazon EMR 要求存储桶名称是有效的 RFC 2396 主机名；名称不能以数字结尾。另外，根据 Hadoop 的要求，与 Amazon EMR 一起使用的 Amazon S3 存储桶名称必须仅包含小写字母、数字、英文句点（.）和连字符（-）。有关如何格式化 Amazon S3 存储桶名称的更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[存储桶限制](https://docs.aws.amazon.com/AmazonS3/latest/userguide/index.html?BucketRestrictions.html)。

## 您在向 Amazon S3 装载数据或者从中移出数据时是否遇到问题？
<a name="emr-troubleshoot-errors-io-1"></a>

 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](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/UsingEMR_s3distcp.html)。
+  设计应用程序时应考虑最终一致性这一因素。在集群运行时将 HDFS 用于中间数据存储和 Amazon S3，以便仅输入原始数据与输出最终结果。
+  如果您的集群每秒向 Amazon S3 提交不少于 200 个事务，[请联系支持人员](https://aws.amazon.com/contact-us/)，以每秒提交更多的事务为前提准备存储桶，并考虑使用 [Amazon S3 性能提示与和技巧](https://aws.amazon.com/blogs/aws/amazon-s3-performance-tips-tricks-seattle-hiring-event/)中所述的密钥分区策略。
+  设置 Hadoop 配置设置 io.file.buffer.size 为 65536。这可让 Hadoop 在 Amazon S3 对象中搜索时花费较少的时间。
+  如果您的集群遇到 Amazon S3 并发问题，请考虑禁用 Hadoop 的推测执行功能。当您排除速度很慢的集群故障时，这也非常有用。您可以通过将 `mapreduce.map.speculative` 和 `mapreduce.reduce.speculative` 属性设置为 `false` 来执行此操作。在您启动集群时，您可以使用 `mapred-env` 配置分类来设置这些值。有关更多信息，请参阅 *Amazon EMR 发行版指南*中的[配置应用程序](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps.html)。
+  如果您运行的是 Hive 集群，请参阅 [您是否有关于在 Amazon S3 与 Hive 之间加载数据的问题？](emr-troubleshoot-error-hive.md#emr-troubleshoot-error-hive-3)。

 有关 Amazon S3 权限的更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的 [Amazon S3 错误最佳实践](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ErrorBestPractices.html)。