从其他帐户s3读取并写入我的帐户s3

时间:2018-11-09 10:02:35

标签: amazon-web-services amazon-s3 amazon-iam

我有spark作业,需要从其他帐户**(数据帐户)**中的s3中读取数据并处理该数据。

处理完毕后,应写回我帐户中的s3。

因此,我在Spark会话中如下配置了“数据帐户” 的访问权限和密钥

val hadoopConf=sc.hadoopConfiguration
hadoopConf.set("fs.s3a.access.key","DataAccountKey")
hadoopConf.set("fs.s3a.secret.key","DataAccountSecretKey") 
hadoopConf.set("fs.s3a.endpoint", "s3.ap-northeast-2.amazonaws.com")
System.setProperty("com.amazonaws.services.s3.enableV4", "true")

val df = spark.read.json("s3a://DataAccountS/path")
/* Reading is success */

df.take(3).write.json("s3a://myaccount/test/")

此阅读很好,但是写时我遇到了错误。

com.amazonaws.services.s3.model.AmazonS3Exception: Status Code: 301, AWS Service: Amazon S3, AWS Request ID: A5E574113745D6A0, AWS Error Code: PermanentRedirect, AWS Error Message: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.

但是如果我不配置“数据帐户”的详细信息,并尝试将一些虚假数据从spark写入我的s3,则可以正常工作。

所以我应该如何配置以同时从不同的帐户s3读取和写入我的帐户s3

1 个答案:

答案 0 :(得分:0)

如果您的spark类路径启用了hadoop-2.7 JAR,则可以使用“路径中的秘密”作为技术,因此可以使用s3a://DataAccountKey:DataAccountSecretKey/DataAccount/path之类的URL。请注意,这会记录到处的秘密。

Hadoop 2.8+ JAR会告诉您在任何地方记录您的秘密,但会添加每个存储桶绑定

spark.hadoop.fs.s3a.bucket.DataAccount.access.key DataAccountKey spark.hadoop.fs.s3a.bucket.DataAccount.secret.key DataAccountSecretKey spark.hadoop.fs.s3a.bucket.DataAccount.endpoint s3.ap-northeast-2.amazonaws.com

然后,对于与该存储桶的所有互动,这些每个存储桶的选项将覆盖主要设置。

注意:如果要使用此功能,不要以为将hadoop-aws-2.8.jar放入类路径中是可行的,只会得到类路径错误。所有hadoop- * JAR都需要升级到2.8,并且aws-sdk也需要更新。