本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
如果在中遇到錯誤 AWS Glue,請使用下列資訊來協助您尋找問題的來源並加以修正。
注意
AWS Glue GitHub 存放庫包含AWS Glue
常見問題集
主題
- 錯誤:資源無法使用
- 錯誤: subnetId 在中找不到適用的 S3 端點或NAT閘道 VPC
- 錯誤:安全群組需有傳入規則
- 錯誤:安全群組需有傳出規則
- 錯誤:Job 執行失敗,因為應將傳遞的角色指定為 AWS Glue 服務的角色權限
- 錯誤: DescribeVpcEndpoints 動作未經授權。無法驗證 ID vpc-id VPC
- 錯誤: DescribeRouteTables 操作未經授權。無法驗證子網 ID:id 中的子網絡 ID:vpc-id VPC
- 錯誤:無法調用 ec2:DescribeSubnets
- 錯誤:無法調用 ec2:DescribeSecurityGroups
- 錯誤:找不到可用區域的子網路
- 錯誤:寫入JDBC目標時 Job 執行異常
- 錯誤:Amazon S3:該操作對象的存儲類無效
- 錯誤:Amazon S3 逾時
- 錯誤:Amazon S3 存取遭拒
- 錯誤:Amazon S3 存取金鑰 ID 不存在
- 錯誤:使用存取 Amazon S3 時,Job 執行失敗 s3a:// URI
- 錯誤:Amazon S3 服務符記已過期
- 錯誤:找不到專DNS用的網路介面
- 錯誤:開發端點佈建失敗
- 錯誤:筆記本伺服器 CREATE _ FAILED
- 錯誤:本機筆記本無法啟動
- 錯誤:爬蟲程式執行失敗
- 錯誤:未更新分割區
- 錯誤:由於版本不相符,任務書籤更新失敗
- 錯誤:當任務書籤啟用時,任務會重新處理資料
- 錯誤:VPCs中之間的容錯移轉行為 AWS Glue
錯誤:資源無法使用
如果 AWS Glue 傳回無法使用資源的訊息,您可以檢視錯誤訊息或記錄檔,以協助您進一步瞭解問題。以下任務說明一般的故障診斷方法。
-
針對您所使用的任何連線和開發端點,請檢查您的叢集是否仍有彈性網路界面可用。
錯誤: subnetId 在中找不到適用的 S3 端點或NAT閘道 VPC
檢查訊息中的子網路 VPC ID 和 ID,以協助您診斷問題。
-
檢查您是否已設定 Amazon S3 VPC 端點,這是 AWS Glue. 此外,請檢查NAT閘道是否屬於您組態的一部分。如需詳細資訊,請參閱Amazon S3 的 VPC 端點。
錯誤:安全群組需有傳入規則
必須至少有一個安全群組開啟所有傳入連接埠。若要限制流量,傳入規則中的來源安全群組可以限制為相同的安全群組。
-
針對您所使用的任何連線,請檢查自我參考的傳入規則的安全群組。如需詳細資訊,請參閱設定對資料存放區的網路存取。
-
使用的是開發端點時,請檢查自我參考的傳入規則的安全群組。如需詳細資訊,請參閱設定對資料存放區的網路存取。
錯誤:安全群組需有傳出規則
必須至少有一個安全群組開啟所有傳出連接埠。若要限制流量,傳出規則中的來源安全群組可以限制為相同的安全群組。
-
針對您所使用的任何連線,請檢查自我參考的傳出規則的安全群組。如需詳細資訊,請參閱設定對資料存放區的網路存取。
-
使用的是開發端點時,請檢查自我參考的傳出規則的安全群組。如需詳細資訊,請參閱設定對資料存放區的網路存取。
錯誤:Job 執行失敗,因為應將傳遞的角色指定為 AWS Glue 服務的角色權限
定義任務的使用者需擁有 AWS Glue的 iam:PassRole
許可。
-
當使用者建立 AWS Glue 工作時,請確認使用者的角色包含的策略包含
iam:PassRole
AWS Glue。如需詳細資訊,請參閱步驟 3:將政策連接至存取 的使用者或群組 AWS Glue。
錯誤: DescribeVpcEndpoints 動作未經授權。無法驗證 ID vpc-id VPC
-
檢查傳遞給的政策以 AWS Glue 獲取
ec2:DescribeVpcEndpoints
權限。
錯誤: DescribeRouteTables 操作未經授權。無法驗證子網 ID:id 中的子網絡 ID:vpc-id VPC
-
檢查傳遞給的政策以 AWS Glue 獲取
ec2:DescribeRouteTables
權限。
錯誤:無法調用 ec2:DescribeSubnets
-
檢查傳遞給的政策以 AWS Glue 獲取
ec2:DescribeSubnets
權限。
錯誤:無法調用 ec2:DescribeSecurityGroups
-
檢查傳遞給的政策以 AWS Glue 獲取
ec2:DescribeSecurityGroups
權限。
錯誤:找不到可用區域的子網路
-
可用區域可能不適用於 AWS Glue。建立並使用可用區域中新的子網路,與訊息中所指定的可用區域不同。
錯誤:寫入JDBC目標時 Job 執行異常
當您執行寫入JDBC目標的工作時,工作可能會在下列情況中遇到錯誤:
-
如果您的工作寫入 Microsoft SQL Server 資料表,而且該資料表具有定義為類型的資料行
Boolean
,則必須在SQL伺服器資料庫中預先定義資料表。當您在 AWS Glue 主控台上使用SQL伺服器目標與 [在資料目標中建立資料表] 選項來定義工作時,請勿將任何來源資料行對應至具有資料類型的目標資料行Boolean
。執行任務時可能會發生錯誤。您可以執行以下動作避免錯誤:
-
選擇含有 布林值 欄的現有資料表。
-
編輯
ApplyMapping
轉換,並將來源的布林值欄映射至目標的數字或字串。 -
編輯
ApplyMapping
轉換,移除來源中的布林值欄。
-
-
如果您的任務寫入到 Oracle 資料表,您可能需要調整 Oracle 物件名稱的長度。在某些版本的 Oracle,最大的 ID 長度限制為 30 位元組或 128 位元組。此限制影響 Oracle 目標資料存放區的資料表名稱和欄名稱。
您可以執行以下動作避免錯誤:
-
依照版本的限制為 Oracle 目標資料表命名。
-
預設欄名稱從資料的欄位名稱產生。當欄名稱長度超過限制時,請使用
ApplyMapping
或RenameField
轉換變更欄的名稱,以符合限制。
-
錯誤:Amazon S3:該操作對象的存儲類無效
如果 AWS Glue 傳回此錯誤,則您的 AWS Glue 任務可能已從跨 Amazon S3 儲存類別層級具有分割區的表格讀取資料。
-
透過使用儲存類別排除項,您可以確保您 AWS Glue 的工作可以在跨這些儲存類別層級具有分割區的表格上運作。如果沒有排除,則從這些層讀取資料的作業會失敗,並出現下列錯誤:
AmazonS3Exception: The operation is not valid for the object's storage class
。如需詳細資訊,請參閱排除 Amazon S3 儲存體方案。
錯誤:Amazon S3 逾時
如果 AWS Glue 傳回連線逾時錯誤,可能是因為它嘗試存取另一個 AWS 區域中的 Amazon S3 儲存貯體。
-
Amazon S3 VPC 端點只能將流量路由到 AWS 區域內的儲存貯體。如果您需要連線至其他區域中的儲存貯體,可能的因應措施是使用NAT閘道。如需詳細資訊,請參閱NAT閘道。
錯誤:Amazon S3 存取遭拒
如果 AWS Glue 傳回 Amazon S3 儲存貯體或物件的存取遭拒錯誤,可能是因為提供的IAM角色沒有具有資料存放區權限的政策。
-
任ETL務必須能夠存取做為來源或目標的 Amazon S3 資料存放區。爬蟲程式必須能夠存取編目的 Amazon S3 資料存放區。如需詳細資訊,請參閱步驟 2:建立IAM角色 AWS Glue。
錯誤:Amazon S3 存取金鑰 ID 不存在
如果在運行作業時 AWS Glue 返回訪問密鑰 ID 不存在錯誤,則可能是由於以下原因之一:
-
ETL工作使用IAM角色來存取資料存放區,確認工作的IAM角色在工作開始之前未刪除。
-
IAM角色包含存取資料存放區的許可,請確認包含的任何附加 Amazon S3 政策
s3:ListBucket
是否正確。
錯誤:使用存取 Amazon S3 時,Job 執行失敗 s3a://
URI
如果工作執行傳回錯誤,例如使用處理程式類別剖析XML文件失敗,可能是因為嘗試使用 s3a://
URI. 請s3://
URI改用存取您的資料存放區。以下例外狀況的追蹤會反白錯誤以尋找:
1. com.amazonaws.SdkClientException: Failed to parse XML document with handler class com.amazonaws.services.s3.model.transform.XmlResponsesSaxParser$ListBucketHandler 2. at com.amazonaws.services.s3.model.transform.XmlResponsesSaxParser.parseXmlInputStream(XmlResponsesSaxParser.java:161) 3. at com.amazonaws.services.s3.model.transform.XmlResponsesSaxParser.parseListBucketObjectsResponse(XmlResponsesSaxParser.java:317) 4. at com.amazonaws.services.s3.model.transform.Unmarshallers$ListObjectsUnmarshaller.unmarshall(Unmarshallers.java:70) 5. at com.amazonaws.services.s3.model.transform.Unmarshallers$ListObjectsUnmarshaller.unmarshall(Unmarshallers.java:59) 6. at com.amazonaws.services.s3.internal.S3XmlResponseHandler.handle(S3XmlResponseHandler.java:62) 7. at com.amazonaws.services.s3.internal.S3XmlResponseHandler.handle(S3XmlResponseHandler.java:31) 8. at com.amazonaws.http.response.AwsResponseHandlerAdapter.handle(AwsResponseHandlerAdapter.java:70) 9. at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleResponse(AmazonHttpClient.java:1554) 10. at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1272) 11. at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1056) 12. at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:743) 13. at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:717) 14. at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:699) 15. at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:667) 16. at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:649) 17. at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:513) 18. at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4325) 19. at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4272) 20. at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4266) 21. at com.amazonaws.services.s3.AmazonS3Client.listObjects(AmazonS3Client.java:834) 22. at org.apache.hadoop.fs.s3a.S3AFileSystem.getFileStatus(S3AFileSystem.java:971) 23. at org.apache.hadoop.fs.s3a.S3AFileSystem.deleteUnnecessaryFakeDirectories(S3AFileSystem.java:1155) 24. at org.apache.hadoop.fs.s3a.S3AFileSystem.finishedWrite(S3AFileSystem.java:1144) 25. at org.apache.hadoop.fs.s3a.S3AOutputStream.close(S3AOutputStream.java:142) 26. at org.apache.hadoop.fs.FSDataOutputStream$PositionCache.close(FSDataOutputStream.java:74) 27. at org.apache.hadoop.fs.FSDataOutputStream.close(FSDataOutputStream.java:108) 28. at org.apache.parquet.hadoop.ParquetFileWriter.end(ParquetFileWriter.java:467) 29. at org.apache.parquet.hadoop.InternalParquetRecordWriter.close(InternalParquetRecordWriter.java:117) 30. at org.apache.parquet.hadoop.ParquetRecordWriter.close(ParquetRecordWriter.java:112) 31. at org.apache.spark.sql.execution.datasources.parquet.ParquetOutputWriter.close(ParquetOutputWriter.scala:44) 32. at org.apache.spark.sql.execution.datasources.FileFormatWriter$SingleDirectoryWriteTask.releaseResources(FileFormatWriter.scala:252) 33. at org.apache.spark.sql.execution.datasources.FileFormatWriter$$anonfun$org$apache$spark$sql$execution$datasources$FileFormatWriter$$executeTask$3.apply(FileFormatWriter.scala:191) 34. at org.apache.spark.sql.execution.datasources.FileFormatWriter$$anonfun$org$apache$spark$sql$execution$datasources$FileFormatWriter$$executeTask$3.apply(FileFormatWriter.scala:188) 35. at org.apache.spark.util.Utils$.tryWithSafeFinallyAndFailureCallbacks(Utils.scala:1341) 36. at org.apache.spark.sql.execution.datasources.FileFormatWriter$.org$apache$spark$sql$execution$datasources$FileFormatWriter$$executeTask(FileFormatWriter.scala:193) 37. at org.apache.spark.sql.execution.datasources.FileFormatWriter$$anonfun$write$1$$anonfun$3.apply(FileFormatWriter.scala:129) 38. at org.apache.spark.sql.execution.datasources.FileFormatWriter$$anonfun$write$1$$anonfun$3.apply(FileFormatWriter.scala:128) 39. at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87) 40. at org.apache.spark.scheduler.Task.run(Task.scala:99) 41. at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:282) 42. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 43. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 44. at java.lang.Thread.run(Thread.java:748)
錯誤:Amazon S3 服務符記已過期
在移動 Amazon Redshift 的資料時,所使用的臨時 Amazon S3 憑證將於 1 小時之後過期。如果您有長時間執行的任務,則可能會失敗。如需如何設定長時間執行任務以便移動 Amazon Redshift 資料的詳細資訊,請參閱aws-glue-programming-etl-connect-redshift-home。
錯誤:找不到專DNS用的網路介面
如果任務失敗或開發端點無法佈建,可能是因為網路設定有問題。
-
如果您使用 Amazon 提供DNS的值
enableDnsHostnames
必須設置為 true。如需詳細資訊,請參閱DNS。
錯誤:開發端點佈建失敗
如果 AWS Glue 無法成功佈建開發端點,可能是因為網路設定中的問題。
-
當您定義開發端點時VPC,會驗證子網路和安全群組,以確認其符合特定需求。
-
如果您提供了可選的SSH公鑰,請檢查它是否為有效的SSH公鑰。
-
檢查您VPC使用有效DHCP選項集的VPC控制台。如需詳細資訊,請參閱DHCP選項集。
-
如果叢集仍處於狀PROVISIONING態,請連絡 AWS Support。
錯誤:筆記本伺服器 CREATE _ FAILED
如果 AWS Glue 無法為開發端點建立筆記本伺服器,可能是因為下列其中一個問題:
-
AWS Glue 在設置筆記本電腦服務器EC2時將IAM角色傳遞給 Amazon。該IAM角色必須與 Amazon 建立信任關係EC2。
-
IAM角色必須具有相同名稱的執行個體設定檔。當您EC2使用IAM主控台為 Amazon 建立角色時,會自動建立具有相同名稱的執行個體設定檔。檢查日誌內是否有關於執行個體描述檔名稱
iamInstanceProfile.name
無效的錯誤。有關詳情,請參閱使用執行個體設定檔。 -
確認您的角色有許可存取傳送要建立筆記本伺服器之政策內的
aws-glue*
儲存貯體。
錯誤:本機筆記本無法啟動
如果您的本機筆記本無法啟動且回報找不到目錄或資料夾的錯誤,可能是因為下列其中一個問題:
-
如果您在 Microsoft Windows 上執行,請確定
JAVA_HOME
環境變數指向正確的 Java 目錄。無需更新此變數即可更新 Java,如果指向已不存在的資料夾,Jupyter 筆記本將無法啟動。
錯誤:爬蟲程式執行失敗
如果 AWS Glue 無法順利執行爬行者程式來編目您的資料,可能是因為下列其中一個原因。先檢查看看 AWS Glue 主控台爬蟲程式清單中是否出現錯誤。查看爬蟲程式名稱旁是否有驚嘆號 圖示,並將滑鼠移到圖示上方,查看任何相關的訊息。
-
檢查「記錄檔」
/aws-glue/crawlers
下執行之爬行者程式的 CloudWatch 記錄檔。
錯誤:未更新分割區
如果您在執行ETL工作時未更新資料目錄中的磁碟分割, CloudWatch 記錄檔中DataSink
類別的這些記錄陳述式可能會有所幫助:
-
「
Attempting to fast-forward updates to the Catalog - nameSpace:
" — 顯示此工作嘗試修改 catalogId 的資料庫、表格和。如果這裡沒有此陳述式,請檢查enableUpdateCatalog
是否設為 true,並做為getSink()
參數或在additional_options
中正確傳遞。 -
"
Schema change policy behavior:
" — 顯示您要傳入的結構描述updateBehavior
值。 -
"
Schemas qualify (schema compare):
" — 將會是 true 或 false。 -
"
Schemas qualify (case-insensitive compare):
" — 將會是 true 或 false。 -
如果兩者皆為 false 且未設定為
UPDATE_IN_DATABASE
,則您的 DynamicFrame 結構描述必須相同,或包含在「資料目錄」表格結構描述中看到的欄子集。updateBehavior
如需有關更新分割區的詳細資訊,請參閱 更新結構描述,並使用 在 Data Catalog 中新增分割區 AWS Glue ETL 任務。
錯誤:由於版本不相符,任務書籤更新失敗
您可能正在嘗試參數化任 AWS Glue 務,以便在 Amazon S3 的不同資料集上套用相同的轉換/邏輯。您希望在提供的位置上追蹤已處理的檔案。當您在同一個來源儲存貯體上執行同一個任務並同時寫入相同/不同的目的地 (並行數 > 1) 時,任務會失敗並出現以下錯誤:
py4j.protocol.Py4JJavaError: An error occurred while callingz:com.amazonaws.services.glue.util.Job.commit.:com.amazonaws.services.gluejobexecutor.model.VersionMismatchException: Continuation update failed due to version mismatch. Expected version 2 but found version 3
解決方案:將並行設定為 1 或不並行執行任務。
目前 AWS Glue 書籤不支援並行工作執行,且提交將會失敗。
錯誤:當任務書籤啟用時,任務會重新處理資料
在某些情況下,您可能已啟用 AWS Glue 工作書籤,但您的ETL工作正在重新處理先前執行中已處理的資料。請檢查此錯誤的常見原因:
最大並行數量
將工作的同時執行數目上限設定為大於預設值 1 可能會干擾工作書籤。當工作書籤檢查物件的上次修改時間以確認需要重新處理哪些物件時,就會發生這種情況。如需詳細資訊,請參閱在 中設定 Spark 任務的任務屬性 AWS Glue中針對最大並行數量的說明。
找不到任務物件
確認您的任務執行指令碼結尾是否為下列遞交:
job.commit()
當您包含此物件時,會 AWS Glue 記錄工作執行的時間戳記和路徑。如果您使用相同的路徑再次執行工作,則只會 AWS Glue 處理新檔案。如果您未包含此物件並啟用任務書籤,任務就會重新處理已處理過的檔案與新的檔案,並在任務的目標資料存放區中建立冗餘項目。
缺少轉換內容參數
轉換細節是 GlueContext
類別中的選擇性參數,但如果您未包含此參數,任務書籤就無法運作。若要解決此錯誤,請在建立時新增轉換前後關聯參數 DynamicFrame,如下所示:
sample_dynF=create_dynamic_frame_from_catalog(database, table_name,transformation_ctx="sample_dynF")
輸入來源
如果您使用關聯式資料庫 (JDBC連線) 作為輸入來源,工作書籤只有在資料表的主索引鍵按順序排列時才有作用。任務書籤適用於新的資料列,但對更新的資料列無效。這是因為任務書籤會尋找主索引鍵,而主索引鍵已存在。如果您的輸入來源是 Amazon Simple Storage Service (Amazon S3),則此選項不適用。
上次修改時間
若是 Amazon S3 輸入來源,任務書籤會檢查物件的上次修改時間而不是檔案名稱,以確認哪些物件需要重新處理。如果自上次任務執行之後已修改您的輸入來源資料,則在您重新執行任務時重新處理檔案。
錯誤:VPCs中之間的容錯移轉行為 AWS Glue
以下過程用於 AWS Glue 4.0 和以前版本中的作業的故障轉移。
摘要:送出工作執行時會選取 AWS Glue 連線。如果任務執行時遇到一些問題 (缺少 IP 地址、連線至來源、路由問題),任務執行將會失敗。如果已設定重試,則 AWS Glue 會以相同的連線重試。
-
對於每次運行嘗試, AWS Glue 將按照作業配置中列出的順序檢查連接健康狀況,直到找到可以使用的一個為止。如果可用區域 (AZ) 失敗,來自該 AZ 的連線將會失敗檢查並略過。
-
AWS Glue 使用下列項目驗證連線:
檢查是否有效的 Amazon VPC ID 和子網路。
檢查NAT閘道或 Amazon VPC 端點是否存在。
檢查子網路是否具備超過 0 個所分配的 IP 地址。
檢查 AZ 是否狀態良好。
AWS Glue 無法在工作執行提交時驗證連線。
-
對於使用 Amazon 的任務VPC,所有驅動程式和執行程式都會在同一個 AZ 中建立,並在任務執行提交時選取的連線。
-
如果已設定重試,則 AWS Glue 會以相同的連線重試。這是因為我們無法保證此連線在長期運作下不會發生問題。若 AZ 失敗,則該 AZ 中現有的任務執行 (視任務執行的階段而定) 可能會失敗。重試應會偵測 AZ 故障,並為新的執行選擇其他 AZ。