我有下面一行代码
val datasink3 = glueContext
.getSinkWithFormat(
connectionType = "s3",
options = JsonOptions(Map("path" -> outputPath)),
format = "parquet",
transformationContext = "datasink3")
.writeDynamicFrame(repartitionedDataSource3)
此写入操作失败
Exception in User Class: com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception : Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: 9K7H4CDMRM3AM51H; S3 Extended Request ID: DgRwQ8tvq2FjlmVJ4GkBjYW5xwN8lMYtoStvpe8zRr+bSx0pwcybYDSuZYXXJN0pF1pWHiziuAI=)
但是,如果我将写入切换到
val datasink3 = glueContext
.getSinkWithFormat(
connectionType = "s3",
options = JsonOptions(Map("path" -> outputPath)),
format = "csv",
transformationContext = "datasink3")
.writeDynamicFrame(repartitionedDataSource3)
它起作用了!我勒个去!
iam策略具有以下PERM,没有任何资源级别权限限制文件类型
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:ListBucket",
"s3:DeleteObject"
]
有什么想法吗?这太奇怪了
1条答案
按热度按时间iyfjxgzm1#
问题就在这里。我已授权该角色只能访问某些文件夹,即。
glue使用spark作为引擎盖下的etl引擎。因此,粘合作业试图在路径“s3://bucket/(写入实际目标之前)中创建名为“toplevelfolder%24folder%24”的spark占位符对象,角色无权访问该占位符对象。
通过简单地在这个特定路径“s3://bucket/*”上添加s3权限,角色能够在访问spark(粘合作业)输出数据的前缀之前写入必要的占位符对象。
这只发生在Parquet文件中,因为当我们编写Parquet时,默认情况下它会创建带有s3/s3n的临时文件夹。这是由于中提到的emrfs实施
https://aws.amazon.com/premiumsupport/knowledge-center/emr-s3-empty-files/