Databricks中如何从一个S3账号读取数据并写入另一个S3账号
问题原因
你之前的切换操作不生效的核心原因是:Spark运行时Hadoop配置会在会话初始化后分发到所有Executor节点,且S3A文件系统客户端默认会缓存已申请的STS临时角色凭证,你后续仅修改Driver端的全局Hadoop配置,既不会同步更新Executor端的已缓存配置,也不会清空S3A客户端缓存的旧角色凭证,因此切换不生效。
可行解决方案
方案1:按桶配置独立角色(最优,无需中途切换)
直接为两个不同账号的S3桶分别绑定对应角色配置,S3A客户端访问对应桶时会自动匹配专属配置,无需中途修改全局参数:
# 为账号A的桶配置跨账号访问角色 sc._jsc.hadoopConfiguration().set("fs.s3a.bucket.BUCKET_IN_ACCOUNT_A.credentialsType", "AssumeRole") sc._jsc.hadoopConfiguration().set("fs.s3a.bucket.BUCKET_IN_ACCOUNT_A.stsAssumeRole.arn", XACCOUNT_ROLE) sc._jsc.hadoopConfiguration().set("fs.s3a.bucket.BUCKET_IN_ACCOUNT_A.acl.default", "BucketOwnerFullControl") # 为账号B的桶配置默认访问角色 sc._jsc.hadoopConfiguration().set("fs.s3a.bucket.BUCKET_IN_ACCOUNT_B.credentialsType", "AssumeRole") sc._jsc.hadoopConfiguration().set("fs.s3a.bucket.BUCKET_IN_ACCOUNT_B.stsAssumeRole.arn", ROLE_B) sc._jsc.hadoopConfiguration().set("fs.s3a.bucket.BUCKET_IN_ACCOUNT_B.acl.default", "BucketOwnerFullControl") # 直接执行读写操作即可 df = spark.read.option("multiline","true").json(BUCKET_IN_ACCOUNT_A) df.write.format("delta").mode("append").save(BUCKET_IN_ACCOUNT_B)
配置中的
BUCKET_IN_ACCOUNT_A、BUCKET_IN_ACCOUNT_B需替换为实际的S3桶名称。
方案2:关闭角色凭证缓存后切换全局配置
如果必须中途切换全局角色,需要在会话初始化阶段先关闭S3A的角色凭证缓存,后续修改的全局配置才会生效:
# 初始化SparkSession后第一时间添加该配置,关闭STS凭证缓存 sc._jsc.hadoopConfiguration().set("fs.s3a.assumed.role.credential.cache.max.size", "0") # 第一步:使用跨账号角色读取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) # 第二步:切换为ROLE_B写入B桶 sc._jsc.hadoopConfiguration().set("fs.s3a.stsAssumeRole.arn", ROLE_B) df.write.format("delta").mode("append").save(BUCKET_IN_ACCOUNT_B)
内容的提问来源于stack exchange,提问作者jencake
相关产品推荐
相关产品推荐

