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

Amazon Redshift Spectrum 中的查询故障排除

接下来,您可以找到一个快速参考,该参考确定并解决了您可能遇到的有关 Amazon Redshift Spectrum 查询的一些常见问题。要查看 Redshift Spectrum 查询生成的错误,请查询 SVL_S3LOG 系统表。

超过了重试次数

如果 Amazon Redshift Spectrum 请求超时,将取消并重新提交请求。在 5 次重试失败之后,查询将失败并返回以下错误。

error:  Spectrum Scan Error: Retries exceeded

可能的原因包括:

  • 文件大小过大 (大于 1 GB)。检查您在 Amazon S3 中的文件大小并查找大文件和文件大小偏斜。将大文件分成若干个大小在 100 MB 和 1 GB 之间的小文件。尝试使文件的大小大致相同。

  • 网络吞吐量低。稍后尝试您的查询。

访问受限制

Amazon Redshift Spectrum 受其他 Amazon 服务的服务配额的限制。在高使用率下,Redshift Spectrum 请求可能需要降低速度,这会导致以下错误。

error:  Spectrum Scan Error: Access throttled

可能存在两种类型的限制:

  • Amazon S3 限制的访问权限。

  • 访问受 Amazon KMS 限制。

错误上下文提供了有关限制类型的更多详细信息。在下文中,您可以找到此限制的原因和可能的解决方案。

Amazon S3 限制的访问权限

如果对某个前缀的读取请求速率太高,Amazon S3 可能会限制 Redshift Spectrum 请求。有关您可以在 Amazon S3 中达到的 GET/HEAD 请求速率的信息,请参阅 Amazon Simple Storage Service 开发人员指南中的优化 Amazon S3 性能。Amazon S3 GET/HEAD 请求速率会考虑前缀上的所有 GET/HEAD 请求,因此,访问同一前缀的不同应用程序共享总请求速率。

如果 Redshift Spectrum 请求经常受到 Amazon S3 的限制,请减少 Redshift Spectrum 向 Amazon S3 发出的 Amazon S3 GET/HEAD 请求的数量。为此,请尝试将小文件合并为大文件。我们建议使用大小为 64 MB 或更大的文件。

还可以考虑对 Redshift Spectrum 表进行分区,以便从早期筛选中受益,并减少在 Amazon S3 中访问的文件数。有关更多信息,请参阅对 Redshift Spectrum 外部表进行分区

访问受 Amazon KMS 限制

如果您使用服务器端加密(SSE-S3 或 SSE-KMS)将数据存储在 Amazon S3 中,则 Amazon S3 将为 Redshift Spectrum 访问的每个文件向 Amazon KMS 发起 API 操作。这些请求将计入您的加密操作配额;有关更多信息,请参阅 Amazon KMS 请求配额。有关 SSE-S3 和 SSE-KMS 的更多信息,请参阅 Amazon Simple Storage Service 开发人员指南中的使用服务器端加密保护数据通过 Amazon KMS 中存储的 CMK 使用服务器端加密来保护数据

减少 Redshift Spectrum 向 Amazon KMS 发出的请求数的第一步是减少访问的文件数。为此,请尝试将小文件合并为大文件。我们建议使用大小为 64 MB 或更大的文件。

如果您的 Redshift Spectrum 请求经常受到 Amazon KMS 的限制,请考虑请求增加加密操作的 Amazon KMS 请求速率的配额。要请求提高配额,请参阅 Amazon Web Services 一般参考中的 Amazon 服务限制

超出资源限制

Redshift Spectrum 对请求可使用的内存量强制实施上限。需要更多内存的 Redshift Spectrum 请求将失败,并导致以下错误。

error:  Spectrum Scan Error: Resource limit exceeded

以下两个常见原因可能会导致 Redshift Spectrum 请求超出其内存限额:

  • Redshift Spectrum 处理大量无法拆分成小型数据块的数据。

  • 大型聚合步骤由 Redshift Spectrum 处理。

我们建议使用支持拆分大小为 128 MB 或更小的并行读取的文件格式。请参阅为 Amazon Redshift Spectrum 中的查询创建数据文件以了解支持的文件格式以及数据文件创建的通用指南。在使用不支持并行读取的文件格式或压缩算法时,我们建议将文件大小保持在 64 MB 和 128 MB 之间。

未返回分区表的行

如果您的查询未返回已分区外部表中的任何行,请检查是否已为此外部表添加分区。Redshift Spectrum 仅扫描位于已使用 ALTER TABLE … ADD PARTITION 显式添加的 Amazon S3 位置的文件。查询 SVV_EXTERNAL_PARTITIONS 视图以查找现有分区。为每个丢失的分区运行 ALTER TABLE … ADD PARTITION

未授权错误

验证集群的 IAM 角色是否允许访问 Amazon S3 文件对象。如果您的外部数据库在 Amazon Athena 上,请验证 IAM 角色是否允许访问 Athena 资源。有关更多信息,请参阅适用于 Amazon Redshift Spectrum 的 IAM 策略

数据格式不兼容

对于列式文件格式(例如 Apache Parquet)列类型嵌有数据。CREATE EXTERNAL TABLE 定义中的列类型必须与数据文件的列类型匹配。如果存在不匹配的情况,您会收到类似以下内容的错误:

File 'https://s3bucket/location/file has an incompatible Parquet schema for column ‘s3://s3bucket/location.col1'. Column type: VARCHAR, Par

由于消息长度存在限制,错误消息可能会被截断。要检索完整的错误消息 (包括列名和列类型),请查询 SVL_S3LOG 系统视图。

以下示例查询上次执行的查询的 SVL_S3LOG。

select message from svl_s3log where query = pg_last_query_id() order by query,segment,slice;

以下是显示完整错误消息的结果的示例。

                            message
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
Spectrum Scan Error. File 'https://s3bucket/location/file has an incompatible
Parquet schema for column ' s3bucket/location.col1'. 
Column type: VARCHAR, Parquet schema:\noptional int64 l_orderkey [i:0 d:1 r:0]\n

要更正该错误,请将外部表修改为与 Parquet 文件的列类型匹配。

在 Amazon Redshift 中使用 Hive DDL 时遇到语法错误

对于 CREATE EXTERNAL TABLE,Amazon Redshift 支持与 Hive DDL 类似的数据定义语言 (DDL)。但是,这两种类型的 DDL 并不总是完全相同。如果您复制 Hive DDL 以创建或修改 Amazon Redshift 外部表,则可能遇到语法错误。下面是 Amazon Redshift 和 Hive DDL 之间的差别的示例:

  • Amazon Redshift 需要单引号 ('),而 Hive DDL 支持双引号 (")。

  • Amazon Redshift 不支持 STRING 数据类型。请改用 VARCHAR。

创建临时表的权限

要运行 Redshift Spectrum 查询,数据库用户必须有权在数据库中创建临时表。以下示例将数据库 spectrumdb 的临时权限授予 spectrumusers 用户组。

grant temp on database spectrumdb to group spectrumusers;

有关更多信息,请参阅GRANT