纠正 AWS Glue 中的错误 - AWS Glue
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

纠正 AWS Glue 中的错误

如果您在 AWS Glue 中遇到错误,则可以使用以下解决方案来帮助您查找问题的根源并解决问题。

注意

的 AWS Glue GitHub 存储库包含其他故障排除指南,请参阅 AWS Glue 常见问题.

错误: 资源不可用

如果 AWS Glue 返回了“资源不可用”消息,则可查看错误消息或日志来帮助您详细了解问题。以下作业描述了故障排除的通用方法。

  • 对于您使用的任何连接和开发终端节点,请检查您的群集是否未用尽弹性网络接口。

错误: 无法找到S3端点或NATGateway subnetId 在VPC中

检查消息中的子网 ID 和 VPC ID 可帮助您诊断问题。

  • 检查您是否设置了 AWS Glue 需要的 Amazon S3 VPC 终端节点。此外,请检查您的 NAT 网关 (如果它是您的配置的一部分)。有关更多信息,请参阅Amazon S3 的 Amazon VPC 终端节点

错误: 授权组中的入站规则必填

至少有一个安全组必须打开所有入口端口。为限制流量,入站规则中的源安全组可限制为同一安全组。

  • 对于您使用的任何连接,请检查安全组中是否有属于自引用的入站规则。有关更多信息,请参阅设置环境以访问数据存储

  • 如果您使用的是开发终端节点,请检查安全组中是否有属于自引用的入站规则。有关更多信息,请参阅设置环境以访问数据存储

错误: 授权组中的出站规则必填

至少有一个安全组必须打开所有出口端口。为限制流量,出站规则中的源安全组可限制为同一安全组。

  • 对于您使用的任何连接,请检查安全组中是否有属于自引用的出站规则。有关更多信息,请参阅设置环境以访问数据存储

  • 如果您使用的是开发终端节点,请检查安全组中是否有属于自引用的出站规则。有关更多信息,请参阅设置环境以访问数据存储

错误: 作业运行失败,因为已传递的角色应被赋予AWSGlue服务的角色权限

定义作业的用户必须具有针对适用于 AWS Glue 的 iam:PassRole 的权限。

错误: DescribeVpcEndpoints 操作为“未授权”。无法验证 VPC ID vpc-id

  • 检查传递到 AWS Glue 的策略是否有 ec2:DescribeVpcEndpoints 权限。

错误: DescribeRouteTables 操作为“未授权”。无法验证 VPC ID (vpc-id) 中的子网 ID (subnet-id)

  • 检查传递到 AWS Glue 的策略是否有 ec2:DescribeRouteTables 权限。

错误: 无法调用ec2:描述子网

  • 检查传递到 AWS Glue 的策略是否有 ec2:DescribeSubnets 权限。

错误: 调用ec2失败:描述安全组

  • 检查传递到 AWS Glue 的策略是否有 ec2:DescribeSecurityGroups 权限。

错误: 无法找到AZ的子网

  • 可用区可能对 AWS Glue 不可用。请在不同于消息中指定的可用区的可用区中创建和使用新子网。

错误: 写入JDBC目标时作业运行异常

当您运行某个对 JDBC 目标进行写入的作业时,该作业在以下情况下可能遇到错误:

  • 如果您的作业对 Microsoft SQL Server 表进行写入,而该表具有定义为 Boolean 类型的列,则必须在 SQL Server 数据库中预定义该表。当您在 AWS Glue 使用带有选项的SQLServer目标控制台 在数据目标中创建表,不要将任何来源列映射到具有数据类型的目标列 Boolean。当作业运行时,您可能会遇到错误。

    您可以通过执行以下操作来避免错误:

    • 选择包含 Boolean 列的现有表。

    • 编辑 ApplyMapping 转换并将源中的 Boolean 列映射到目标中的数字或字符串。

    • 编辑 ApplyMapping 转换以从源中删除 Boolean 列。

  • 如果您的作业对 Oracle 表进行写入,您可能需要调整 Oracle 对象的名称长度。在某些版本的 Oracle 中,最大标识符长度限制为 30 个字节或 128 个字节。此限制影响 Oracle 目标数据存储的表名称和列名称。

    您可以通过执行以下操作来避免错误:

    • 在您的版本的限制内为 Oracle 目标表命名。

    • 默认列名称从数据中的字段名称生成。要应对列名称长度超过限制的情况,请使用 ApplyMappingRenameField 转换将列的名称更改得不超过限制。

Error: Amazon S3 Timeout

如果 AWS Glue 返回连接超时错误,则可能是因为它正在尝试访问其他 AWS 区域中的 Amazon S3 存储桶。

  • Amazon S3 VPC 终端节点只能将流量路由到 AWS 区域中的存储桶。如果您需要连接到其他区域中的存储桶,一种可能的解决方法是使用 NAT 网关。有关更多信息,请参阅 NAT 网关

Error: Amazon S3 拒绝访问

如果 AWS Glue 向 Amazon S3 存储桶或对象返回了“访问被拒绝”错误,则可能是因为提供的 IAM 角色没有具有针对您的数据存储的权限的策略。

  • ETL 作业必须有权访问用作源或目标的 Amazon S3 数据存储。爬网程序必须有权访问其爬网的 Amazon S3 数据存储。有关更多信息,请参阅步骤 2: 为 IAM 创建 AWS Glue 角色

Error: Amazon S3 访问密钥ID不存在

如果AWS Glue 在运行作业时返回了“访问密钥 ID 不存在”错误,则可能由以下原因之一导致:

  • ETL 作业使用 IAM 角色来访问数据存储和确认您的作业的 IAM 角色在作业开始前未被删除。

  • IAM 角色包含以下权限:访问您的数据存储和确认包含 s3:ListBucket 的所有已附加的 Amazon S3 策略正确无误。

错误: 访问时作业运行失败 Amazon S3 具有 s3a:// URI(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)

Error: Amazon S3 服务令牌已过期

在将数据移入和移出 Amazon Redshift 时,使用了将在 1 小时后过期的临时 Amazon S3 凭证。如果您有长时间运行的作业,它可能会失败。有关如何设置您的长时间运行的作业以将数据移入和移出 Amazon Redshift 的信息,请参阅在 Amazon Redshift 中移入和移出数据

错误: 未找到网络接口的专用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,而如果它指向的文件夹不再存在,Zeppelin 笔记本将无法启动。

错误: 笔记本使用错误

在使用 Apache Zeppelin 笔记本时,您可能由于设置或环境而遇到错误。

  • 您在创建笔记本服务器时为 IAM 角色提供了附加策略。如果策略不包括所有必需的权限,您可能会收到错误,例如 assumed-role/name-of-role/i-0bf0fa9d038087062 is not authorized to perform some-action AccessDeniedException。检查在中传递到您的笔记本服务器的策略 IAM 控制台。

  • 如果 Zeppelin 笔记本未在 Web 浏览器中正确呈现,请检查 Zeppelin 的浏览器支持要求。例如,Safari 浏览器可能需要特定的版本和设置。您可能需要更新浏览器或使用其他浏览器。

错误: 运行爬网程序失败

如果 AWS Glue 无法成功运行爬网程序以便为您的数据编制目录,则可能由以下原因之一导致。首先检查 AWS Glue 控制台爬网程序列表中是否列出了错误。检查爬网程序名称旁边是否有 感叹号图标,并将鼠标指针悬停在该图标上以查看任何相关消息。

  • 在 CloudWatch Logs 中的 /aws-glue/crawlers 下检查爬网程序运行的日志。

错误: 分区未更新

如果您的分区未在 Data Catalog 当您运行ETL作业时,这些日志语句来自 DataSink 分类 CloudWatch 日志可能有帮助:

  • 英寸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。

  • 如果两者都是假的, updateBehavior 未设置为 UPDATE_IN_DATABASE,然后您的 DynamicFrame 框架必须相同或包含 Data Catalog 表框架。

有关更新分区的更多信息,请参阅更新数据目录中的架构和分区

错误: 升级Athena数据目录

如果您在将 Athena 数据目录升级到 AWS Glue 数据目录 时遇到错误,请参阅 Amazon Athena 用户指南 主题升级到 AWS Glue 数据目录的分步指南

错误: 启用工作书签时,作业正在重新处理数据

有些情况下,在您已启用 AWS Glue 作业书签后,您的 ETL 作业还在重新处理早期运行中已处理的数据。检查此错误的以下常见原因:

最大并发数

确保作业的最大并发运行数为 1。有关更多信息,请参阅在 AWS Glue 中添加作业中的最大并发数讨论。当您有多个带作业书签的并发作业并且最大并发数设置为 1 时,作业书签无法正常工作。

缺少作业对象

确保您的作业运行脚本以下面的提交结束:

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 输入源,作业书签将通过检查对象的上次修改时间而不是文件名来验证哪些对象需要重新处理。如果您的输入源数据在上次作业运行后已修改,则再次运行作业时将重新处理这些文件。