Amazon EMR 集群错误:Too many fetch-failures
步骤或任务尝试日志中的“Too many fetch-failures”或“Error reading task output”错误消息表示,正在运行的任务取决于另一任务的输出。当 reduce 任务在队列中等待执行和需要一个或多个映射任务的输出以及系统尚未提供输出时,通常会发生此错误。
有几个原因会导致输出可能不可用:
-
前提任务仍在处理中。这通常是一个映射任务。
-
如果数据存储在不同的实例上,那么数据不可用的原因可能是网络连接较差。
-
如果 HDFS 用于检索输出,那么 HDFS 可能会出现问题。
此错误的最常见原因是之前的任务仍在处理中。如果在 reduce 任务最初尝试运行时发生了此错误,那么极可能是上述原因造成的。您可以通过检查返回此错误的集群步骤的 syslog 日志,确定情况是否如此。如果 syslog 显示了 map-reduce 任务的执行进度,这表明在还有尚未完成的映射任务的同时 reduce 阶段已经开始。
要在日志中寻找的是映射进度百分比,此值会上升到 100% 然后回落到更低值。当映射百分比是 100% 时,这并不意味着所有的映射任务都已完成。它仅仅意味着 Hadoop 正在执行所有映射任务。如果此值降到 100% 以下,则意味着映射任务已失败,然后 Hadoop 可能会根据配置试图重新计划任务。如果日志中映射百分比保持在 100%,请查看 CloudWatch 指标,特别是 RunningMapTasks
,以检查映射任务是否仍在处理中。您还可以使用主节点上的 Hadoop Web 界面找到此信息。
如果您看到此问题,那么可以尝试以下几件事情:
-
使 reduce 阶段在开始前等待更长时间。您可以通过将 Hadoop 配置设置 mapred.reduce.slowstart.completed.maps 更改为更长时间,实现上述目的。有关更多信息,请参阅创建引导操作以使用 Amazon EMR 集群安装其他软件。
-
使 Reducer 计数与集群的总 Reducer 容量相符。您可以通过调整作业的 Hadoop 配置设置 mapred.reduce.tasks,实现上述目的。
-
使用组合器类代码,将需要提取的输出量降至最低。
-
进行检查,以确保 Amazon EC2 服务不存在影响集群网络性能的问题。您可以使用 Service Health Dashboard
实现上述目的。 -
查看集群中实例的 CPU 和内存资源,确保数据处理不会淹没节点的资源。有关更多信息,请参阅配置 Amazon EMR 集群硬件和联网。
检查 Amazon EMR 集群中使用的 Amazon Machine Image(AMI)的版本。如果版本是 2.3.0 到 2.4.4 (含)。请更新为最高版本。指定范围中的 AMI 版本所用的 Jetty 版本可能无法从映射阶段提供输出。当 Reducer 无法从映射阶段获取输出时,会发生提取错误。
Jetty 是一种开源 HTTP 服务器,用于 Hadoop 集群中的机器间通信。