

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

# Amazon EMR 集群操作期间的 VPC 错误
<a name="emr-troubleshoot-error-vpc"></a>

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

**Topics**
+ [

## 无效子网配置
](#emr-troubleshoot-error-gateway)
+ [

## 缺少 DHCP 选项集
](#emr-troubleshoot-error-dhcp)
+ [

## 权限错误
](#emr-troubleshoot-error-denied)
+ [

## 导致 `START_FAILED` 的错误
](#emr-troubleshoot-error-vpc-dns)
+ [

## 集`Terminated with errors`群 NameNode 但无法启动
](#emr-troubleshoot-namenode-dns)

## 无效子网配置
<a name="emr-troubleshoot-error-gateway"></a>

 在 **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 中添加互联网网关](https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Internet_Gateway.html)。

或者，验证您是否已经为 VPC 配置**启用 DNS 解析**并启用**启用 DNS 主机名支持**。有关更多信息，请参阅[将 DNS 与您的 VPC 一起使用](https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-dns.html)。

## 缺少 DHCP 选项集
<a name="emr-troubleshoot-error-dhcp"></a>

您可以看到集群系统日志 (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 （美国西部）区域，请将 domain-name 设置为，**us-gov-west-1.compute.internal**而不是以下示例中使用的值。
+ **domain-name** = **ec2.internal**

  如果您所在的区域是美国东部（弗吉尼亚北部），请使用 **ec2.internal**。对于其他地区，请使用*region-name***.compute.internal**。例如，在 us-west-2 中，请使用 **domain-name**=**us-west-2.compute.internal**。
+ **domain-name-servers** = **AmazonProvidedDNS**

有关更多信息，请参阅[ DHCP 选项集](https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_DHCP_Options.html)。

## 权限错误
<a name="emr-troubleshoot-error-denied"></a>

`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 终端节点并在创建该终端节点时在 Policy (策略) 选项下选择 **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` 的错误
<a name="emr-troubleshoot-error-vpc-dns"></a>

在 AMI 3.7.0 之前， VPCs 如果指定了主机名，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 但无法启动
<a name="emr-troubleshoot-namenode-dns"></a>

在使用自定义 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://amzn-s3-demo-bucket/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 记录。