

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

# 对因错误代码而失败的 Amazon EMR 集群进行问题排查
<a name="emr-troubleshoot-failed"></a>

 本节向您介绍对已经失败的集群进行故障排除的过程。这意味着集群终止，出现了错误代码。

**注意**  
当 EMR 集群因错误而终止时，`DescribeCluster`和将`ListClusters` APIs 返回错误代码和错误消息。对于某些集群错误，`ErrorDetail` 数据数组还可以帮助您排查失败的问题。有关更多信息，请参阅 [Amazon EMR 中包含 ErrorDetail 信息的错误代码](emr-troubleshoot-error-errordetail.md)。

如果集群成功运行，但花了很长时间才返回结果，请参阅 [排查 Amazon EMR 集群速度缓慢的问题](emr-troubleshoot-slow.md)。

**Topics**
+ [

# 步骤 1：收集有关 Amazon EMR 集群问题的数据
](emr-troubleshoot-failed-1.md)
+ [

# 步骤 2：检查环境
](emr-troubleshoot-failed-2.md)
+ [

# 步骤 3：查看最后一次状态更改
](emr-troubleshoot-failed-3.md)
+ [

# 步骤 4：检查 Amazon EMR 日志文件
](emr-troubleshoot-failed-4.md)
+ [

# 步骤 5：分步测试 Amazon EMR 集群
](emr-troubleshoot-failed-5-test-steps.md)

# 步骤 1：收集有关 Amazon EMR 集群问题的数据
<a name="emr-troubleshoot-failed-1"></a>

 对集群进行故障排查的第一步是收集有关出现问题的信息以及集群的当前状态和配置。此信息将在以下步骤中用于确认或排查问题的可能原因。

## 定义问题
<a name="emr-troubleshoot-failed-1-problem"></a>

 首先要对这个问题作出明确的定义。问自己一些问题：
+  我预计发生什么？ 实际发生了什么？ 
+  首次出现此问题是什么时候？ 自那以后有多久发生一次？ 
+  配置或运行集群的方式是否有任何变化？ 

## 集群详细信息
<a name="emr-troubleshoot-failed-1-cluster"></a>

 以下集群详细信息有助于追踪问题。有关如何收集此信息的更多信息，请参阅[查看 Amazon EMR 集群状态和详细信息](emr-manage-view-clusters.md)。
+  集群的标识符。（也称为工作流标识符。） 
+  AWS 区域 以及集群启动时进入的可用区。
+  集群的状态，包括上次状态更改的详细信息。
+  为主节点、核心节点和任务节点指定的 EC2 实例的类型和数量。

# 步骤 2：检查环境
<a name="emr-troubleshoot-failed-2"></a>

Amazon EMR 作为 Web 服务的生态系统的一部分和开源软件运行。影响那些依赖项的事情会影响 Amazon EMR 的性能。

**Topics**
+ [

## 检查服务中断
](#emr-troubleshoot-failed-2-outages)
+ [

## 检查使用限制
](#emr-troubleshoot-failed-2-limits)
+ [

## 检查发布版
](#emr-troubleshoot-failed-2-ami)
+ [

## 检查 Amazon VPC 子网配置
](#emr-troubleshoot-failed-2-vpc)

## 检查服务中断
<a name="emr-troubleshoot-failed-2-outages"></a>

 Amazon EMR 在内部使用多种 Amazon Web Services。它在 Amazon EC2 上运行虚拟服务器，在 Amazon S3 上存储数据和脚本，并向报告指标 CloudWatch。中断这些服务的事件很少见。但一旦发生，即可能会导致 Amazon EMR 出现问题。

 进一步操作之前，请检查 [Service Health Dashboard](https://status.aws.amazon.com/)。检查您启动集群的区域，以查看这些服务中是否存在中断事件。

## 检查使用限制
<a name="emr-troubleshoot-failed-2-limits"></a>

 如果您正在启动大型集群，同时启动了多个集群，或者您是 AWS 账户 与其他用户共享的用户，则集群可能因为超过 AWS 服务限制而失败。

 Amazon EC2 将单个 AWS 区域上运行的虚拟服务器实例的数量限制为 20 个按需实例或预留实例。如果您启动一个拥有 20 个以上节点的集群，或者启动的集群导致您的 AWS 账户 活动的 EC2 实例总数超过 20，则该集群将无法启动其所需的所有 EC2 实例，并且可能会失败。出现这种情况时，Amazon EMR 会返回 `EC2 QUOTA EXCEEDED` 错误。您可以通过提交 AWS 提高 Amazon EC2 实例[限制申请来请求增加可在您的账户上运行的 EC2 实例](https://aws.amazon.com/contact-us/ec2-request/)数量。

 可能导致您超出使用限制的另一件事是集群终止与释放其所有资源之间的延迟。根据配置差异，以前的集群可能需要 5-20 分钟的时间才能完全终止并释放分配的资源。如果您在尝试启动集群时收到 `EC2 QUOTA EXCEEDED` 错误，原因可能是最近终止的集群中的资源尚未释放。在这种情况下，您可以[请求增加您的 Amazon EC2 配额](https://aws.amazon.com/contact-us/ec2-request/)，也可以等待 20 分钟并重新启动集群。

 Amazon S3 将在账户上创建的存储桶数量限制为 100。如果您的集群创建的新存储桶超过此限制，则存储桶创建将失败，并可能导致集群失败。

## 检查发布版
<a name="emr-troubleshoot-failed-2-ami"></a>

将用于启动集群的发行版标注与最新的 Amazon EMR 版本进行比较。Amazon EMR 的每个版本都包含改进，例如新的应用程序、功能、补丁和错误修复。影响集群的问题可能已经在最新的发布版中得到修复。如果可能，请使用最新版本的重新运行集群。

## 检查 Amazon VPC 子网配置
<a name="emr-troubleshoot-failed-2-vpc"></a>

如果您的集群是在 Amazon VPC 子网中启动的，则需要按照[在 VPC 中为 Amazon EMR 配置联网](emr-plan-vpc-subnet.md)中所述配置子网。此外，请检查您启动集群的子网是否有足够的空闲弹性 IP 地址，以便为集群中的每个节点分配一个。

# 步骤 3：查看最后一次状态更改
<a name="emr-troubleshoot-failed-3"></a>

 最后一次状态更改提供关于集群最后一次更改状态时所发生的事情的信息。这常常包含一些信息，告诉您当集群把状态更改为 `FAILED` 时出错的地方。例如，如果您启动了流集群并指定了已经在 Amazon S3 中的输出位置，集群将会失败，同时提示最后一次状态更改为“流输出目录已经存在”。

 您可以通过查看集群的详细信息窗格从控制台查找最后一次状态更改值，可以使用 `list-steps` 或 `describe-cluster` 参数从 CLI 查看或使用 `DescribeCluster` 和 `ListSteps` 操作从 API 查看。有关更多信息，请参阅 [查看 Amazon EMR 集群状态和详细信息](emr-manage-view-clusters.md)。

# 步骤 4：检查 Amazon EMR 日志文件
<a name="emr-troubleshoot-failed-4"></a>

 下一步是检查日志文件，以找到错误代码或集群遇到的问题的其它指示。有关可用日志文件、查找日志文件的位置以及如何查看这些日志文件的信息，请参阅[查看 Amazon EMR 日志文件](emr-manage-view-web-log-files.md)。

 可能需要进行一些调查工作才能确定发生了什么。Hadoop 在集群中的各个节点上运行任务尝试中的任务工作。Amazon EMR 可以启动推测性任务尝试，终止未首先完成的其它任务尝试。这会生成重要的活动，并记录到控制器，stderr 和 syslog 日志文件中。此外，多个任务尝试同时运行，但一个日志文件只能线性显示结果。

 首先检查引导操作日志，查看集群启动期间的错误或意外配置更改。从那里查看步骤日志，以确定作为错误步骤的一部分启动的 Hadoop 任务。检查 Hadoop 任务日志以确定失败的任务尝试。任务尝试日志将包含导致任务尝试失败的详细信息。

以下部分说明如何使用各种日志文件识别集群中的错误。

## 检查引导操作日志
<a name="emr-troubleshoot-failed-4-bootstrap-logs"></a>

 引导操作会在集群启动时运行脚本。它们通常用于在集群上安装附加软件或更改默认值的配置设置。检查这些日志可以深入了解集群设置期间发生的错误以及可能影响性能的配置设置更改。

## 检查步骤日志
<a name="emr-troubleshoot-failed-4-step-logs"></a>

 步骤日志有四种类型。
+ **控制器：**包含由 Amazon EMR（Amazon EMR）生成的文件，这些文件由尝试运行您的步骤时遇到的错误引起。如果您的步骤在加载时失败，您可以在此日志中找到堆栈跟踪。此处通常描述加载或访问您的应用程序的错误，以及缺少映射器文件错误。
+  **stderr** 包含处理步骤时发生的错误消息。此处通常介绍应用程序加载错误。此日志有时包含堆栈跟踪。
+ **stdout：**包含由映射器和折叠器（reducer）可执行文件生成的状态。此处通常介绍应用程序加载错误。此日志有时包含应用程序错误消息。
+ **syslog：**包含来自非 Amazon 软件（例如 Apache 和 Hadoop）的日志。流式传输错误通常在此处进行描述。

 检查 stderr 是否有明显的错误。如果 stderr 显示一个简短的错误列表，则该步骤会快速停止并引发错误。这通常由集群中运行的映射器和折叠器（reducer）应用程序中的错误引起。

 检查控制器和 syslog 的最后一行是否有错误或故障通知。注意有关失败任务的任何通知，特别是显示“Job Failed (任务失败)”的时候。

## 检查任务尝试日志
<a name="emr-troubleshoot-failed-4-task-logs"></a>

 如果在前面对步骤日志的分析中发现了一个或多个失败的任务，请调查相应任务尝试的日志，以获得更详细的错误信息。

# 步骤 5：分步测试 Amazon EMR 集群
<a name="emr-troubleshoot-failed-5-test-steps"></a>

 您尝试跟踪错误源时的一项有用的技术是重启集群并逐一向集群提交步骤。这可以让您检查每个步骤的结果然后才处理下一个步骤，让您有机会更正并重新运行失败的步骤。这也有一个优势，即您仅需上传一次输入数据。

**分步测试集群**

1.  启动新集群，启用保持活动状态和终止保护两种功能。保持活动状态可在集群处理了所有待执行的步骤后保持集群运行。终止保护可以防止集群在出现错误时关闭。有关更多信息，请参阅[将 Amazon EMR 集群配置为步骤执行后继续或终止](emr-plan-longrunning-transient.md)和[使用终止保护功能防止 Amazon EMR 集群意外关闭](UsingEMR_TerminationProtection.md)。

1.  向集群提交一个步骤。有关更多信息，请参阅 [将工作提交到 Amazon EMR 集群](emr-work-with-steps.md)。

1.  当该步骤完成处理后，检查步骤日志文件中是否有错误。有关更多信息，请参阅[步骤 4：检查 Amazon EMR 日志文件](emr-troubleshoot-failed-4.md)。查找这些日志文件最快的方法是连接到主节点并查看那里的日志文件。直到该步骤运行一些时间结束或失败，步骤日志文件才会出现。

1.  如果该步骤成功无误，运行下一个步骤。如果有错误，调查日志文件中的错误。如果是您的代码中的错误，更正并重新运行该步骤。继续操作直到所有步骤均运行无误。

1.  当您完成了集群调试想终止集群时，您必须手动终止该集群。这么做是必要的，因为集群启动时启用了终止保护。有关更多信息，请参阅 [使用终止保护功能防止 Amazon EMR 集群意外关闭](UsingEMR_TerminationProtection.md)。