疑難排解 Spark 中 AWS Glue 的錯誤 - AWS Glue

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

疑難排解 Spark 中 AWS Glue 的錯誤

如果在中遇到錯誤 AWS Glue,請使用下列解決方案來協助您尋找問題的來源並加以修正。

注意

AWS Glue GitHub 存放庫包含AWS Glue 常見問題集中的其他疑難排解指引。

錯誤:資源無法使用

如果 AWS Glue 傳回無法使用資源的訊息,您可以檢視錯誤訊息或記錄檔,以協助您進一步瞭解問題。以下任務說明一般的故障診斷方法。

  • 針對您所使用的任何連線和開發端點,請檢查您的叢集是否仍有彈性網路界面可用。

錯誤:無法在 VPC 中找到 subnetId 的 S3 端點或 NAT 閘道

檢查訊息中的子網路 ID 和 VPC ID,以協助診斷問題。

  • 確認您已設定 Amazon S3 VPC 端點,此為 AWS Glue的要求。此外,如果組態內有 NAT 閘道,請檢查。如需詳細資訊,請參閱 Amazon S3 的 VPC 端點

錯誤:安全群組需有傳入規則

必須至少有一個安全群組開啟所有傳入連接埠。若要限制流量,傳入規則中的來源安全群組可以限制為相同的安全群組。

錯誤:安全群組需有傳出規則

必須至少有一個安全群組開啟所有傳出連接埠。若要限制流量,傳出規則中的來源安全群組可以限制為相同的安全群組。

錯誤:Job 執行失敗,因為應將傳遞的角色指定為 AWS Glue 服務的角色權限

定義任務的使用者需擁有 AWS Glue的 iam:PassRole 許可。

錯誤: DescribeVpcEndpoints 動作未經授權。無法驗證虛擬私人雲端識別碼 vpc-id

  • 檢查傳遞給的政策以 AWS Glue 獲取ec2:DescribeVpcEndpoints權限。

錯誤: DescribeRouteTables 動作未授權。無法驗證子網路識別碼:VPC ID 中的子網路識別碼:vpc-id

  • 檢查傳遞給的政策以 AWS Glue 獲取ec2:DescribeRouteTables權限。

錯誤:無法調用 ec2:DescribeSubnets

  • 檢查傳遞給的政策以 AWS Glue 獲取ec2:DescribeSubnets權限。

錯誤:無法調用 ec2:DescribeSecurityGroups

  • 檢查傳遞給的政策以 AWS Glue 獲取 ec2:DescribeSecurityGroups權限。

錯誤:找不到可用區域的子網路

  • 可用區域可能不適用於 AWS Glue。建立並使用可用區域中新的子網路,與訊息中所指定的可用區域不同。

錯誤:寫入到 JDBC 目標時發生任務執行例外

執行寫入到 JDBC 目標的任務時,任務在下列情況下可能發生錯誤:

  • 如果您的任務寫入到 Microsoft SQL Server 資料表,且資料表有定義為 Boolean 類型的資料欄,則資料表必須預先在 SQL Server 資料庫中定義。當您在 AWS Glue 主控台上使用 SQL Server 目標與 [在資料目標中建立資料表] 選項來定義工作時,請勿將任何來源資料行對應至具有資料類型的目標資料行Boolean。執行任務時可能會發生錯誤。

    您可以執行以下動作避免錯誤:

    • 選擇含有 布林值 欄的現有資料表。

    • 編輯 ApplyMapping 轉換,並將來源的布林值欄映射至目標的數字或字串。

    • 編輯 ApplyMapping 轉換,移除來源中的布林值欄。

  • 如果您的任務寫入到 Oracle 資料表,您可能需要調整 Oracle 物件名稱的長度。在某些版本的 Oracle,最大的 ID 長度限制為 30 位元組或 128 位元組。此限制影響 Oracle 目標資料存放區的資料表名稱和欄名稱。

    您可以執行以下動作避免錯誤:

    • 依照版本的限制為 Oracle 目標資料表命名。

    • 預設欄名稱從資料的欄位名稱產生。當欄名稱長度超過限制時,請使用 ApplyMappingRenameField 轉換變更欄的名稱,以符合限制。

錯誤: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:為 AWS Glue 建立 IAM 角色

錯誤:Amazon S3 存取金鑰 ID 不存在

如果在運行作業時 AWS Glue 返回訪問密鑰 ID 不存在錯誤,則可能是由於以下原因之一:

  • ETL 工作使用 IAM 角色存取任務資料存放區,在工作開始之前確認您工作的 IAM 角色尚未遭到刪除。

  • IAM 角色包含存取您的資料存放區的許可,確認任何所附加包含 s3:ListBucket 的 Amazon S3 政策是正確的。

錯誤:使用 s3a:// URI 存取 Amazon S3 時發生任務執行失敗

如果任務執行傳回錯誤 (像是無法使用處理常式類別剖析 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 主控台中,檢查您的 VPC 是否使用有效的 DHCP 選項集。如需詳細資訊,請參閱 DHCP 選項集

  • 如果叢集仍為 PROVISIONING 狀態,請聯絡 AWS Support。

錯誤:筆記本伺服器 CREATE_FAILED

如果 AWS Glue 無法為開發端點建立筆記本伺服器,可能是因為下列其中一個問題:

  • AWS Glue 在設定筆記型電腦伺服器時,將 IAM 角色傳遞給 Amazon EC2。IAM 角色必須與 Amazon EC2 有信任關係。

  • IAM 角色必須有相同名稱的執行個體描述檔。當您在 IAM 主控台建立 Amazon EC2 的角色時,便會自動建立相同名稱的執行個體描述檔。檢查日誌內是否有關於執行個體描述檔名稱 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

如需有關更新分割區的詳細資訊,請參閱 使用 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 輸入來源,任務書籤會檢查物件的上次修改時間而不是檔案名稱,以確認哪些物件需要重新處理。如果自上次任務執行之後已修改您的輸入來源資料,則在您重新執行任務時重新處理檔案。

錯誤:中 VPC 之間的容錯移轉行為 AWS Glue

以下過程用於 AWS Glue 4.0 和以前版本中的作業的故障轉移。

摘要:送出工作執行時會選取 AWS Glue 連線。如果任務執行時遇到一些問題 (缺少 IP 地址、連線至來源、路由問題),任務執行將會失敗。如果已設定重試,則 AWS Glue 會以相同的連線重試。

  1. 對於每次運行嘗試, AWS Glue 將按照作業配置中列出的順序檢查連接健康狀況,直到找到可以使用的一個為止。如果可用區域 (AZ) 失敗,來自該 AZ 的連線將會失敗檢查,並會略過。

  2. AWS Glue 使用下列項目驗證連線:

    • 檢查是否具備有效的 Amazon VPC ID 和子網路。

    • 檢查 NAT 閘道或 Amazon VPC 端點是否存在。

    • 檢查子網路是否具備超過 0 個所分配的 IP 地址。

    • 檢查 AZ 是否狀態良好。

    AWS Glue 無法在工作執行提交時驗證連線。

  3. 對於使用 Amazon VPC 的任務,所有驅動程式和執行器都會在同一個 AZ 中建立,並在任務執行提交時選取連線。

  4. 如果已設定重試,則 AWS Glue 會以相同的連線重試。這是因為我們無法保證此連線在長期運作下不會發生問題。若 AZ 失敗,則該 AZ 中現有的任務執行 (視任務執行的階段而定) 可能會失敗。重試應會偵測 AZ 故障,並為新的執行選擇其他 AZ。