为什么我的 AWS Glue 爬网程序会因内部服务异常而失败?
我的 AWS Glue 爬网程序失败并显示错误“ERROR : Internal Service Exception(错误:内部服务异常)”。
解决方法
爬网程序内部服务异常可能是由暂时性问题造成。在开始进行问题排查之前,请再次运行爬网程序。如果您仍然遇到内部服务异常,请检查以下常见问题。
数据问题
如果您的 AWS Glue 爬网程序配置为处理大量数据,则该爬网程序可能会面临内部服务异常。查看出现数据问题的原因以进行修复:
- 如果您有大量小文件,那么爬网程序可能会因内部服务异常而失败。为避免此问题,请使用 S3DistCp 工具合并较小的文件。当您使用 S3DistCp 时,会产生额外的 Amazon EMR 费用。或者,您可以设置排除模式,然后反复爬取文件。最后,考虑开启采样以避免扫描前缀内的所有文件。
- 如果您的爬网程序接近 24 小时超时值,请拆分工作流以防止出现内存问题。有关更多信息,请参阅 AWS Glue 爬网程序为什么运行很长时间?
注意:解决数据规模问题的最佳方法是减少处理的数据量。
Amazon Simple Storage Service(Amazon S3)文件夹结构不一致
随时间变化,您的 AWS Glue 爬网程序会遇到特定格式的数据。但是,上游应用程序中的不一致可能会触发内部服务异常错误。
数据目录中的表分区定义与 Amazon S3 中的 Hive 分区结构之间可能存在不一致。这种差异可能会给您的爬网程序带来问题。例如,爬网程序可能希望将对象分区为 "s3://awsdoc-example-bucket/yyyy=xxxx/mm=xxx/dd=xx/[files]"。但是假设其中一些对象变为 "s3://awsdoc-example-bucket/yyyy=xxxx/mm=xxx/[files]"。发生这种情况时,爬网程序会失败并引发内部服务异常错误。
如果您修改先前爬取的数据位置,则可能会出现内部服务异常错误,包含增量爬取。发生这种情况是因为满足以下条件之一:
- 已知为空的 Amazon S3 位置已更新并填充数据文件
- 文件已从已知填充数据文件的 Amazon S3 位置移除
如果您更改 Amazon S3 前缀结构,则会触发此异常。
如果您认为 S3 数据存储发生更改,则最佳做法是删除当前的爬网程序。删除当前爬网程序后,使用爬取所有文件夹选项在同一 S3 目标上创建新的爬网程序。
AWS Key Management Service(AWS KMS)问题
如果您的数据存储配置了 AWS KMS 加密,请检查以下内容:
- 确认爬网程序的 AWS Identity and Access Management(IAM)角色具有访问 AWS KMS 密钥的权限。
- 确认您的 AWS KMS 密钥策略以正确的方式委派权限。
- 确认 AWS KMS 密钥仍然存在且处于可用状态。如果其 AWS KMS 密钥待删除,则会触发内部服务异常。
有关更多信息,请参阅在 AWS Glue 控制台上处理安全配置和在 AWS Glue 中设置加密。
AWS Glue Data Catalog 问题
如果您的数据目录有大量列或嵌套结构,则架构大小可能会超过 400KB 的限制。要解决与数据目录相关的异常,请检查以下内容:
- 确保列名称长度不超过 255 个字符,且不包含特殊字符。有关列要求的更多信息,请参阅列。
- 检查长度为 0 的列。如果源数据中的列与数据目录表的数据格式不匹配,就会发生这种情况。
- 在表的架构定义中,确保每列的类型值不超过 131072 个字节。如果超过此限制,您的爬网程序可能会面临内部服务异常。有关详细信息,请参阅列结构。
- 检查格式错误的数据。例如,如果列名称不符合正则表达式模式 "[\u0020-\uD7FF\uE000-\uFFFD\uD800\uDC00-\uDBFF\uDFFF\t]",则爬网程序无法运行。
- 如果您的数据包含(精度、标度)格式的 DECIMAL 列,请确保标度值小于或等于精度值。
- 您的爬网程序可能会失败,显示“Unable to create table in Catalog(无法在目录中创建表)”或“Payload size of request exceeded limit(请求的负载大小超出限制)”错误消息。发生这种情况时,请监控表架构定义的大小。对数据目录中表的列数没有限制。但是,架构的总大小有 400KB 的限制。大量列导致架构总大小超出 400KB 的限制。潜在的解决方法包括将架构分成多个表并删除不必要的列。您也可以考虑通过减少列名称来减小元数据的大小。
Amazon S3 问题
- 确保 Amazon S3 路径不包含特殊字符。
- 确认适用于爬网程序的 IAM 角色有访问 Amazon S3 路径的权限。有关更多信息,请参阅为 AWS Glue 创建 IAM 角色。
- 如果可能,请从您的数据中删除特殊的 ASCII 字符,例如 ^、%、~。或者使用自定义分类器对您的数据进行分类。
- 确认 S3 对象使用 STANDARD 存储类。要将对象还原到 STANDANDER 存储类,请参阅还原归档对象。
- 确认爬网程序配置中的包含模式和排除模式与 S3 存储桶路径匹配。
- 如果您正在爬取加密的 S3 存储桶,那么请确认爬网程序的 IAM 角色拥有 AWS KMS 密钥的适当权限。有关更多信息,请参阅在 AWS Glue 控制台上处理安全配置和在 AWS Glue 中设置加密。
- 如果您正在爬取加密的 S3 存储桶,请确保该存储桶、AWS KMS 密钥和 AWS Glue 作业位于同一 AWS 区域。
- 检查您所爬取的 S3 存储桶上的请求速率。如果速率较高,请考虑创建更多前缀以进行并行读取。有关更多信息,请参阅最佳实践设计模式:优化 Amazon S3 性能。
- 确保 S3 资源路径长度少于 700 个字符。
Amazon DynamoDB 问题
- 确保表有足够的读取容量单位。
- 确保您用于运行爬网程序的 IAM 角色拥有 dynamodb:Scan 权限。有关更多信息,请参阅 DynamoDB API 权限:操作、资源和条件参考。
- 确保表名称不包含空格字符。
JDBC 问题
- 如果您正在爬取使用 AWS KMS 加密的 JDBC 数据来源,那么请检查您用于连接的子网。子网的路由表必须有指向 AWS KMS 端点的路由。此路由可以通过支持 AWS KMS 的虚拟私有云(VPC)端点或 NAT 网关。
- 确保您使用的是正确的包含路径语法。有关更多信息,请参阅定义爬网程序。
- 如果您正在爬取 JDBC 数据存储,那么请确认 SSL 连接已正确配置。如果您使用的不是 SSL 连接,那么请确保您在配置爬网程序时未选中 Require SSL connection(需要使用 SSL 连接)。
- 确认 AWS Glue 连接中的数据库名称与爬网程序的包含路径中的数据库名称匹配。此外,请确保您正确输入了包含路径。有关详细信息,请参阅包含模式和排除模式。
- 确保您使用的子网位于 AWS Glue 支持的可用区内。
- 确保您使用的子网具有足够的可用私有 IP 地址。
- 确认内置的 AWS Glue JDBC 驱动程序支持 JDBC 数据来源。
使用 VPC 端点时出现 AWS KMS 问题
- 如果您在使用 AWS KMS,那么 AWS Glue 爬网程序必须有权访问 AWS KMS。要授予访问权限,请在创建 AWS KMS 终端节点时选中 Enable Private DNS Name(启用私有 DNS 名称)。然后,将 AWS KMS 端点添加到 AWS Glue 连接的 VPC 子网配置。有关更多信息,请参阅通过 VPC 端点连接到 AWS KMS。
相关信息
相关内容
- AWS 官方已更新 3 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 3 年前
- AWS 官方已更新 3 年前