【发布时间】:2021-10-15 17:28:57
【问题描述】:
我在 Amazon Redshift 中有一个外部表:
create external table ruben.ruben_manifest_test
(
customer_id bigint,
external_cust_id varchar(30)
)
row format serde 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
with serdeproperties('serialization.format'='1')
stored as
inputformat 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
outputformat 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
location 's3://mybucket/folder1/redshift_external_table_location.txt';
位置redshift_external_table_location.txt是一个清单文件,内容如下:
{
"entries": [
{ "url": "s3://mybucket/folder2/file1.parquet",
"meta": { "content_length": 8059990 } }
]
}
当我select count(*) from ruben.ruben_manifest_test 时,我得到:
Spectrum Scan Error. Forbidden: HTTP response error code: 403 Message: AccessDenied Access Denied
x-amz-request-id: HBM2Q5DVA4WD7YJE
x-amz-id-2: OX8Z9+4NaKFLuDoQ7dWfAgtOy6KAN2ld+y2ksTo3Ela5xtgjonOQLEWdiZ5YuFq+PFNkSDfzOPs= (s3://mybucket/folder2/file1.parquet)
显然 Redshift 能够读取清单文件(并获取 parquet 文件的 s3 uri),但由于Access Denied,它无法读取 parquet 文件。
如果我使用alter table ruben.ruben_manifest_test set location 's3://mybucket/folder2/' 将外部表的位置更改为指向包含镶木地板文件的文件夹,那么select 将起作用。我认为这意味着至少当位置是文件夹时,redshift 能够正常读取镶木地板文件,由于某种原因,当文件从清单文件中列出时它不起作用。
但我不明白使用什么凭据来获取 parquet 文件,因为与 redshift 集群关联的 iam 角色肯定能够读取这些文件。据我了解select * from svv_external_schemas 的输出是外部架构ruben 的IAM 角色是arn:aws:iam::xxxxxxx:role/mySpectrumRole,其策略允许glue:* 和lakeformation:GetDataAccess。在 AWS LakeFormation 中 mySpectrumRole 可以访问数据位置 s3://mybucket/*
对可能是什么原因或如何解决问题有任何想法吗?具体来说,有什么方法可以查看第二个 S3 请求(用于 parquet 文件的那个)使用了哪个 iam 角色?
在我看来,Redshift 要求 LakeFormation (GetDataAccess) 提供凭据,将凭据缩小到仅访问表位置(这只是一个清单文件),而不是获取对清单和数据都有效的凭据文件。
【问题讨论】:
标签: amazon-redshift amazon-redshift-spectrum