Amazon EMR
管理指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

资源错误

以下错误通常是由集群上受限制的资源导致的。

集群因 NO_SLAVE_LEFT 和核心节点 FAILED_BY_MASTER 而终止

通常,发生这一现象是因为禁用了终止保护,而且所有核心节点都超过了 yarn-site 配置分类(对应于 yarn-site.xml 文件)中最大利用率阈值指定的磁盘存储容量。默认情况下,该值为 90%。当核心节点的磁盘利用率超出此利用率阈值时,则 YARN NodeManager 运行状况服务会将节点报告为 UNHEALTHY。如果此节点处于此状态,Amazon EMR 会将此节点列入黑名单且不会向其分配 YARN 容器。如果此节点保持不正常状态 45 分钟,则 Amazon EMR 会把要终止的相关 Amazon EC2 实例标记为 FAILED_BY_MASTER。当与核心节点关联的所有 Amazon EC2 实例都被标记为终止时,集群将因没有资源用于执行作业而以 NO_SLAVE_LEFT 状态终止。

如果一个核心节点超过磁盘利用率,则可能会导致连锁反应。如果单个节点因 HDFS 而超过磁盘利用率阈值,那么其他节点很可能同样会接近阈值。第一个节点超过磁盘利用率阈值时,Amazon EMR 会将其列入黑名单。这会增加剩余节点的磁盘利用率负担,因为节点开始在自身之间复制其在已列入黑名单的节点上丢失的 HDFS 数据。每个节点随后都会以相同的方式进入 UNHEALTHY 状态,并且集群最终会终止。

最佳实践和建议

为集群硬件配置充足的存储容量

创建集群时,请确保有足够的核心节点并且每个节点都为 HDFS 提供足够的实例存储空间和 EBS 存储卷。有关更多信息,请参阅计算集群的必需的 HDFS 容量。您也可以手动或使用 Auto Scaling 功能,将核心实例添加到现有实例组。新实例与实例组中的其他实例具有相同的存储配置。有关更多信息,请参阅扩展集群资源

启用终止保护

启用终止保护。这样一来,如果核心节点被列入黑名单,您可以使用 SSH 连接到关联的 Amazon EC2 实例进行故障排除并恢复数据。如果启用终止保护,请注意,Amazon EMR 不会将该 Amazon EC2 实例替换为新实例。有关更多信息,请参阅使用终止保护

为 MRUnhealthyNodes CloudWatch 指标创建警报

此指标会报告其中报告了 UNHEALTHY 状态的节点的数量。此指标等同于 YARN 指标 mapred.resourcemanager.NoOfUnhealthyNodes。您可以为此警报设置通知,在节点维持不正常状态到达 45 分钟计时之前提醒您。有关更多信息,请参阅使用 CloudWatch 监控指标

使用 yarn-site 调整设置

下面的设置可以根据您的应用程序要求进行调整。例如,您可能需要通过提高 yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage 的值,来提高节点报告为 UNHEALTHY 的磁盘利用率阈值。

在使用 yarn-site 配置分类创建集群时,您可以设置这些值。有关更多信息,请参阅 Amazon EMR 版本指南中的配置应用程序。您还可以使用 SSH 连接到与核心节点关联的 Amazon EC2 实例,然后使用文本编辑器在 /etc/hadoop/conf.empty/yarn-site.xml 添加值。完成更改后,您必须按照以下方式重新启动 hadoop-yarn-nodemanager。

重要

当您重启 NodeManager 服务时,活动的 YARN 容器会被终止,除非在您创建集群时使用 yarn-site 配置分类将 yarn.nodemanager.recovery.enabled 设为 true。您还必须使用 yarn.nodemanager.recovery.dir 属性指定存储容器状态的目录。

sudo /sbin/stop hadoop-yarn-nodemanager sudo /sbin/start hadoop-yarn-nodemanager

有关当前 yarn-site 属性和默认值的更多信息,请参阅 Apache Hadoop 文档中的 YARN 默认设置

属性 默认值 说明

yarn.nodemanager.disk-health-checker.interval-ms

120000

磁盘运行状况检查程序运行的频率(以秒为单位)。

yarn.nodemanager.disk-health-checker.min-healthy-disks

0.25

NodeManager 的运行状况必须正常才能启动新容器的最小磁盘数量。这对应与 yarn.nodemanager.local-dirs(默认情况下,Amazon EMR 中的 /mnt/yarn)和 yarn.nodemanager.log-dirs(默认情况下,为 /var/log/hadoop-yarn/containers,与 Amazon EMR 中的 mnt/var/log/hadoop-yarn/containers 符号连链接)。

yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage

90.0

磁盘标记为故障后允许的磁盘空间利用率的最大百分比。值范围是 0.0 到 100.0。如果值大于或等于 100,则 NodeManager 会检查整个磁盘。这适用于 yarn-nodemanager.local-dirsyarn.nodemanager.log-dirs

yarn.nodemanager.disk-health-checker.min-free-space-per-disk-mb

0

磁盘上可供使用的最小空间。这适用于 yarn-nodemanager.local-dirsyarn.nodemanager.log-dirs

您的集群是否有足够的 HDFS 空间?

如果没有,Amazon EMR 会返回以下错误:“Cannot replicate block, only managed to replicate to zero nodes (无法复制数据块,仅设法复制到零节点)”。 当您在集群中生成的数据多于 HDFS 中可以存储的数据时,会发生此错误。只有在集群运行时您才会看到此错误,因为当集群结束时,它会释放所使用的 HDFS 空间。

向集群提供的 HDFS 空间量取决于用作核心节点的 Amazon EC2 实例的数量和类型。HDFS 可以使用每个 Amazon EC2 实例上的所有磁盘空间。有关每个 EC2 实例类型的本地存储量的详细信息,请参阅 Amazon EC2 用户指南(适用于 Linux 实例)中的实例类型和系列

另一个会影响可用 HDFS 空间量的因素是重复因子,即为冗余数据存储在 HDFS 中的每个数据块的副本数量。重复因子会随着集群中的节点数量而增加:对于拥有 10 个或更多节点的集群,每个数据块有 3 个副本;对于拥有 4 个至 9 个节点的集群,每个数据块有 2 个副本;对于拥有 3 个或更少节点的集群,每个数据块有 1 个副本 (无冗余)。用 HDFS 的总可用空间除以重复因子。有些情况下,例如将节点数量从 9 增加到 10 时,重复因子的增大实际上会导致 HDFS 的可用空间量下降。

例如,拥有 10 个 m1.large 类型核心节点的集群会向 HDFS 提供 2833 GB 的空间 ((10 节点 X 每个节点 850 GB) /重复因子 3)。

如果您的集群占用空间超过了为 HDFS 提供的空间,您可以向集群添加额外核心节点;或使用数据压缩创建更多 HDFS 空间。如果您的集群可以停止和重启,您可以考虑使用更大 Amazon EC2 实例类型的核心节点。您还可以考虑调整重复因子。然而,应当注意,减小重复因子会降低 HDFS 数据的冗余程度以及集群从丢失或损坏的 HDFS 数据块中恢复的能力。

看到“EC2 Quota Exceeded (超过 EC2 配额)”错误?

如果您收到指示超出 Amazon EC2 实例配额的消息,可能存在多种原因。根据配置差异,以前的集群可能需要 5-20 分钟的时间才能终止并释放分配的资源。如果您在尝试启动集群时收到 EC2 QUOTA EXCEEDED 错误,原因可能是最近终止的集群中的资源尚未释放。而且,如果您尝试调整实例组的大小,则在新目标大小大于账户的当前实例配额时也可能会遇到此错误。在这些情况下,可以终止集群,然后使用较小的目标大小启动集群。在所有情况下,您都可以终止未使用的集群资源或 EC2 实例、请求增加 Amazon EC2 配额或等待重新启动集群。

注意

不能向同一个集群发出多个大小调整请求。因此,如果第一个请求失败,则您可能必须终止当前集群,然后使用所需实例数启动另一个集群。

您是否看到“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 更改为更长时间,实现上述目的。有关更多信息,请参阅 创建引导操作以安装其他软件

  • 使 Reducer 计数与集群的总 Reducer 容量相符。您可以通过调整作业的 Hadoop 配置设置 mapred.reduce.tasks,实现上述目的。

  • 使用组合器类代码,将需要提取的输出量降至最低。

  • 进行检查,以确保 Amazon EC2 服务不存在影响集群网络性能的问题。您可以使用服务运行状况仪表板实现上述目的。

  • 查看集群中实例的 CPU 和内存资源,确保数据处理不会淹没节点的资源。有关更多信息,请参阅 配置集群硬件和联网

  • 检查 Amazon EMR 集群中使用的亚马逊系统映像 (AMI) 的版本。如果版本是 2.3.0 到 2.4.4 (含)。请更新为最高版本。指定范围中的 AMI 版本所用的 Jetty 版本可能无法从映射阶段提供输出。当 Reducer 无法从映射阶段获取输出时,会发生提取错误。

    Jetty 是一种开源 HTTP 服务器,用于 Hadoop 集群中的机器间通信。

您是否看到“File could only be replicated to 0 nodes instead of 1”错误?

当将文件写入 HDFS 时,会复制到多个核心节点。当您看到此错误时,就意味着 NameNode 守护程序中没有将数据写入 HDFS 的可用 DataNode 实例。换句话说,没有发生数据块复制。此错误可能是由多种问题导致的:

  • HDFS 文件系统可能已经用尽了空间。这是最有可能的原因。

  • 运行作业时,DataNode 实例可能并不可用。

  • 可能已经阻止 DataNode 实例与主节点进行通信。

  • 核心实例组中的实例可能并不可用。

  • 权限可能会缺失。例如,JobTracker 守护程序可能不具有创建作业跟踪程序信息的权限。

  • DataNode 实例的预留空间设置可能并不足够。通过检查 dfs.datanode.du.reserved 配置设置,确定情况是否如此。

要检查此问题是否是由 HDFS 用尽磁盘空间导致的,请查看 CloudWatch 中的 HDFSUtilization 指标。如果此值过高,您可以将其他核心节点添加到此集群。如果有一个您认为可能会用尽 HDFS 磁盘空间的集群,那么您可以在 CloudWatch 中设置一个警报,以便当 HDFSUtilization 的值超出某一水平时提醒您。有关更多信息,请参阅 手动调整正在运行的集群的大小使用 CloudWatch 监控指标

如果问题不是 HDFS 用尽了空间,请检查 DataNode 日志、NameNode 日志和网络连接,以找出可能阻止 HDFS 复制数据的其他问题。有关更多信息,请参阅 查看日志文件

您的 节点是否被列入黑名单?

NodeManager 守护程序负责在核心节点和任务节点上启动和管理容器。该容器由主节点上运行的 ResourceManager 守护程序分配给 NodeManager 守护程序。ResourceManager 通过检测信号监控 NodeManager 节点。

在下列情况下,ResourceManager 守护程序会将 NodeManager 节点列入黑名单,将此节点从可用于处理任务的节点库中删除:

  • 如果 NodeManager 在过去的 10 分钟(60000 毫秒)内尚未向 ResourceManager 守护程序发送检测信号。可以使用 yarn.nm.liveness-monitor.expiry-interval-ms 配置设置来配置此时间段。有关更改 Yarn 配置设置的更多信息,请参阅 Amazon EMR 版本指南中的配置应用程序

  • NodeManager 检查由 yarn.nodemanager.local-dirsyarn.nodemanager.log-dirs 确定的磁盘的运行状况。该检查包括权限和可用磁盘空间 (< 90%)。如果磁盘未通过检查,则 NodeManager 将停止使用该特定磁盘,但仍将节点状态报告为正常。如果大量磁盘未通过检查,则向 ResourceManager 报告的节点状态为不正常,并且不会向节点分配新容器。

主应用程序也可将 NodeManager 节点列入黑名单(如果该节点包含 3 个以上的失败任务)。您可以使用 mapreduce.job.maxtaskfailures.per.tracker 配置参数将此值更改为更高的值。您可以更改的其他配置设置可控制将任务标记为失败之前的尝试次数:用于映射任务的 mapreduce.map.max.attempts 和用于缩减任务的 mapreduce.reduce.maxattempts。有关更改配置设置的更多信息,请参阅 Amazon EMR 版本指南 中的配置应用程序