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

VPC 错误

Amazon EMR 的 VPC 配置常会出现以下错误。

无效子网配置

Cluster Details (集群详细信息) 页面的 Status (状态) 字段中,您会看到与以下内容相似的错误:

The subnet configuration was invalid: Cannot find route to InternetGateway in main RouteTable rtb-id for vpc vpc-id.

要解决此问题,您必须创建 Internet 网关并将其连接到您的 VPC。有关更多信息,请参阅在您的 VPC 中添加 Internet 网关

或者,验证您是否已经为 VPC 配置 Enable DNS resolution (启用 DNS 解析) 并启用 Enable DNS hostname support (启用 DNS 主机名支持)。有关更多信息,请参阅在您的 VPC 中使用 DNS

缺少 DHCP 选项集

您可以看到集群系统日志 (syslog) 的步骤失败信息包含与以下内容相似的错误:

ERROR org.apache.hadoop.security.UserGroupInformation (main): PriviledgedActionException as:hadoop (auth:SIMPLE) cause:java.io.IOException: org.apache.hadoop.yarn.exceptions.ApplicationNotFoundException: Application with id 'application_id' doesn't exist in RM.

或者

ERROR org.apache.hadoop.streaming.StreamJob (main): Error Launching job : org.apache.hadoop.yarn.exceptions.ApplicationNotFoundException: Application with id 'application_id' doesn't exist in RM.

要解决此问题,必须配置 VPC,使其包含将参数设置为以下值的 DHCP 选项集:

注意

如果您使用 AWS GovCloud (US) 区域,则将域名设置为 us-gov-west-1.compute.internal,不应设置为以下示例中使用的值。

  • domain-name = ec2.internal

    如果您的区域是 ,请使用 ec2.internalUS East (N. Virginia)。对于其他区域,请使用 region-name.compute.internal。例如,在 us-west-2 中,请使用 domain-name=us-west-2.compute.internal

  • domain-name-servers = AmazonProvidedDNS

有关更多信息,请参阅 DHCP 选项集

权限错误

stderr 日志中记录的某个步骤失败表示 Amazon S3 资源没有适当的权限。这是一个 403 错误,内容如下所示:

Exception in thread "main" com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: REQUEST_ID

如果 ActionOnFailure 设置为 TERMINATE_JOB_FLOW,则将导致集群以 SHUTDOWN_COMPLETED_WITH_ERRORS 状态终止。

可通过几种方法解决此问题,包括:

  • 如果您正在 VPC 中使用 Amazon S3 存储桶策略,请确保通过创建一个 VPC 终端节点并在创建该终端节点时在“策略”选项下选择 Allow all 来授予对所有存储桶的访问权限。

  • 确保与 S3 资源关联的任何策略都包括您从中启动集群的 VPC。

  • 尝试从集群中运行以下命令来验证您是否能访问存储桶

    hadoop fs -copyToLocal s3://path-to-bucket /tmp/
  • 通过在集群上的 log4j.logger.org.apache.http.wire 文件中将 DEBUG 参数设置为 /home/hadoop/conf/log4j.properties,可以获得更具体的调试信息。在尝试从集群访问存储桶后,可以查看 stderr 日志文件。该日志文件将提供更多详细信息:

    Access denied for getting the prefix for bucket - us-west-2.elasticmapreduce with path samples/wordcount/input/ 15/03/25 23:46:20 DEBUG http.wire: >> "GET /?prefix=samples%2Fwordcount%2Finput%2F&delimiter=%2F&max-keys=1 HTTP/1.1[\r][\n]" 15/03/25 23:46:20 DEBUG http.wire: >> "Host: us-west-2.elasticmapreduce.s3.amazonaws.com[\r][\n]"

导致 START_FAILED 的错误

在 AMI 3.7.0 之前,对于主机名为指定的 Amazon EC2 实例的 VPC,Amazon EMR Amazon EMR 将映射带自定义域地址的子网的内部主机名,如下所示:ip-X.X.X.X.customdomain.com.tld。例如,如果主机名为 ip-10.0.0.10 且 VPC 已将域名选项设置为 customdomain.com,则 Amazon EMR 映射的结果主机名将为 ip-10.0.1.0.customdomain.com。这将在 /etc/hosts 中添加一个条目来将主机名解析为 10.0.0.10。此行为已随 AMI 3.7.0 更改,现在 Amazon EMR 将完全遵循 VPC 的 DHCP 配置。以前,客户还可使用引导操作来指定主机名映射。

如果您想保留此行为,则必须提供 DNS,并为自定义域转发所需的解析设置。

集群 Terminated with errors 和 NameNode 无法启动

在使用自定义 DNS 域名的 VPC 中启动 EMR 集群时,您的集群可能会启动失败并在控制台中显示以下错误消息:

Terminated with errors On the master instance(instance-id), bootstrap action 1 returned a non-zero return code

此故障是由 NameNode 无法启动导致的。这会导致 NameNode 日志中出现以下错误,其 Amazon S3 URI 使用以下格式:s3://mybucket/logs/cluster-id/daemons/master instance-id/hadoop-hadoop-namenode-master node hostname.log.gz:

2015-07-23 20:17:06,266 WARN org.apache.hadoop.hdfs.server.namenode.FSNamesystem (main): Encountered exception loading fsimage java.io.IOException: NameNode is not formatted. at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:212) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFSImage(FSNamesystem.java:1020) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFromDisk(FSNamesystem.java:739) at org.apache.hadoop.hdfs.server.namenode.NameNode.loadNamesystem(NameNode.java:537) at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:596) at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:765) at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:749) at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1441) at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1507)

这是由一个潜在问题造成的:由于同时使用了 AWS 提供的 DNS 服务器和用户提供的自定义 DNS 服务器,在 VPC 中启动 EMR 集群时,EC2 实例可能拥有多组完全限定域名。如果用户提供的 DNS 服务器未为用于指定 EMR 集群中节点的任何 A 记录提供任何指针 (PTR) 记录,则这种配置方式会导致集群启动失败。解决方案是为每个 A 记录 (在 VPC 的任意子网中启动 EC2 实例时创建) 添加 1 条 PTR 记录。