

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 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.`

若要解決這個問題，您必須建立網際網路閘道，並將它連接到您的 VPC。如需詳細資訊，請參閱[將網際網路閘道新增至您的 VPC](https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Internet_Gateway.html)。

或者，確認您已將 VPC 中的 **Enable DNS resolution (啟用 DNS 解析)** 和 **Enable DNS hostname support (啟用 DNS 主機名稱支援)** 設定為啟用狀態。如需詳細資訊，請參閱[以 VPC 使用 DNS](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.`

若要解決這個問題，您必須設定包含 DHCP 選項集的 VPC，且其參數設定為以下值：

**注意**  
如果您使用 AWS GovCloud （美國西部） 區域，請將 domain-name 設定為 ，**us-gov-west-1.compute.internal**而不是下列範例中使用的值。
+ **domain-name (domain-name)** = **ec2.internal**

  如果您的區域是美國東部 (維吉尼亞北部)，請使用 **ec2.internal**。若是其他區域，則使用 *region-name***.compute.internal**。以 us-west-2 為例，使用 **domain-name (domain-name)**=**us-west-2.compute.internal**。
+ **domain-name-servers (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 端點，並於建立端點時選取「政策」選項底下的**全部允許**，提供所有儲存貯體的存取權限。
+ 確認與 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 以前，對於指定主機名稱的 VPC，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)
```

這是因為有一個潛在問題，那就是在 VPC 中啟動 EMR 叢集時，EC2 執行個體可能有多組完整域名稱，它會同時使用 AWS提供的 DNS 伺服器及使用者提供的自訂 DNS 伺服器。如果使用者提供的 DNS 伺服器未對 EMR 叢集中用來指定節點的任何 A 記錄提供任何指標 (PTR) 記錄，那麼叢集以此方式設定時，將會無法啟動。解決方法是針對 EC2 執行個體在 VPC 的任何一個子網路中啟動時所建立的每一個 A 記錄新增 1 個 PTR 記錄。