【问题标题】:Redshift spectrum can read read the the manifest file (for external table) but not the actual files?红移光谱可以读取清单文件(用于外部表)但不能读取实际文件?
【发布时间】: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


    【解决方案1】:

    AWS Service Integration with Lake Formation 说:

    支持使用清单的查询。

    因此,如果清单或数据文件位于 AWS LakeFormation 中已注册的数据湖位置,那么您不能拥有一个位置为清单文件的 Redshift Spectrum 外部表。

    可惜了

    • 这似乎记录在 Lake Formation 文档中,而不记录在 Redshift 文档中(我通过 [将 Redshift Spectrum 与 A​​WS Lake Formation 一起使用][2] 中的反馈按钮询问他们添加了提及Lake Formation 不支持 manifest)
    • Redshift 无法识别这是一个不受支持的情况,因此错误消息没有提及

    【讨论】:

      【解决方案2】:

      我认为问题在于 LOCATION 参数是文件夹或清单文件,而不是数据文件。根据 AWS docs LOCATION 是“包含数据文件的 S3 存储桶或文件夹或包含 Amazon S3 对象路径列表的清单文件”。见https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_TABLE.html

      【讨论】:

      • 如 OP 中所述,位置参数 is 是一个清单文件,您可以在 OP 中看到 redshift 似乎正确解析的内容,因为 AccessDenied 提到了数据清单中引用的文件
      猜你喜欢
      • 1970-01-01
      • 2015-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多