调用o91.getDynamicFrame时发生错误.没有这样的文件或目录



使用AWSGlueServiceRole,我创建了一个Glue作业,将拼花文件从一个S3桶映射到另一个桶。当我尝试运行作业时,我收到以下异常:

"调用o91.getDynamicFrame时出错。没有这样的文件或目录's3://BUCKET/PATH/TO/file .parquet'">

根据我的检查,文件存在。我的第一个想法是,这可能是一个权限问题,所以我试着在我的本地机器上使用boto3获取对象,并得到了文件:

import io
import pandas as pd
s3_client = boto3.client('s3')
obj = s3_client.get_object(Bucket='BUCKET', Key='2022/05/24/08/PATH/TO/FILE.parquet')
print(pd.read_parquet(io.BytesIO(obj['Body'].read())))
------------------ Output bellow ------------------
id  val1           val2  val3
0     model2    0.612707     None  [[2.1931596, 1.5204412, 1.4174217, 1.6540076, ...
1     model2    0.972054     None  [[1.8610013, 2.1553798], [1.8610013, 2.1553798...
2     model2    0.526641     None  [[1.3793343, 1.430331, 2.1639223], [1.3793343,...
3     model2    0.927919     None  [[2.10741, 1.5591071, 2.1414866, 2.920107], [2...
4     model2    0.243281     None  [[1.2257551, 1.515327, 2.0952048, 1.1441619], ...

我错过了什么?

您需要对桶及其对象具有以下权限:

statement {
effect = "Allow"
actions = [
"s3:Get*",
"s3:Put*"
]
resources = [
"arn:aws:s3:::<BUCKET>",
"arn:aws:s3:::<BUCKET>/*",
]
}

我同意错误信息令人困惑和误导。原因是,作为一个托管服务,Glue首先做了一个"列表"。S3位置上的操作,然后将结果提供给getDynamicFrame。因此,当它接收到AccessDenied错误(但不知何故没有显示给我们)和一个空的"列表"时,getDynamicFrame只是简单地引发No such file or directory错误。总之,他们应该在错误处理方面做得更好。

最新更新