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

资源错误

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

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

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

向集群提供的 HDFS 空间量取决于用作核心节点的 Amazon EC2 实例的数量和类型。HDFS 可以使用每个 Amazon EC2 实例上的所有磁盘空间。有关每个 EC2 实例类型的本地存储量的详细信息,请参阅 Amazon EC2 User Guide for Linux Instances 中的 Instance Types and Families

另一个会影响可用 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 复制数据的其他问题。有关更多信息,请参阅 查看日志文件

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

TaskTracker 节点是集群中可以接受 map-reduce 任务的节点。这些是由 JobTracker 守护程序分配的。JobTracker 通过检测信号监控 TaskTracker 节点。

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

  • 如果 TaskTracker 节点在过去的 10 分钟 (60000 毫秒) 内尚未向 JobTracker 守护程序发送检测信号。可以使用 mapred.tasktracker.expiry.interval 配置设置来配置此时间段。有关更改 Hadoop 配置设置的详细信息,请参阅创建引导操作以安装其他软件

  • 如果 TaskTracker 节点中的失败任务超过 4 个。您可以使用 modify mapred.max.tracker.failures 配置参数将此值更改为更高的值。建议您更改的其他配置设置为用于控制将任务标记为失败之前尝试次数的设置:映射任务的 mapred.map.max.attempts 设置和 reduce 任务的 mapreduce.reduce.maxattempts 设置。有关更改 Hadoop 配置设置的更多信息,请参阅 创建引导操作以安装其他软件

您可以使用 CloudWatch CLI 来查看列入黑名单的 TaskTracker 节点数量。以下示例显示了实现此目的的命令。有关更多信息,请参阅 Amazon CloudWatch CLI Reference

mon-get-stats NoOfBlackListedTaskTrackers --dimensions JobFlowId=JobFlowID --statistics Maximum --namespace AWS/ElasticMapReduce

以下示例显示了如何启动集群,然后使用引导操作将 mapred.max.tracker.failures 的值设置为 7,而不是默认值 4。

请使用 AWS CLI 键入以下命令,并将 myKey 替换为您的 EC2 密钥对的名称。

aws emr create-cluster --name "Test cluster" --ami-version 2.4 --applications Name=Hive Name=Pig \ --use-default-roles --ec2-attributes KeyName=myKey \ --instance-groups InstanceGroupType=MASTER,InstanceCount=1,InstanceType=m4.large InstanceGroupType=CORE,InstanceCount=2,InstanceType=m4.large \ --bootstrap-actions Path=s3://elasticmapreduce/bootstrap-actions/configure-hadoop,Name="Modified mapred.max.tracker.failures",Args=["-m","mapred.max.tracker.failures=7"]

注意

如果您之前未创建默认 EMR 服务角色和 EC2 实例配置文件,请先键入 aws emr create-default-roles 创建它们,然后再键入 create-cluster 子命令。

使用上例启动集群时,您可以连接到主节点并在 /home/hadoop/conf/mapred-site.xml 中查看更改的配置设置。修改后的行会如以下示例所示。

<property><name>mapred.max.tracker.failures</name><value>7</value></property>