写入Parquet地板而不是csv时,datasink写入失败

yiytaume  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(408)

我有下面一行代码

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"
    ]

有什么想法吗?这太奇怪了

iyfjxgzm

iyfjxgzm1#

问题就在这里。我已授权该角色只能访问某些文件夹,即。

bucket/toplevelfolder/subfolder*

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/

相关问题