我在 Amazon Athena 上使用了 Apache Iceberg 表,并收到了错误消息。
解决方法
对于收到的错误消息,请按照以下故障排除步骤进行操作。
不支持的表属性键
当 CREATE TABLE 或 ALTER TABLE 语句的 TBLPROPERTIES 子句不使用支持的表属性时,就会出现此错误。Athena 仅允许表属性中预定义的键值对列表来创建或更改 Iceberg 表。
要解决此错误,请确保您的 Iceberg 表使用支持的表属性。
无法生成 CREATE TABLE 语句,因为表具有不支持的属性
当 Athena 无法重现表结构时,使用带有 Iceberg 表的 DDL 语句 SHOW CREATE TABLE 的查询会出现此错误。使用 DDL 语句 DESCRIBE FORMATTED 以显示表属性,而不是 SHOW CREATE TABLE。
TABLE_REDIRECTION_ERROR
此错误发生在使用不受支持的 Iceberg 表元数据的 Athena SELECT 查询中。确保您的 Athena SELECT 查询包含支持的 Iceberg 表元数据。
NOT_SUPPORTED: Iceberg 不支持的类型
在 Iceberg 表中使用不支持的数据类型时会出现此错误。例如,Iceberg 表不支持 Athena 数据类型 tinyint、smallint 和 char。确保您的 Athena 查询使用 Iceberg 表支持的数据类型。
ICEBERG_COMMIT_ERROR
当多个语句尝试更改在并行 Iceberg 表更新中运行的同一组文件时,可能会出现此错误。例如,当多个 DELETE 语句并行运行并尝试同时删除同一组记录时,就会出现此错误。
要避免此错误,请执行以下操作:
- 确保查询更新按顺序运行,以避免并行数据处理。
- 对 Iceberg 表进行分区,以便将并行更新应用于不同的分区,从而将文件分组到特定的分区。
- 在更新 Iceberg 表时实施指数回退的重试机制。
**注意:**Athena 仅支持 AWS Glue 乐观锁。当您使用其他锁定方法修改 Iceberg 表时,可能会导致数据丢失并中断交易。
有关详细信息,请参阅 Apache Iceberg 网站上的乐观锁。
GENERIC_INTERNAL_ERROR: 无法在 v1 表中写入删除文件
当您尝试对 Iceberg v1 表执行 DELETE(删除)操作时,会出现此错误。Athena 仅在 Iceberg v2 表上创建和操作。
确保您的 Iceberg 表使用的是 Athena 引擎版本 2。如果您使用除 Athena 之外的其他引擎,请确保将表属性“format-version”设置为“2”以允许行级别删除。例如,在编写 Iceberg 表并将其注册到 AWS Glue Data Catalog 时,请确保您的表使用版本 2。
有关详细信息,请参阅 Apache Iceberg 网站上的删除格式。
GENERIC_INTERNAL_ERROR: com.facebook.presto.spi.PrestoException: 指定的密钥不存在
当删除诸如清单列表或 metadata.json 文件之类的元数据文件时,就会出现此错误,这会导致 Athena 查询失败。如果您无法成功恢复文件,请将表回滚到快照或时间戳。
**注意:**您必须在 Spark 环境(如 AWS Glue 或 Amazon EMR)中回滚表,而不是 Athena 查询编辑器。
要将表回滚到特定的快照 ID,请运行 Apache Iceberg 命令 roll_to_snapshot,如下所示:
CALL catalog_name.system.rollback_to_snapshot('your-db.your-table', your-snapshot-id)
**注意:**将 your-db、your-table 和 your-snapshot-id 替换为您的变量。
要将表回滚到特定的时间戳,请运行 Apache Iceberg 命令 rollback_to_timestamp,如下所示:
CALL catalog_name.system.rollback_to_timestamp('your-db.your-table', TIMESTAMP 'yyyy-MM-dd HH:mm:ss')
**注意:**将 your-db、your-table 和 yyyy-MM-dd HH:mm:ss 替换为您的变量。
有关详细信息,请参阅 Apace Iceberg 网站上的 rollback_to_snapshot 和 rollback_to_timestamp。
相关信息
在 Athena 中进行故障排除
如何在 Spark 中将 Apache Iceberg 与跨账户 AWS Glue Data Catalog 配合使用?
使用 Apache Iceberg 表