【问题标题】:How to read from one s3 account and write to another in Databricks如何在 Databricks 中从一个 s3 帐户读取并写入另一个帐户
【发布时间】:2021-12-18 10:13:13
【问题描述】:

我的集群配置为使用 ROLE_B,这使我可以访问 BUCKET_IN_ACCOUNT_B,但不能访问 BUCKET_IN_ACCOUNT_A。所以我假设 XACCOUNT_ROLE 可以访问 BUCKET_IN_ACCOUNT_A。以下代码可以正常工作。

sc._jsc.hadoopConfiguration().set("fs.s3a.credentialsType", "AssumeRole")
sc._jsc.hadoopConfiguration().set("fs.s3a.stsAssumeRole.arn", XACCOUNT_ROLE)
sc._jsc.hadoopConfiguration().set("fs.s3a.acl.default", "BucketOwnerFullControl")

df = spark.read.option("multiline","true").json(BUCKET_IN_ACCOUNT_A)

但是,当我尝试将此数据帧写回 BUCKET_IN_ACCOUNT_B 如下所示时,我得到 java.nio.file.AccessDeniedException。

df.write \
  .format("delta") \
  .mode("append") \
  .save(BUCKET_IN_ACCOUNT_B)

我认为是这种情况,因为我的 spark 集群仍然配置为使用 XACCOUNT_ROLE。我的问题是,如何切换回 ROLE_B?

sc._jsc.hadoopConfiguration().set("fs.s3a.credentialsType", "AssumeRole")
sc._jsc.hadoopConfiguration().set("fs.s3a.stsAssumeRole.arn", ROLE_B)
sc._jsc.hadoopConfiguration().set("fs.s3a.acl.default", "BucketOwnerFullControl")

没用。

【问题讨论】:

  • 不确定 Databricks,但更简单的方法是请运行账户 B 的好心人将桶 B 的访问权限授予您通常使用的 IAM 角色。这样,它可以访问两个帐户中的存储桶。他们需要向存储桶 B添加存储桶策略,从账户 A 向您的 IAM 角色授予适当的权限。

标签: amazon-web-services apache-spark amazon-s3 databricks


【解决方案1】:

我最终没有找到再次切换集群角色的方法。但我确实想出了另一种方法来完成从一个 s3 存储桶读取并写入另一个存储桶。基本上,我挂载了 XACCOUNT 存储桶,并且能够写入 BUCKET_IN_ACCOUNT_B 而不必干扰集群的角色。

dbutils.fs.unmount("/mnt/MOUNT_LOCATION")
dbutils.fs.mount(BUCKET_IN_ACCOUNT_A, "/mnt/MOUNT_LOCATION",
  extra_configs = {
    "fs.s3a.credentialsType": "AssumeRole",
    "fs.s3a.stsAssumeRole.arn": XACCOUNT_ROLE,
    "fs.s3a.acl.default": "BucketOwnerFullControl"
  }
)

df = spark.read.option("multiline","true").json("/mnt/MOUNT_LOCATION")
df.write \
  .format("delta") \
  .mode("append") \
  .save(BUCKET_IN_ACCOUNT_B)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    相关资源
    最近更新 更多