在 Athena 中进行故障排除 - Amazon Athena
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

在 Athena 中进行故障排除

Athena 团队从客户问题中收集了以下故障排除信息。虽然并不全面,但它包括有关一些常见性能、超时和内存不足问题的建议。

CREATE TABLE AS SELECT (CTAS)

重复的数据与并发 CTAS 语句一起出现

Athena 不维护 CTAS 的并发验证。确保同一位置不会同时出现重复的 CTAS 语句。即使 CTAS 或 INSERT INTO 语句失败,孤立数据也可以保留在语句中指定的数据位置。

HIVE_TOO_MANY_OPEN_PARTITIONS

当您使用 CTAS 语句来创建包含超过 100 个分区的表时,可能会收到错误消息则可能会收到错误消息 HIVE_TOO_MANY_OPEN_PARTITIONS: Exceeded limit of 100 open writers for partitions/buckets(HIVE_TOO_MANY_OPEN_PARTISS:分区/存储桶超过 100 个打开的写入程序限制)。要绕过此限制,您可以使用一个 CTAS 语句和一系列 INSERT INTO 语句,每个后一种语句将创建或插入不超过 100 个分区。有关更多信息,请参阅使用 CTAS 和 INSERT INTO 创建带 100 多个分区的表

数据文件问题

Athena 无法读取隐藏的文件

Athena 将以下划线 (_) 或句点 (.) 开头的源文件视为隐藏文件。要解决此限制,请重命名文件。

Athena 无法读取存储在 Amazon S3 Glacier 中的文件

Athena 不支持查询 S3 Glacier Flexible Retrieval 或 S3 Glacier Deep Archive 存储类中的数据。已忽略 S3 Glacier Flexible Retrieval 和 S3 Glacier Deep Archive 存储类中的对象。如果数据已被移至或转换为这些类的其中之一,则 Athena 将不再可读取或查询这些数据,即使存储类对象重新还原。若要让 Athena 可以读取您希望查询的已还原对象,请将还原的对象复制回 Amazon S3 以更改其存储类别,或使用 Athena 可查询的 Amazon S3 Glacier Instant Retrieval 存储类。有关更多信息,请参阅 Amazon S3 Glacier Instant Retrieval 存储类

Athena 读取我从 Amazon Glue 爬网程序中排除的文件

Athena 不承认您为 Amazon Glue 爬网程序指定的排除模式。例如,如果您有一个 Amazon S3 存储桶,其中包含 .csv.json 文件,并且您从爬网程序中排除了 .json 文件时,Athena 会查询两组文件。要避免这种情况,请将要排除的文件放置在其他位置。

HIVE_BAD_DATA:分析字段值时出错

以下情况下可能会出现此错误:

HIVE_CANNOT_OPEN_SPLIT: Error opening Hive split s3://bucket-name

当您查询具有大量对象的 Amazon S3 存储桶前缀时,可能会发生此错误。有关更多信息,请参阅 Amazon 知识中心的 如何解决 Athena 中的“HIVE_CANNOT_OPEN_SPLIT: Error opening Hive split s3://awsdoc-example-bucket/: Slow Down(HIVE_CANNOT_OPEN_SPLIT:打开 Hive split s3://awsdoc-example-bucket/ 时出错:减速)”错误?

HIVE_CURSOR_ERROR: com.amazonaws.services.s3.model.AmazonS3Exception: The specified key does not exist

当查询正在运行而删除文件时,通常会发生此错误。您可重新运行查询,或检查您的工作流,以查看查询运行时是否有另一个任务或进程正在修改文件。

HIVE_CURSOR_ERROR:输入流式传输意外结束

此消息表示该文件已损坏或为空。检查文件的完整性,然后重启查询。

HIVE_FILESYSTEM_ERROR: Incorrect fileSize 1234567 for file(HIVE_FILESSTEM_ERROR:文件的文件大小错误 1234567)

文件在查询规划和查询执行之间更改时,可能会出现此消息。Amazon S3 上的文件被就地替换(例如,PUT 在对象已存在的密钥上执行)时,通常会出现此消息。运行查询时,Athena 不支持删除或替换文件内容。为避免此错误,请在查询不运行时安排覆盖或删除文件的任务,或者只将数据写入新文件或分区。

HIVE_UNKNOWN_ERROR:无法创建输入格式

此错误可能是由类似于以下的问题导致的:

  • Amazon Glue 爬网程序无法对数据格式进行分类

  • 某些 Amazon Glue 表定义属性为空

  • Athena 不支持 Amazon S3 中文件的数据格式

有关更多信息,请参阅 Amazon 知识中心中的《如何解决 Athena 中的“无法创建输入格式”错误?》。

org.apache.parquet.io.GroupColumnIO cannot be cast to org.apache.parquet.io.PrimitiveColumnIO

此错误是由 parquet 架构不匹配引起的。具有非基本类型的列(例如,array)在 Amazon Glue 中被声明为原始类型(例如,string)。若要解决此问题,请检查文件中的数据架构,并将其与 Amazon Glue 中声明的架构相比较。

为保存查询结果而提供的 S3 位置无效。

确保您为查询结果指定了有效的 S3 位置。有关更多信息,请参阅指定查询结果位置主题中的 使用查询结果、最近查询和输出文件

联合查询

有关联合查询问题排查的信息,请参阅 GitHub 上 awslabs/aws-athena-query-federation 部分中的 Common_Problems(常见问题)。

尝试读取 JSON 数据时出现 NULL 或不正确的数据错误

当您尝试读取 JSON 数据时,NULL 或不正确的数据错误可能是由于多种原因造成的。要识别在使用 OpenX SerDE 时导致错误的行,请将 ignore.malformed.json 设置为 true。格式错误的记录将返回为 NULL。有关更多信息,请参阅 Amazon 知识中心中的《在 Amazon Athena 中尝试读取 JSON 数据时收到错误》。

HIVE_BAD_DATA: Error parsing field value for field 0: java.lang.String cannot be cast to org.openx.data.jsonserde.json.JSONObject

OpenX JSON SerDe 无法解析 Athena 查询中的列时,就会引发此错误。如果您将列定义为 map 或者 struct,但基础数据实际上是 stringint 或其他基本类型,就会出现这种状况。

HIVE_CURSOR_ERROR: Row is not a valid JSON Object - JSONException: Duplicate key(HIVE_CURSOR_ERROR:行不是有效的 JSON 对象 - JSONException:重复的键)

当您使用 Athena 查询拥有多个同名标签,但大小写不同的 Amazon Config 资源时,会出现此错误。解决方案是使用 WITH SERDEPROPERTIES 'case.insensitive'='false' 运行 CREATE TABLE,并映射名称。有关 case.insensitive 和映射的更多信息,请参阅 JSON SerDe 库。有关更多信息,请参阅 Amazon 知识中心中的 当在 Athena 中读取来自 Amazon Config 的文件时,如何解决“HIVE_CURSOR_ERROR: Row is not a valid JSON Object - JSONException: Duplicate key(HIVE_CURSOR_ERROR:行不是有效的 JSON 对象 - JSONException:重复的键)”?

美观打印的 JSON 文本的 HIVE_CURSOR_ERROR 消息

Hive JSON SerDeOpenX JSON SerDe 库期望每个 JSON 文档都位于单行文本中,并且不使用行终止字符分隔记录中的字段。如果 JSON 文本采用美观的打印格式,当您在创建表后尝试对其进行查询时,可能会收到类似以下内容的错误消息:HIVE_CURSOR_ERROR: Row is not a valid JSON Object(HIVE_CURSOR_ERROR:行不是有效的 JSON 对象)或 HIVE_CURSOR_ERROR: JsonParseException: Unexpected end-of-input: expected close marker for OBJECT(HIVE_CURSOR_ERROR:JsonParseException:意外的输入结束:对象的预期关闭标记)。有关更多信息,请参阅 GitHub 上 OpenX SerDe 文档中的 JSON data files(JSON 数据文件)。

多个 JSON 记录返回的 SELECT COUNT 为 1

如果您使用的是 OpenX JSON SerDe,请确保记录由换行符分隔。有关更多信息,请参阅 Amazon 知识中心中的即使输入 JSON 文件有多条记录,Amazon Athena 中的 SELECT COUNT 查询也仅返回一条记录

无法查询由使用自定义 JSON 分类器的 Amazon Glue 爬网程序创建的表

Athena 引擎不支持自定义 JSON 分类器。要解决此问题,请创建不含自定义分类器的新表。要转换 JSON,您可以使用 CTAS 或创建视图。例如,如果您正在使用数组,则可以使用 UNNEST 选项来拼合 JSON。另一个选择是使用支持自定义分类器的 Amazon Glue ETL 任务,在 Amazon S3 中将数据转换为 Parquet,然后在 Athena 中查询它。

MSCK REPAIR TABLE

有关 MSCK REPAIR TABLE 相关问题的信息,请参阅 MSCK REPAIR TABLE 页面的 注意事项和限制问题排查 的部分。

输出问题

无法验证/创建输出存储桶

如果指定的查询结果位置不存在或不存在适当的权限,则可能会发生此错误。有关更多信息,请参阅 Amazon 知识中心的 如何解决 Amazon Athena 中的“unable to verify/create output bucket(无法验证/创建输出存储桶)”错误?

TIMESTAMP 结果为空

Athena 需要 Java TIMESTAMP 格式。有关更多信息,请参阅 Amazon 知识中心中当我在 Amazon Athena 中查询表时,TIMESTAMP 结果为空

以 CSV 以外的格式存储 Athena 查询输出

默认情况下,Athena 仅以 CSV 格式输出文件。若要输出采用其他格式的 SELECT 查询结果,可以使用 UNLOAD 语句。有关更多信息,请参阅UNLOAD。您还可以使用 CTAS 查询,该查询使用 format 表属性配置输出格式。与 UNLOAD 不同,CTAS 技术需要创建表格。有关更多信息,请参阅 Amazon 知识中心中的如何以 CSV 以外的格式(如压缩格式)存储 Athena 查询输出?

为保存查询结果而提供的 S3 位置无效

如果您的输出存储桶位置与运行查询的区域不一致,则可能会收到此错误消息。要避免这种情况,请在运行查询的区域中指定查询结果位置。要查看步骤,请参阅 指定查询结果位置

分区问题

MSCK REPAIR TABLE 不会删除过时的分区

如果您在 Amazon S3 中手动删除分区,然后运行 MSCK REPAIR TABLE,您可能会收到错误消息文件系统中缺少分区。发生这种情况的原因是 MSCK REPAIR TABLE 不会从表元数据中删除过时的分区。请使用 ALTER TABLE DROP PARTITION 手动删除过时的分区。有关更多信息,请参阅 MSCK REPAIR TABLE 主题的“疑难解答”部分。

MSCK REPAIR TABLE 故障

当大量的分区(例如,超过 100,000 个)与特定表相关联时,MSCK REPAIR TABLE 可能会因内存限制而故障。要解决此限制,请换成 ALTER TABLE ADD PARTITION

MSCK REPAIR TABLE 检测到分区,但未将它们添加到 Amazon Glue

如果 Amazon S3 路径混合使用大小写而不是全小写,或者 IAM policy 不允许 glue:BatchCreatePartition 操作,则会出现此问题。有关更多信息,请参阅 Amazon 知识中心的 MSCK REPAIR TABLE 检测到 Athena 中的分区,但未将它们添加到 Amazon Glue Data Catalog

日期格式为 dd-MM-yyyy-HH-mm-ss 或 yyyy-MM-dd 的分区投影范围不起作用

要正常工作,必须将日期格式设置为 yyyy-MM-dd HH:00:00。有关更多信息,请参阅 Stack Overflow 文章:Athena partition projection not working as expected(Athena 分区投影无法按预期工作)。

PARTITION BY 不支持 BIGINT 类型

将数据类型转换为 string,然后重试。

没有可用的有意义分区

此错误消息通常意味着分区设置已损坏。若要解决此问题,请删除该表并创建具有新分区的表。

分区投影不能与范围分区结合使用

检查时间范围单位projection.<columnName>.interval.unit 是否匹配分区的分隔符。例如,如果分区按天分隔,则小时范围单位将不起作用。

HIVE_UNKNOWN_ERROR:无法创建输入格式

一个或多个 Glue 分区以不同的格式声明,因为每个 Glue 分区都有自己的特定输入格式。请检查您的分区是如何在 Amazon Glue 中定义的。

HIVE_PARTITION_SCHEMA_MISMATCH

如果分区的架构与表的架构不同,则查询可能会失败,并显示错误消息:HIVE_PARTITION_SCHEMA_MISMATCH。有关更多信息,请参阅同步分区架构以避免“HIVE_PARTITION_SCHEMA_MISMATCH”

SemanticException 表未进行分区,但存在分区规范

如果 CREATE TABLE 语句中没有定义分区,则会发生此错误。有关更多信息,请参阅 Amazon 知识中心的如何解决 Athena 中的错误“失败:SemanticException 表未进行分区,但存在分区规范”?

零字节 _$folder$ 文件

如果您运行 ALTER TABLE ADD PARTITION 语句并错误地指定了已存在的分区和错误的 Simple Storage Service (Amazon S3) 位置,格式为 partition_value_$folder$ 的零字节占位符文件将在 Simple Storage Service (Amazon S3) 中创建。您必须手动移除这些文件。

为了防止这种情况发生,请在 ALTER TABLE ADD PARTITION 语句中使用 ADD IF NOT EXISTS 语法,像这样:

ALTER TABLE table_name ADD IF NOT EXISTS PARTITIION […]

从分区数据返回零条记录

此问题可能由于多个原因引发。有关可能的原因和解决方案,请参阅 Amazon 知识中心的我在 Amazon Athena 中创建了一个具有定义分区的表,但是当我查询表时,返回零条记录

另请参阅 HIVE_TOO_MANY_OPEN_PARTITIONS

权限

查询 Amazon S3 时的访问被拒绝错误

当您没有读取存储桶中数据的权限、写入结果存储桶的权限或 Amazon S3 路径包含区域端点(如 us-east-1.amazonaws.com)时,则可能出现此错误。有关更多信息,请参阅 Amazon 知识中心的 当我运行 Athena 查询时,出现“access denied(访问被拒绝)”错误

对 Amazon S3 中的加密数据运行 DDL 查询时出现 Access denied with status code: 403(访问被拒绝,状态代码:403)错误

如果满足以下条件,则您可能会收到错误消息访问被拒绝(服务:Amazon S3;状态代码:403;错误代码:AccessDenied;请求 ID:<request_id>

  1. 您运行了一个 DDL 查询,如 ALTER TABLE ADD PARTITION 或者 MSCK REPAIR TABLE

  2. 您的存储桶配置了默认加密,并使用 SSE-S3

  3. 存储桶还具有类似以下内容的存储桶策略,该策略强制 PutObject 请求指定 PUT 标题 "s3:x-amz-server-side-encryption": "true""s3:x-amz-server-side-encryption": "AES256"

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::<resource-name>/*", "Condition": { "Null": { "s3:x-amz-server-side-encryption": "true" } } }, { "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::<resource-name>/*", "Condition": { "StringNotEquals": { "s3:x-amz-server-side-encryption": "AES256" } } } ] }

在这种情况下,建议的解决方案是删除上述存储桶策略,因为存储桶的默认加密已经存在。

查询另一个账户中的 Amazon S3 存储桶时,出现 Access denied with status code: 403(访问被拒绝,状态代码:403)错误

尝试查询由另一个 Amazon Web Service 写入的日志,且第二个账户是存储桶拥有者,但不拥有存储桶中的对象时,可能会出现此错误。有关更多信息,请参阅 Amazon 知识中心中的 在另一个账户中查询存储桶时,收到 Amazon Athena 中的 Amazon S3 异常“access denied with status code: 403(访问被拒绝,状态代码:403)”

使用 IAM 角色凭证连接到 Athena JDBC 驱动程序

您可以检索角色的临时凭证,以对 JDBC 与 Athena 的连接进行身份验证。临时凭证的最大生命周期为 12 小时。有关更多信息,请参阅 Amazon 知识中心在使用 JDBC 驱动程序连接到 Athena 时,如何使用我的 IAM 角色凭证或切换到另一个 IAM 角色?

查询语法问题

失败:NullPointerException 名称为空

如果您将 Amazon Glue CreateTable API 操作或 Amazon CloudFormation AWS::Glue::Table 模板创建用于 Athena 的表,而不指定 TableType 属性,然后运行 DDL 查询,如 SHOW CREATE TABLE 或者 MSCK REPAIR TABLE,则您将收到错误消息失败:NullPointerException 名称为空

要纠正该错误,请为 TableInput TableType 属性指定值,使其作为 Amazon Glue CreateTable API 调用或 Amazon CloudFormation 模板的一部分。TableType 可能的值包括 EXTERNAL_TABLEVIRTUAL_VIEW

此要求仅适用于使用 Amazon Glue CreateTable API 操作或 AWS::Glue::Table 模板创建表的情形。如果您适用 DDL 语句或 Amazon Glue 爬网程序为 Athena 创建表,则 TableType 属性将自动定义。

函数未注册

当您尝试使用 Athena 不支持的函数时,会发生此错误。有关 Athena 支持的函数的列表,请参阅 Amazon Athena 中的函数 或在查询编辑器中运行 SHOW FUNCTIONS 语句。您还可以编写自己的用户定义函数 (UDF)。有关更多信息,请参阅 Amazon 知识中心的如何解决 Athena 中的“函数未注册”语法错误?

GENERIC_INTERNAL_ERROR 异常

GENERIC_INTERNAL_ERROR 异常可能有各种原因,包括以下原因:

  • GENERIC_INTERNAL_ERROR: null – 在以下任一情况下,您可能会看到此异常:

    • 表定义中列的数据类型与数据集的实际数据类型之间存在架构不匹配。

    • 正在使用不正确的语法运行 CREATE TABLE AS SELECT (CTAS) 查询。

  • GENERIC_INTERNAL_ERROR: Parent builder is null(GENERIC_INTERNAL_ERROR:父生成器为 null)– 查询其列数据类型为 array 的表,并且正在使用 OpenCSVSerDe 库时,则可能会看到此异常。OpenCSVSerde 格式不支持 array 数据类型。

  • GENERIC_INTERNAL_ERROR:值超过 MAX_INT – 使用数据类型 INT 定义源数据列,并且源数据列中的某个数值大于 2147483647 时,您可能会看到此异常。

  • GENERIC_INTERNAL_ERROR:值超过 MAX_BYTE – 当源数据列的某个数值超过数据类型 BYTE 允许的大小时,您可能会看到此异常。数据类型 BYTE 等同于 TINYINTTINYINT 是一个有符号的 8 位整数,采用二进制补码格式,最小值为 -128,最大值为 127。

  • GENERIC_INTERNAL_ERROR:分区值的数量与筛选条件的数量不匹配 – 如果 Amazon Simple Storage Service(Amazon S3)数据具有不一致的分区,您可能会看到此异常。在以下任一情况下,均可能存在不一致的分区:

    • Amazon S3 上的分区已更改(例如:添加了新分区)。

    • 表中的分区列数与分区元数据中的分区列数不匹配。

有关其中每个错误的更多详细信息,请参阅 Amazon 知识中心中的《当我在 Amazon Athena 中查询表时,如何解决“GENERIC_INTERNAL_ERROR”错误?》。

匹配组的数量与列数不匹配

此错误当您在 CREATE TABLE 语句中使用 Regex SerDe,并且正则表达式匹配组的数量与您为表指定的列数不匹配时,会出现此错误。有关更多信息,请参阅 Amazon 知识中心中的 如何解决 Amazon Athena 中的 RegexSerDe 错误“number of matching groups doesn't match the number of columns(匹配组的数量与列数不匹配)”?

queryString 无法满足约束条件:成员的长度必须小于或等于 262144

Athena 中最大查询字符串长度(262,144 字节)不是可调配额。Amazon Web Services Support 无法为您增加配额,但您可以通过将长查询拆分为较小的查询来解决此问题。有关更多信息,请参阅 Amazon 知识中心的如何增加 Athena 中的最大查询字符串长度?

SYNTAX_ERROR:无法解析列

当您查询由 Amazon Glue 爬虫程序从具有字节顺序标记 (BOM) 的 UTF-8 编码 CSV 文件查询表时,会出现此问题。Amazon Glue 不会识别 BOM 并会将其更改为问号,Amazon Athena 无法识别这些问号。解决方案是删除 Athena 或 Amazon Glue 中的问号。

节流问题

如果您的查询超出了依赖服务(如 Amazon S3、Amazon KMS、Amazon Glue 或者 Amazon Lambda)的限制,则可能会出现以下消息。若要解决这些问题,请减少来自同一账户的并发调用的数量。

服务 错误消息
Amazon Glue AWSGlueException: Rate exceeded.(AWSGlueException:数量超出限制。)
Amazon KMS 您已超过可以调用 KMS 的数量。请降低您的调用频率。
Amazon Lambda

Rate exceeded(数量超出限制)

TooManyRequestsException

Amazon S3 AmazonS3Exception: Please reduce your request rate.(AmazonS3Exception:请降低您的请求率。)

视图

在 Apache Hive shell 中创建的视图在 Athena 中不起作用

由于其实现完全不同,在 Apache Hive shell 中创建的视图与 Athena 不兼容。要解决此问题,请在 Athena 中重新创建视图。

视图已过时;必须重新创建

如果视图下方的表已更改或删除,则可能会收到此错误。解决方法是重新创建视图。有关更多信息,请参阅 Amazon 知识中心的 我怎样才能解决 Athena 中的“view is stale; it must be re-created(视图已过时;必须重新创建)”错误?

工作组

有关工作组问题排查的更多信息,请参阅 工作组故障排除

其他资源

以下页面提供了有关对 Amazon Athena 问题进行故障排除的其他信息。

以下 Amazon 资源也会有所帮助:

故障排除通常需要由专家或多个帮助者进行迭代查询和发现。如果尝试此页面上的建议后仍然遇到问题,请联系 Amazon Web Services Support [在 Amazon Web Services Management Console 中,单击 Support(支持)、Support Center(支持中心)] 或使用 Amazon Athena 标签在 Amazon re:Post 上提问。