本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
以下是 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
.
若要解決這個問題,您必須建立網際網路閘道,並將它連接到您的 VPC。如需詳細資訊,請參閱將網際網路閘道新增至您的 VPC。
或者,確認您已將 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.
若要解決這個問題,您必須設定包含 DHCP 選項集的 VPC,且其參數設定為以下值:
注意
如果您使用 AWS GovCloud (US-West) 區域,請將 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 選項集。
許可錯誤
在 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
的錯誤
在 AMI 3.7.0 以前,對於指定主機名稱的 VPC,Amazon EMR 會將子網路的內部主機名稱與自訂網域地址映射,如下所示:ip-
。例如,如果主機名稱是 X.X.X.X.customdomain.com
.tldip-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://
: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 記錄。